polytypo 1.4.0 → 1.4.1
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/{chunk-GJJNGBRH.cjs → chunk-3ONFVTKE.cjs} +4 -4
- package/dist/{chunk-GJJNGBRH.cjs.map → chunk-3ONFVTKE.cjs.map} +1 -1
- package/dist/{chunk-HTWCCPWI.js → chunk-4CONSHBE.js} +4 -4
- package/dist/{chunk-UL7KCRXN.js → chunk-5VQSIDY6.js} +3 -3
- package/dist/{chunk-BGTMX6VS.js → chunk-6QL6N5G5.js} +2 -2
- package/dist/chunk-BF7NY7GO.js +5828 -0
- package/dist/chunk-BF7NY7GO.js.map +1 -0
- package/dist/{chunk-6PQMYL2O.cjs → chunk-EAHREH2D.cjs} +3 -3
- package/dist/{chunk-6PQMYL2O.cjs.map → chunk-EAHREH2D.cjs.map} +1 -1
- package/dist/{chunk-MOXBMEZB.cjs → chunk-FPHGXDAR.cjs} +13 -13
- package/dist/{chunk-MOXBMEZB.cjs.map → chunk-FPHGXDAR.cjs.map} +1 -1
- package/dist/chunk-HHMITBTB.cjs +33 -0
- package/dist/{chunk-JYHDIVON.cjs.map → chunk-HHMITBTB.cjs.map} +1 -1
- package/dist/{chunk-DCC5OQET.cjs → chunk-K4ZF3RDH.cjs} +16 -16
- package/dist/{chunk-DCC5OQET.cjs.map → chunk-K4ZF3RDH.cjs.map} +1 -1
- package/dist/chunk-K5CSTJE2.cjs +31 -0
- package/dist/{chunk-QLIPSKVZ.cjs.map → chunk-K5CSTJE2.cjs.map} +1 -1
- package/dist/chunk-NEUH35JH.cjs +5828 -0
- package/dist/chunk-NEUH35JH.cjs.map +1 -0
- package/dist/{chunk-FZ6YRCGR.cjs → chunk-NFFM6OBH.cjs} +17 -17
- package/dist/{chunk-FZ6YRCGR.cjs.map → chunk-NFFM6OBH.cjs.map} +1 -1
- package/dist/{chunk-47QVJOT4.js → chunk-OPGIEVOR.js} +2 -2
- package/dist/{chunk-NLMP3JVF.js → chunk-Q5XENI33.js} +2 -2
- package/dist/{chunk-GPOCFMTF.js → chunk-RJGBWBR4.js} +4 -4
- package/dist/{chunk-D3QQYGKW.js → chunk-YGI76J7W.js} +2 -2
- package/dist/{errors-DMxY1LlK.d.cts → errors-C1_sHGgx.d.cts} +8 -1
- package/dist/{errors-DMxY1LlK.d.ts → errors-C1_sHGgx.d.ts} +8 -1
- package/dist/html.cjs +10 -10
- package/dist/html.d.cts +2 -2
- package/dist/html.d.ts +2 -2
- package/dist/html.js +5 -5
- package/dist/index.cjs +17 -17
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +7 -7
- package/dist/markdown.cjs +10 -10
- package/dist/markdown.d.cts +2 -2
- package/dist/markdown.d.ts +2 -2
- package/dist/markdown.js +5 -5
- package/dist/text.cjs +8 -8
- package/dist/text.d.cts +2 -2
- package/dist/text.d.ts +2 -2
- package/dist/text.js +3 -3
- package/dist/yaml.cjs +9 -9
- package/dist/yaml.d.cts +2 -2
- package/dist/yaml.d.ts +2 -2
- package/dist/yaml.js +4 -4
- package/package.json +1 -1
- package/dist/chunk-25RYOB5K.js +0 -5828
- package/dist/chunk-25RYOB5K.js.map +0 -1
- package/dist/chunk-JYHDIVON.cjs +0 -33
- package/dist/chunk-PJ6HB77G.cjs +0 -5828
- package/dist/chunk-PJ6HB77G.cjs.map +0 -1
- package/dist/chunk-QLIPSKVZ.cjs +0 -31
- /package/dist/{chunk-HTWCCPWI.js.map → chunk-4CONSHBE.js.map} +0 -0
- /package/dist/{chunk-UL7KCRXN.js.map → chunk-5VQSIDY6.js.map} +0 -0
- /package/dist/{chunk-BGTMX6VS.js.map → chunk-6QL6N5G5.js.map} +0 -0
- /package/dist/{chunk-47QVJOT4.js.map → chunk-OPGIEVOR.js.map} +0 -0
- /package/dist/{chunk-NLMP3JVF.js.map → chunk-Q5XENI33.js.map} +0 -0
- /package/dist/{chunk-GPOCFMTF.js.map → chunk-RJGBWBR4.js.map} +0 -0
- /package/dist/{chunk-D3QQYGKW.js.map → chunk-YGI76J7W.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/engine/codepoints.ts","../src/generated/locales.ts","../src/engine/locale.ts","../src/engine/narrow-target.ts","../src/engine/letter-ranges.json","../src/engine/unicode.ts","../src/engine/sentinels.ts","../src/rules/apostrophe.ts","../src/rules/dash-shared.ts","../src/rules/dashes.ts","../src/rules/ellipsis.ts","../src/rules/hyphen.ts","../src/rules/nbsp.ts","../src/rules/quote-ambiguity.ts","../src/rules/quotes.ts","../src/rules/ranges.ts","../src/rules/spaces.ts","../src/rules/symbols.ts","../src/rules/registry.ts","../src/engine/edits.ts","../src/engine/origin.ts","../src/engine/rule-runner.ts"],"sourcesContent":["export type PolytypoErrorCode =\n | \"POLYTYPO_UNKNOWN_LOCALE\"\n | \"POLYTYPO_INVALID_MODE\"\n | \"POLYTYPO_INVALID_DIALECT\"\n | \"POLYTYPO_UNKNOWN_RULE\"\n | \"POLYTYPO_MALFORMED_LOCALE_DATA\"\n | \"POLYTYPO_RULE_CONTRACT\"\n | \"POLYTYPO_MALFORMED_INPUT\"\n | \"POLYTYPO_INVALID_OPTION\";\n\n/** Codes are the contract across all five runtimes; messages are English and are not (ARCHITECTURE.md 4.6). */\nexport class PolytypoError extends Error {\n readonly code: PolytypoErrorCode;\n\n constructor(code: PolytypoErrorCode, message: string) {\n super(message);\n this.name = \"PolytypoError\";\n this.code = code;\n }\n}\n","/**\n * The engine indexes Unicode code points, never UTF-16 units: a JS string, a Go string and a\n * PHP string disagree about \"characters\" outside the BMP (ARCHITECTURE.md 4.2). Conversion\n * happens once on entry and once on exit.\n *\n * Unpaired surrogates are carried through as their own code point, so text that is not\n * well-formed UTF-16 still round-trips byte-for-byte instead of being silently repaired.\n */\nexport function toCodePoints(input: string): number[] {\n const out: number[] = [];\n const len = input.length;\n let i = 0;\n while (i < len) {\n const unit = input.charCodeAt(i);\n if (unit >= 0xd800 && unit <= 0xdbff && i + 1 < len) {\n const next = input.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n out.push((unit - 0xd800) * 0x400 + (next - 0xdc00) + 0x10000);\n i += 2;\n continue;\n }\n }\n out.push(unit);\n i += 1;\n }\n return out;\n}\n\nconst CHUNK = 4096;\n\nexport function fromCodePoints(cp: readonly number[]): string {\n if (cp.length === 0) return \"\";\n if (cp.length <= CHUNK) return String.fromCodePoint(...cp);\n let out = \"\";\n for (let i = 0; i < cp.length; i += CHUNK) {\n out += String.fromCodePoint(...cp.slice(i, i + CHUNK));\n }\n return out;\n}\n\nexport function isValidCodePoint(value: number): boolean {\n return Number.isInteger(value) && value >= 0 && value <= 0x10ffff;\n}\n","// Generated by scripts/gen-locales.mjs — do not edit. Run `npm run gen`.\n// Source: spec/locales/*.json + spec/locales/registry.json\n\nimport type { LocaleData } from \"../types.js\";\n\nexport const SPEC_VERSION = \"1.4.0\";\n\nexport const KNOWN_LOCALES: readonly string[] = [\n \"cs\",\n \"de-CH\",\n \"de-DE\",\n \"el\",\n \"en-GB\",\n \"en-US\",\n \"es\",\n \"fi\",\n \"fr\",\n \"fr-CA\",\n \"it\",\n \"nl\",\n \"pl\",\n \"pt-BR\",\n \"pt-PT\",\n \"ru\",\n \"sv\",\n \"uk\",\n];\n\nexport const ALIASES: Readonly<Record<string, string>> = {\n de: \"de-DE\",\n en: \"en-US\",\n pt: \"pt-PT\",\n};\n\nexport const LOCALES: Readonly<Record<string, LocaleData>> = {\n cs: { locale: \"cs\", name: \"Czech\", quotes: { primary: { open: \"\\u201E\", close: \"\\u201C\", innerSpace: \"none\" }, secondary: { open: \"\\u201A\", close: \"\\u2018\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [\"a\", \"i\", \"k\", \"o\", \"s\", \"u\", \"v\", \"z\"], abbreviations: [\"a. s.\", \"s. r. o.\"], beforeUnits: [\"%\", \"\\u00B0C\", \"ha\", \"kg\", \"km\", \"cm\", \"mm\", \"m\\u00B2\", \"kWh\", \"km/h\", \"str.\", \"hod.\"], beforeNumber: [], beforeWord: [\"tj.\", \"tzv.\", \"tzn.\"], afterSymbols: [\"\\u00A7\"], initialBinding: \"single\" }, sources: [{ rule: \"quotes\", cite: \"\\u00DAstav pro jazyk \\u010Desk\\u00FD AV \\u010CR, Internetov\\u00E1 jazykov\\u00E1 p\\u0159\\u00EDru\\u010Dka, \\u00ABUvozovky\\u00BB: \\u00ABV \\u010De\\u0161tin\\u011B u\\u017E\\u00EDv\\u00E1me r\\u016Fzn\\u00E9 varianty uvozovek: dvojit\\u00E9 \\u201E \\u201C, jednoduch\\u00E9 \\u201A \\u2018 a bo\\u010Dn\\u00ED \\u00BB \\u00AB\\u00BB; \\u00ABJako z\\u00E1kladn\\u00ED se doporu\\u010Duj\\u00ED uvozovky typu 99 66, tj. dvojit\\u00E9 \\u201E \\u201C\\u00BB; \\u00ABOstatn\\u00ED typy uvozovek (v prvn\\u00ED \\u0159ad\\u011B jednoduch\\u00E9, a\\u017E v druh\\u00E9 \\u0159ad\\u011B bo\\u010Dn\\u00ED) se u\\u017E\\u00EDvaj\\u00ED p\\u0159edev\\u0161\\u00EDm tehdy, pokud pot\\u0159ebujeme do uvozen\\u00E9ho textu vlo\\u017Eit je\\u0161t\\u011B dal\\u0161\\u00ED uvozovky\\u00BB; \\u00ABUvozovky p\\u0159il\\u00E9haj\\u00ED v\\u017Edy t\\u011Bsn\\u011B k v\\u00FDraz\\u016Fm, kter\\u00E9 ohrani\\u010Duj\\u00ED (tedy \\u201Etakto\\u201C)\\u00BB\", url: \"https://prirucka.ujc.cas.cz/?id=162\", note: \"Prvn\\u00ED stupe\\u0148: U+201E otev\\u00EDrac\\u00ED, U+201C zav\\u00EDrac\\u00ED \\u2014 NIKOLI U+201D jako v pol\\u0161tin\\u011B, a pr\\u00E1v\\u011B to je rozd\\u00EDl, kter\\u00FD se v sazb\\u011B p\\u0159ehl\\u00E9dne. K\\u00F3dy nebyly ode\\u010Dteny z markdownov\\u00E9 konverze str\\u00E1nky, kter\\u00E1 se u uvozovek uk\\u00E1zala jako nespolehliv\\u00E1; rozhoduj\\u00EDc\\u00ED je vlastn\\u00ED ozna\\u010Den\\u00ED zdroje \\u00ABuvozovky typu 99 66\\u00BB: prvn\\u00ED znam\\u00E9nko m\\u00E1 tvar dev\\u00EDtky u paty \\u0159\\u00E1dku (U+201E), druh\\u00E9 tvar \\u0161estky vyzdvi\\u017Een\\u00FD nahoru (U+201C). Polsk\\u00FD p\\u00E1r PWN naproti tomu ozna\\u010Duje jako 99 99. Druh\\u00FD stupe\\u0148: jednoduch\\u00E9 uvozovky, proto\\u017Ee zdroj je v\\u00FDslovn\\u011B \\u0159ad\\u00ED \\u00ABv prvn\\u00ED \\u0159ad\\u011B\\u00BB pro uvozovky v uvozovk\\u00E1ch. OMEZEN\\u00C1 JISTOTA, \\u0159e\\u010Den\\u00E1 naplno: ozna\\u010Den\\u00ED \\u00AB99 66\\u00BB je ve zdroji uvedeno pouze pro dvojit\\u00E9 uvozovky, tak\\u017Ee k\\u00F3dy jednoduch\\u00FDch (U+201A \\u2026 U+2018) vych\\u00E1zej\\u00ED ze stejn\\u00E9ho vzorce a z vys\\u00E1zen\\u00FDch glyf\\u016F, ne z doslovn\\u00E9ho tvrzen\\u00ED. Rozhodla by tabulka H.1 normy \\u010CSN 01 6910:2014, kter\\u00E1 je v\\u0161ak placen\\u00E1 (\\u010CSN online od 1 000 K\\u010D/rok). ROZHODNUT\\u00CD OPER\\u00C1TORA, 18. 9. 2026: le\\u017E\\u00ED-li pravidlo za placenou normou, projekt je formuluje podle p\\u0159evl\\u00E1daj\\u00EDc\\u00EDho \\u00FAzu a ozna\\u010D\\u00ED to jako rozhodnut\\u00ED, nikoli jako citaci \\u2014 stejn\\u011B jako u n\\u011Bmeck\\u00E9ho \\u00ABNr.\\u00BB. Padne-li placen\\u00E1 st\\u011Bna, nahrad\\u00ED zn\\u011Bn\\u00ED normy tento \\u0159\\u00E1dek. Q-W plat\\u00ED v obou p\\u0159\\u00EDpadech: U+201A, U+2018 i U+2019 pat\\u0159\\u00ED do NARROW. Ov\\u011B\\u0159eno 18. 9. 2026.\" }, { rule: \"dashes\", cite: \"\\u00DAstav pro jazyk \\u010Desk\\u00FD AV \\u010CR, Internetov\\u00E1 jazykov\\u00E1 p\\u0159\\u00EDru\\u010Dka, \\u00ABPoml\\u010Dka\\u00BB: \\u00ABPoml\\u010Dku odd\\u011Blujeme z obou stran mezerami, komplikovan\\u011Bj\\u0161\\u00ED situace je pouze tehdy, pokud toto znam\\u00E9nko vystupuje ve funkci v\\u00FDraz\\u016F a, a\\u017E, od \\u2026 do \\u2026 nebo proti (versus)\\u00BB; \\u00ABpoml\\u010Dka m\\u00EDsto \\u010D\\u00E1rky: Tato kniha \\u2013 vydan\\u00E1 je\\u0161t\\u011B p\\u0159ed v\\u00E1lkou \\u2013 je opravdu \\u00FA\\u017Easn\\u00E1\\u00BB; \\u00ABPoml\\u010Dka (\\u2013) je dlouh\\u00E1 vodorovn\\u00E1 \\u010D\\u00E1rka\\u00BB; \\u00ABVedle kr\\u00E1tk\\u00E9 poml\\u010Dky (\\u2013) se v textu n\\u011Bkdy pou\\u017E\\u00EDv\\u00E1 tak\\u00E9 poml\\u010Dka dlouh\\u00E1 (\\u2014)\\u00BB\", url: \"https://prirucka.ujc.cas.cz/?id=165\", note: \"Od\\u016Fvod\\u0148uje dash.parenthetical = \\u00ABen-spaced\\u00BB. Vsuvka nen\\u00ED \\u017E\\u00E1dn\\u00E1 ze \\u010Dty\\u0159 vyjmenovan\\u00FDch v\\u00FDjimek, tak\\u017Ee plat\\u00ED obecn\\u00E9 pravidlo o mezer\\u00E1ch z obou stran. D\\u00C9LKA je na rozd\\u00EDl od pol\\u0161tiny rozhodnuta samotn\\u00FDm zdrojem: defini\\u010Dn\\u00ED glyf str\\u00E1nky je kr\\u00E1tk\\u00E1 poml\\u010Dka U+2013 a dlouh\\u00E1 U+2014 je pops\\u00E1na jako to, co se pou\\u017E\\u00EDv\\u00E1 \\u00ABn\\u011Bkdy\\u00BB nav\\u00EDc. U pol\\u0161tiny musel o d\\u00E9lce rozhodnout oper\\u00E1tor, proto\\u017Ee PWN si v korpusu proti\\u0159e\\u010Dil; tady sta\\u010D\\u00ED \\u010D\\u00EDst. P\\u0158\\u00CDPUSTN\\u00C1 VARIANTA, zaznamen\\u00E1na: U+2014. Ov\\u011B\\u0159eno 18. 9. 2026.\" }, { rule: \"ranges\", cite: \"\\u00DAstav pro jazyk \\u010Desk\\u00FD AV \\u010CR, Internetov\\u00E1 jazykov\\u00E1 p\\u0159\\u00EDru\\u010Dka, \\u00ABPoml\\u010Dka\\u00BB, vyj\\u00E1d\\u0159en\\u00ED rozsahu (s v\\u00FDznamem \\u201Aa\\u017E\\u2018 \\u010Di \\u201Aod \\u2026 do\\u2018): \\u00ABstrana 23\\u201326, v letech 1945\\u20131948, 9\\u201316 h\\u00BB; \\u00DAJ\\u010C (P. Lozan, M. Pravdov\\u00E1), \\u00ABOt\\u00E1zky a odpov\\u011Bdi k \\u010CSN 01 6910 (2014)\\u00BB, ot\\u00E1zka 2: \\u00ABnorma umo\\u017E\\u0148uje i psan\\u00ED mezery kolem poml\\u010Dky v rozsaz\\u00EDch a ve v\\u00FDznamu \\u201Ea\\u201C a \\u201Eversus\\u201C, jestli\\u017Ee je alespo\\u0148 jeden z v\\u00FDraz\\u016F kolem poml\\u010Dky v\\u00EDceslovn\\u00FD\\u00BB\", url: \"https://prirucka.ujc.cas.cz/?id=165\", note: \"Od\\u016Fvod\\u0148uje dash.range = \\u00ABen-tight\\u00BB: kr\\u00E1tk\\u00E1 poml\\u010Dka U+2013 bez mezer. Potvrzeno ze dvou stran: p\\u0159\\u00EDru\\u010Dka s\\u00E1z\\u00ED rozsahy t\\u011Bsn\\u011B, a dokument \\u00DAJ\\u010C k norm\\u011B popisuje mezery v rozsahu jako povolenou V\\u00DDJIMKU pro v\\u00EDceslovn\\u00E9 v\\u00FDrazy, co\\u017E t\\u011Bsnou sazbu p\\u0159edpokl\\u00E1d\\u00E1 jako pravidlo. Text samotn\\u00E9 \\u010CSN 01 6910 \\u010Dten nebyl (je placen\\u00FD); citov\\u00E1n je v\\u00FDklad jej\\u00EDch vlastn\\u00EDch zpracovatel\\u016F, co\\u017E je nejsiln\\u011Bj\\u0161\\u00ED ve\\u0159ejn\\u011B dostupn\\u00E1 n\\u00E1hrada. Str\\u00E1nka rovn\\u011B\\u017E uv\\u00E1d\\u00ED, \\u017Ee poml\\u010Dka vyjad\\u0159uj\\u00EDc\\u00ED rozsah nem\\u00E1 st\\u00E1t na konci ani na za\\u010D\\u00E1tku \\u0159\\u00E1dku \\u2014 po\\u017Eadavek, pro kter\\u00FD locale.schema.json nem\\u00E1 pole. Pravidlo ranges je ve v\\u00FDchoz\\u00EDm stavu vypnut\\u00E9 (spec 0.5.0). Ov\\u011B\\u0159eno 18. 9. 2026.\" }, { rule: \"ellipsis\", cite: \"\\u00DAstav pro jazyk \\u010Desk\\u00FD AV \\u010CR, Internetov\\u00E1 jazykov\\u00E1 p\\u0159\\u00EDru\\u010Dka, \\u00ABT\\u0159i te\\u010Dky\\u00BB: \\u00ABjedn\\u00E1 se toti\\u017E o jeden znak, nikoli t\\u0159i samostatn\\u00E9 te\\u010Dky\\u00BB; \\u00ABZa t\\u0159emi te\\u010Dkami \\u010Dasto n\\u00E1sleduj\\u00ED dal\\u0161\\u00ED interpunk\\u010Dn\\u00ED znam\\u00E9nka, kter\\u00E1 se za t\\u0159i te\\u010Dky p\\u0159ipojuj\\u00ED bez mezery, ale nikdy se v\\u0161ak nep\\u0159ipojuje dal\\u0161\\u00ED te\\u010Dka (nikoli tedy \\u010Dty\\u0159i te\\u010Dky vedle sebe)\\u00BB\", url: \"https://prirucka.ujc.cas.cz/?id=166\", note: \"Od\\u016Fvod\\u0148uje abbreviatedAfterTerminal = false. V\\u00FDpustka je jeden znak U+2026 a otazn\\u00EDk \\u010Di vyk\\u0159i\\u010Dn\\u00EDk stoj\\u00ED ZA n\\u00ED \\u2014 rusk\\u00E1 dvoute\\u010Dkov\\u00E1 forma \\u00AB?..\\u00BB nen\\u00ED v \\u017E\\u00E1dn\\u00E9m konzultovan\\u00E9m \\u010Desk\\u00E9m zdroji p\\u0159edv\\u00EDd\\u00E1na. Bylo to ov\\u011B\\u0159eno z\\u00E1m\\u011Brn\\u011B: ukrajin\\u0161tina, zkouman\\u00E1 v t\\u00E9m\\u017Ee pr\\u016Fchodu, tu formu M\\u00C1, tak\\u017Ee analogie mezi slovansk\\u00FDmi jazyky by tu byla sv\\u016Fdn\\u00E1 a myln\\u00E1. Ov\\u011B\\u0159eno 18. 9. 2026.\" }, { rule: \"hyphen\", cite: \"\\u00DAstav pro jazyk \\u010Desk\\u00FD AV \\u010CR, Internetov\\u00E1 jazykov\\u00E1 p\\u0159\\u00EDru\\u010Dka, \\u00ABSpojovn\\u00EDk\\u00BB: \\u00ABp\\u00ED\\u0161e se bez mezer mezi v\\u00FDrazy, kter\\u00E9 spojuje\\u00BB; \\u00ABSpojovn\\u00EDk na za\\u010D\\u00E1tku dal\\u0161\\u00EDho \\u0159\\u00E1dku neopakujeme, nazna\\u010Duje-li rozd\\u011Blen\\u00ED slova (nap\\u0159. \\u017Eong- | -l\\u00E9r)\\u00BB; t\\u00E1\\u017E p\\u0159\\u00EDru\\u010Dka, \\u00ABZalomen\\u00ED \\u0159\\u00E1dk\\u016F a nevhodn\\u00E9 v\\u00FDrazy na jejich konci\\u00BB, jej\\u00ED\\u017E uzav\\u0159en\\u00FD v\\u00FD\\u010Det m\\u00EDst, kde k zalomen\\u00ED doj\\u00EDt nem\\u00E1, spojovn\\u00EDk neuv\\u00E1d\\u00ED\", url: \"https://prirucka.ujc.cas.cz/?id=164\", note: \"Od\\u016Fvod\\u0148uje t\\u0159i pr\\u00E1zdn\\u00E9 seznamy. \\u010Ce\\u0161tina spojovn\\u00EDk na konci \\u0159\\u00E1dku ani nezakazuje, ani \\u2014 na rozd\\u00EDl od pol\\u0161tiny \\u2014 d\\u011Blen\\u00ED v jeho m\\u00EDst\\u011B nep\\u0159edepisuje; neexistuje uzav\\u0159en\\u00FD normativn\\u00ED seznam tvar\\u016F, jejich\\u017E spojovn\\u00EDk se nesm\\u00ED l\\u00E1mat. To, \\u017Ee jej t\\u0159in\\u00E1ctibodov\\u00FD v\\u00FD\\u010Det str\\u00E1nky o zalomen\\u00ED \\u0159\\u00E1dk\\u016F neobsahuje, je dolo\\u017Een\\u00E1 nep\\u0159\\u00EDtomnost, ne nenalezen\\u00E1 citace \\u2014 a je to z\\u00E1rove\\u0148 rozd\\u00EDl proti ukrajin\\u0161tin\\u011B, kde \\u00A7 64 \\u043F. 4 takov\\u00FD seznam m\\u00E1. Ov\\u011B\\u0159eno 18. 9. 2026.\" }, { rule: \"nbsp\", cite: \"\\u00DAstav pro jazyk \\u010Desk\\u00FD AV \\u010CR, Internetov\\u00E1 jazykov\\u00E1 p\\u0159\\u00EDru\\u010Dka, \\u00ABZalomen\\u00ED \\u0159\\u00E1dk\\u016F a nevhodn\\u00E9 v\\u00FDrazy na jejich konci\\u00BB: k zalomen\\u00ED nem\\u00E1 doj\\u00EDt \\u00ABve spojen\\u00ED neslabi\\u010Dn\\u00FDch p\\u0159edlo\\u017Eek k, s, v, z s n\\u00E1sleduj\\u00EDc\\u00EDm slovem, nap\\u0159. k mostu, s bratrem, v Plzni, z n\\u00E1dra\\u017E\\u00ED\\u00BB; \\u00ABve spojen\\u00ED slabi\\u010Dn\\u00FDch p\\u0159edlo\\u017Eek o, u a spojek a, i s v\\u00FDrazem, kter\\u00FD po nich n\\u00E1sleduje, nap\\u0159. u babi\\u010Dky, o p\\u00E1t\\u00E9\\u00BB; \\u00ABve slo\\u017Een\\u00FDch zkratk\\u00E1ch a k\\u00F3dech, nap\\u0159. a. s., s. r. o.\\u00BB; \\u00ABmezi zkratkami tj., tzv., tzn. a n\\u00E1sleduj\\u00EDc\\u00EDm v\\u00FDrazem\\u00BB; \\u00ABmezi zkratkou jm\\u00E9na a p\\u0159\\u00EDjmen\\u00EDm\\u00BB; \\u00ABmezi \\u010D\\u00EDslem a zna\\u010Dkou, nap\\u0159. 50 %, \\u00A7 23\\u00BB; \\u00ABV textov\\u00E9m procesoru vkl\\u00E1d\\u00E1me tam, kde nem\\u00E1 doj\\u00EDt k zalomen\\u00ED \\u0159\\u00E1dku, m\\u00EDsto b\\u011B\\u017En\\u00E9 mezislovn\\u00ED mezery mezeru pevnou\\u00BB\", url: \"https://prirucka.ujc.cas.cz/?id=880\", note: \"P\\u011Bt pol\\u00ED z jednoho uzav\\u0159en\\u00E9ho v\\u00FD\\u010Dtu, kter\\u00FD se odvol\\u00E1v\\u00E1 na \\u010CSN 01 6910. (1) afterShortWords: osm jednop\\u00EDsmenn\\u00FDch v\\u00FDraz\\u016F, citovan\\u00FDch doslova. Na rozd\\u00EDl od pol\\u0161tiny je z\\u00E1kaz v prameni BEZPODM\\u00CDNE\\u010CN\\u00DD \\u2014 nen\\u00ED v\\u00E1z\\u00E1n na \\u0161\\u00ED\\u0159ku sloupce ani na to, zda jde o titulek \\u2014 tak\\u017Ee zde nebylo co rozhodovat. (2) abbreviations: \\u00ABa. s.\\u00BB a \\u00ABs. r. o.\\u00BB. Interakce s N3 ov\\u011B\\u0159ena a je opa\\u010Dn\\u00E1 ne\\u017E u polsk\\u00E9ho \\u00ABi in.\\u00BB: N3 vy\\u017Eaduje, aby po jednop\\u00EDsmenn\\u00E9m v\\u00FDrazu n\\u00E1sledovala mezera, a po \\u00ABa\\u00BB n\\u00E1sleduje te\\u010Dka, tak\\u017Ee N3 index nen\\u00E1rokuje a ob\\u011B mezery dostane N4. \\u00AB\\u010CSN 01 6910\\u00BB z v\\u00FD\\u010Dtu vypu\\u0161t\\u011Bno: \\u010D\\u00EDslo normy nen\\u00ED fakt o jazyce. (3) beforeWord: \\u00ABtj.\\u00BB, \\u00ABtzv.\\u00BB, \\u00ABtzn.\\u00BB. Bod o \\u00ABzkratce titulu\\u00BB populov\\u00E1n nen\\u00ED, proto\\u017Ee zdroj u n\\u011Bj \\u017E\\u00E1dn\\u00FD seznam neuv\\u00E1d\\u00ED. (4) afterSymbols = [\\u00AB\\u00A7\\u00BB]. Ze stejn\\u00E9ho citovan\\u00E9ho bodu byly Z\\u00C1M\\u011ARN\\u011A vynech\\u00E1ny \\u00AB*\\u00BB, \\u00AB\\u2020\\u00BB a \\u00AB#\\u00BB: \\u0159et\\u011Bzec \\u00AB* 1921\\u00BB je bajt po bajtu toto\\u017En\\u00FD s odr\\u00E1\\u017Ekou seznamu n\\u00E1sledovanou \\u010D\\u00EDslic\\u00ED, tak\\u017Ee v re\\u017Eimu markdown by \\u0161lo o fale\\u0161n\\u00FD z\\u00E1sah bez vyva\\u017Euj\\u00EDc\\u00EDho p\\u0159\\u00EDnosu. (5) initialBinding = \\u00ABsingle\\u00BB: pramen v\\u00E1\\u017Ee \\u00ABzkratku jm\\u00E9na\\u00BB k p\\u0159\\u00EDjmen\\u00ED a jeho vlastn\\u00ED p\\u0159\\u00EDklady jsou Fr. Dane\\u0161 a M. T\\u011B\\u0161itelov\\u00E1, tedy JEDNA zkr\\u00E1cen\\u00E1 k\\u0159estn\\u00ED jm\\u00E9no; \\u00ABchain\\u00BB by na ani jednom z nich nezabral a citovan\\u00E9 pravidlo by z\\u016Fstalo nenapln\\u011Bn\\u00E9. Expozici, kterou sch\\u00E9ma u \\u00ABsingle\\u00BB samo pojmenov\\u00E1v\\u00E1, p\\u0159ij\\u00EDm\\u00E1me na z\\u00E1klad\\u011B citace, stejn\\u011B jako u fr. beforeNumber z\\u016Fst\\u00E1v\\u00E1 pr\\u00E1zdn\\u00E9: jedin\\u00FDm kandid\\u00E1tem je \\u00ABstrana 2\\u00BB, ale \\u00ABstrana\\u00BB je v\\u00EDcezna\\u010Dn\\u00E9 plnov\\u00FDznamov\\u00E9 slovo, nikoli zkratka \\u2014 t\\u00FD\\u017E argument, jak\\u00FDm ru.json vylu\\u010Duje \\u00AB\\u0433.\\u00BB. Ov\\u011B\\u0159eno 18. 9. 2026.\" }, { rule: \"nbsp\", cite: \"\\u00DAstav pro jazyk \\u010Desk\\u00FD AV \\u010CR, Internetov\\u00E1 jazykov\\u00E1 p\\u0159\\u00EDru\\u010Dka, \\u00ABZna\\u010Dky, \\u010D\\u00EDsla a \\u010D\\u00EDslice\\u00BB: \\u00ABZna\\u010Dky se od \\u010D\\u00EDseln\\u00E9 hodnoty odd\\u011Bluj\\u00ED mezerou, \\u010D\\u00EDslo a zna\\u010Dka se um\\u00EDs\\u0165uj\\u00ED na stejn\\u00FD \\u0159\\u00E1dek\\u00BB, \\u00ABnap\\u0159. 10 ha = 10 hektar\\u016F, 3 kg = 3 kilogramy, 14 % = 14 procent\\u00BB, \\u00AB100 kWh\\u00BB, \\u00ABrychlost 50 km/h\\u00BB, \\u00ABteplota 12\\u201315 \\u00B0C\\u00BB; BIPM, The International System of Units (SI), 9th ed., concise summary: \\u00ABA single space is always left between the number and the unit\\u00BB\", url: \"https://prirucka.ujc.cas.cz/?id=785\", note: \"Rozd\\u011Blen\\u00ED rol\\u00ED jako v en-US, fi, sv, es, pt a pl: BIPM \\u0159\\u00EDk\\u00E1, kter\\u00E9 \\u0159et\\u011Bzce jsou zna\\u010Dkami jednotek SI, \\u00DAJ\\u010C \\u0159\\u00EDk\\u00E1, jak\\u00E1 je \\u010Desk\\u00E1 konvence. \\u010Cesk\\u00E9 zn\\u011Bn\\u00ED je p\\u0159itom siln\\u011Bj\\u0161\\u00ED, ne\\u017E nbsp.md \\u00A72.1 od locale vy\\u017Eaduje: uv\\u00E1d\\u00ED nejen mezeru, ale i to, \\u017Ee \\u00AB\\u010D\\u00EDslo a zna\\u010Dka se um\\u00EDs\\u0165uj\\u00ED na stejn\\u00FD \\u0159\\u00E1dek\\u00BB. P\\u0158\\u00CDPUSTN\\u00C1 VARIANTA, zaznamen\\u00E1na: \\u00ABV p\\u0159\\u00EDpad\\u011B, \\u017Ee pomoc\\u00ED \\u010D\\u00EDslice a zna\\u010Dky vyjad\\u0159ujeme p\\u0159\\u00EDdavn\\u00E9 jm\\u00E9no, mezeru nevkl\\u00E1d\\u00E1me: 8km = 8kilometrov\\u00FD, 20% = 20procentn\\u00ED\\u00BB. Rozpor nen\\u00ED t\\u0159eba \\u0159e\\u0161it: N5 existuj\\u00EDc\\u00ED mezeru pouze nahrazuje a nikdy ji nevkl\\u00E1d\\u00E1 (nbsp.md \\u00A73.7), tak\\u017Ee \\u00AB14 %\\u00BB dostane U+00A0 a \\u00AB20%\\u00BB z\\u016Fstane nedot\\u010Deno. Jednoznakov\\u00E9 zna\\u010Dky vypu\\u0161t\\u011Bny, a pro \\u010De\\u0161tinu z konkr\\u00E9tn\\u00EDho d\\u016Fvodu, ne ze stylov\\u00E9 opatrnosti: \\u00ABs\\u00BB je z\\u00E1rove\\u0148 vyjmenovan\\u00E1 jednop\\u00EDsmenn\\u00E1 p\\u0159edlo\\u017Eka, tak\\u017Ee ve v\\u011Bt\\u011B \\u00ABP\\u0159i\\u0161el v 5 s bratrem\\u00BB by se \\u00AB5\\u00BB sv\\u00E1zala se \\u00ABs\\u00BB. Ov\\u011B\\u0159eno 18. 9. 2026.\" }, { rule: \"nbsp\", cite: \"\\u00DAstav pro jazyk \\u010Desk\\u00FD AV \\u010CR, Internetov\\u00E1 jazykov\\u00E1 p\\u0159\\u00EDru\\u010Dka, \\u00ABOtazn\\u00EDk\\u00BB: \\u00ABStejn\\u011B jako naprost\\u00E1 v\\u011Bt\\u0161ina interpunk\\u010Dn\\u00EDch znam\\u00E9nek se p\\u0159ipojuje k p\\u0159edch\\u00E1zej\\u00EDc\\u00EDmu slovu (zkratce, zna\\u010Dce) bez mezery, za n\\u00EDm n\\u00E1sleduje mezera\\u00BB; t\\u00E1\\u017E p\\u0159\\u00EDru\\u010Dka, \\u00ABT\\u0159i te\\u010Dky\\u00BB: \\u00ABt\\u0159i te\\u010Dky n\\u00E1sleduj\\u00EDc\\u00ED za slovem se p\\u0159ipojuj\\u00ED bez mezery\\u00BB\", url: \"https://prirucka.ujc.cas.cz/?id=171\", note: \"Od\\u016Fvod\\u0148uje pr\\u00E1zdn\\u00E9 beforePunctuation i narrowBeforePunctuation. \\u010Ce\\u0161tina p\\u0159ed \\u00AB:\\u00BB, \\u00AB;\\u00BB, \\u00AB!\\u00BB, \\u00AB?\\u00BB nestav\\u00ED ani U+00A0, ani U+202F, a zdroj jim odstup v\\u00FDslovn\\u011B up\\u00EDr\\u00E1 \\u2014 je to z\\u00E1por, ne ml\\u010Den\\u00ED. Q-P je t\\u00EDm spln\\u011Bno trivi\\u00E1ln\\u011B. Ov\\u011B\\u0159eno 18. 9. 2026.\" }] },\n \"de-CH\": { locale: \"de-CH\", name: \"German (Switzerland)\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u2039\", close: \"\\u203A\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"z. B.\", \"d. h.\", \"u. a.\", \"u. U.\", \"m. a. W.\", \"m. w. H.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"Art.\", \"Abs.\", \"Ziff.\", \"Kap.\", \"S.\"], beforeWord: [\"St.\"], afterSymbols: [\"\\u00A7\", \"\\u00A7\\u00A7\"], initialBinding: \"chain\" }, sources: [{ rule: \"quotes\", cite: \"Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 201\\u2013203: zu schreiben sind die Guillemets \\u00AB \\u00BB und, f\\u00FCr eine Anf\\u00FChrung innerhalb einer Anf\\u00FChrung, die halben Anf\\u00FChrungszeichen \\u2039 \\u203A; die in Deutschland \\u00FCbliche Schreibung \\u00BB \\u00AB ist f\\u00FCr amtliche Texte nicht zul\\u00E4ssig\", url: \"https://www.bk.admin.ch/dam/bk/de/dokumente/sprachdienste/sprachdienst_de/schreibweisungen.pdf.download.pdf/schreibweisungen.pdf\", note: \"Rz. 202 regelt ausdr\\u00FCcklich nur das Leerzeichen VOR dem Anf\\u00FChrungszeichen und NACH dem Schlusszeichen; ein Zwischenraum innerhalb der Guillemets wird weder gefordert noch in einem der Beispiele gesetzt (\\u00ABZukunft f\\u00FCr Schweizer Fahrende\\u00BB). Daher innerSpace = none.\" }, { rule: \"dashes\", cite: \"Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 231, 237, 238: der Gedankenstrich ist der Halbgeviertstrich \\u2013; vor und nach dem Gedankenstrich bei Nachtr\\u00E4gen und paarigen Einsch\\u00FCben steht ein Leerzeichen\", url: \"https://www.bk.admin.ch/dam/bk/de/dokumente/sprachdienste/sprachdienst_de/schreibweisungen.pdf.download.pdf/schreibweisungen.pdf\", note: \"Rz. 236 h\\u00E4lt ausdr\\u00FCcklich fest, dass der Geviertstrich (\\u2014) nicht zul\\u00E4ssig ist.\" }, { rule: \"dashes\", cite: \"Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 234: der Gedankenstrich als Begriffszeichen f\\u00FCr \\u201Ebis\\u201C steht ohne Leerzeichen \\u2014 \\u201E16\\u201317 Uhr\\u201C, \\u201Edie Artikel 10\\u201312\\u201C, \\u201Edie Jahre 1939\\u20131945\\u201C\", url: \"https://www.bk.admin.ch/dam/bk/de/dokumente/sprachdienste/sprachdienst_de/schreibweisungen.pdf.download.pdf/schreibweisungen.pdf\" }, { rule: \"nbsp\", cite: \"Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 251 (Festabstand h\\u00E4lt Zusammengeh\\u00F6riges zusammen: Ziffer und Masseinheit, Abk\\u00FCrzung und Ortsname, Teile mehrgliedriger Abk\\u00FCrzungen, Gliederungseinheit und Ziffer \\u2014 \\u201E20 km\\u201C, \\u201ESt. Gallen\\u201C, \\u201EArtikel 35\\u201C), Rz. 438 (mehrgliedrige Abk\\u00FCrzungen: d. h. / z. B. / u. a. / u. U. / m. a. W. / m. w. H.), Rz. 549\\u2013550 (Festabstand zwischen Zahl und Einheit), Rz. 554 (Festabstand vor % und \\u2030)\", url: \"https://www.bk.admin.ch/dam/bk/de/dokumente/sprachdienste/sprachdienst_de/schreibweisungen.pdf.download.pdf/schreibweisungen.pdf\", note: \"initialBinding: \\\"chain\\\" (spec 0.6.0: das Feld hie\\u00DF zuvor das boolesche bindInitials) ist eine Ableitung, keine w\\u00F6rtliche Weisung: Rz. 251 nennt \\u201Eeine Abk\\u00FCrzung und ein Ortsname\\u201C (St. Gallen) und Rz. 438 die Teile mehrgliedriger Abk\\u00FCrzungen; die Bindung Initiale\\u2013Nachname ist dieselbe Konstruktion, wird aber in den Schreibweisungen nicht ausdr\\u00FCcklich erw\\u00E4hnt. Keine Quelle belegt eine einzelne Initiale (\\\"single\\\"); \\\"chain\\\" folgt derselben Zwei-oder-mehr-Logik wie de-DE/ru. Die Einheitenliste ist bewusst kurz und enth\\u00E4lt keine einbuchstabigen Einheitenzeichen. Der Schweizer Verzicht auf \\u00DF (ss statt \\u00DF, Amtliches Regelwerk \\u00A7 25 E2) l\\u00E4sst sich im Schema nicht ausdr\\u00FCcken und ist deshalb hier nicht abgebildet.\" }, { rule: \"nbsp\", cite: \"Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 251 (Festabstand zwischen einer Gliederungseinheit eines Erlasses und der dazugeh\\u00F6rigen Ziffer \\u2014 Beispiele \\u201EArtikel 35\\u201C, \\u201ES. 17 f.\\u201C, \\u201ESt. Gallen\\u201C), Rz. 438 (Entsprechendes gilt f\\u00FCr die eingliedrige Abk\\u00FCrzung \\u201ESt.\\u201C f\\u00FCr \\u201ESankt\\u201C in Ortsnamen: \\u201ESt. Gallen\\u201C, \\u201ESt. Moritz\\u201C), Rz. 439 (abschliessende Aufz\\u00E4hlung der Begriffszeichen: Ziffern, %, \\u2030, Gedankenstrich, Schr\\u00E4gstrich, \\u00A7, W\\u00E4hrungszeichen, mathematische Zeichen, Einheitenzeichen), Rz. 440 (zwischen einem Begriffszeichen und der dazugeh\\u00F6rigen Zahl steht ein Festabstand), Rz. 727 (in verknapptem Text werden die Gliederungseinheiten abgek\\u00FCrzt: \\u201EKap., Art., Abs., Bst. (falsch: Buchst., lit.), Ziff.\\u201C), Rz. 730 (Nummerierung der Gliederungseinheiten)\", url: \"https://www.bk.admin.ch/dam/de/sd-web/YVHazXZRkqKn/schreibweisungen.pdf\", note: \"Wortlaut im PDF selbst gepr\\u00FCft. Rz. 439 und Rz. 727 entscheiden die Zuordnung von \\u201EArt.\\u201C: die Aufz\\u00E4hlung der Begriffszeichen in Rz. 439 ist abschliessend und enth\\u00E4lt \\u201EArt.\\u201C nicht, Rz. 727 f\\u00FChrt \\u201EArt.\\u201C ausdr\\u00FCcklich als Abk\\u00FCrzung einer Gliederungseinheit. \\u201EArt.\\u201C geh\\u00F6rt damit zu beforeNumber und nicht zu afterSymbols, wo es zuvor stand; die Bindung an die folgende Zahl folgt aus Rz. 251. Aus derselben Liste fehlt nur \\u201EBst.\\u201C, weil ihm ein Buchstabe folgt, keine Zahl (\\u201EBst. a\\u201C). \\u201ES.\\u201C ist mit \\u201ES. 17 f.\\u201C in Rz. 251 w\\u00F6rtlich belegt. \\u201ENr.\\u201C wurde ersatzlos entfernt: es steht weder in Rz. 439 noch \\u00FCberhaupt im Sachregister (unter N nur \\u201ENGO\\u201C, \\u201ENormen\\u201C, \\u201ENull\\u201C); die einzige Fundstelle ist Rz. 431, wo \\u201ENr. (Nummer), Tarif-Nrn.\\u201C als Beispiel f\\u00FCr Deklinationsendungen dient und keine Abstandsregel ausspricht. afterSymbols war damit nachweislich falsch, und f\\u00FCr beforeNumber fehlt der Beleg \\u2014 nach docs/PLAN.md \\u00A76.1 zieht das die Streichung nach sich. Zur\\u00FCckkommen kann \\u201ENr.\\u201C mit einer Lesung der DIN 5008. beforeWord enth\\u00E4lt nur \\u201ESt.\\u201C: Rz. 438 nennt genau diesen Fall w\\u00F6rtlich, weitere Abk\\u00FCrzung-plus-Wort-Bindungen sind in den Schreibweisungen nicht als geschlossene Liste geregelt (\\u201EK\\u00FCssnacht a. R.\\u201C ist eine mehrgliedrige Abk\\u00FCrzung, kein Pr\\u00E4fix).\" }, { rule: \"hyphen\", cite: \"Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 223 und 224: der Bindestrich wird als Erg\\u00E4nzungsstrich f\\u00FCr einen eingesparten Wortteil verwendet (\\u201EPapierproduktion und -handel\\u201C); mit dem gesch\\u00FCtzten Erg\\u00E4nzungsstrich wird verhindert, dass der Erg\\u00E4nzungsstrich am Zeilenende auf der oberen Zeile bleibt, w\\u00E4hrend der zugeh\\u00F6rige zweite Wortbestandteil auf die n\\u00E4chste Zeile rutscht\", url: \"https://www.bk.admin.ch/dam/de/sd-web/YVHazXZRkqKn/schreibweisungen.pdf\", note: \"Beleg daf\\u00FCr, dass die drei Listen leer bleiben. Das Deutsche kennt keine geschlossene Liste von Morphemen mit unteilbarem Bindestrich; die Trennung am Bindestrich ist zul\\u00E4ssig (Rz. 269\\u2013271 behandeln nur sinnentstellende Trennungen). Der einzige belegte Fall eines gesch\\u00FCtzten Bindestrichs ist der Erg\\u00E4nzungsstrich (Rz. 224), und der ist offen: er betrifft jedes beliebige Zweitglied nach \\u201Eund -\\u201C und l\\u00E4sst sich als literale Wortliste nicht abbilden.\" }] },\n \"de-DE\": { locale: \"de-DE\", name: \"German (Germany)\", quotes: { primary: { open: \"\\u201E\", close: \"\\u201C\", innerSpace: \"none\" }, secondary: { open: \"\\u201A\", close: \"\\u2018\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"z. B.\", \"d. h.\", \"u. a.\", \"u. \\u00C4.\", \"z. T.\", \"i. d. R.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u20AC\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"Nr.\", \"S.\"], beforeWord: [\"St.\"], afterSymbols: [\"\\u00A7\", \"\\u00A7\\u00A7\"], initialBinding: \"chain\" }, sources: [{ rule: \"quotes\", cite: \"Duden, Rechtschreibregeln, \\u201EAnf\\u00FChrungszeichen\\u201C, Regeln D 5 und D 12: G\\u00E4nsef\\u00FC\\u00DFchen \\u201E\\u2026\\u201C als Anf\\u00FChrungszeichen, halbe Anf\\u00FChrungszeichen \\u201A\\u2026\\u2018 f\\u00FCr eine Anf\\u00FChrung innerhalb einer Anf\\u00FChrung\", url: \"https://www.duden.de/sprachwissen/rechtschreibregeln/anfuehrungszeichen\", note: \"Deckungsgleich mit dem Amtlichen Regelwerk der deutschen Rechtschreibung, \\u00A7 79 E2 (Anf\\u00FChrung innerhalb einer Anf\\u00FChrung durch halbe Anf\\u00FChrungszeichen).\" }, { rule: \"dashes\", cite: \"Duden, Rechtschreibregeln, \\u201EGedankenstrich\\u201C, Regel D 45: der Gedankenstrich (Halbgeviertstrich) steht mit Leerzeichen auf beiden Seiten beim Einschieben eines Zusatzes\", url: \"https://www.duden.de/sprachwissen/rechtschreibregeln/gedankenstrich\" }, { rule: \"dashes\", cite: \"Schweizerische Bundeskanzlei, Schreibweisungen (Ausgabe 2013, aktualisiert), Rz. 234: der Gedankenstrich als Begriffszeichen f\\u00FCr \\u201Ebis\\u201C steht ohne Leerzeichen \\u2014 \\u201Edie Jahre 1939\\u20131945\\u201C\", url: \"https://www.bk.admin.ch/dam/bk/de/dokumente/sprachdienste/sprachdienst_de/schreibweisungen.pdf.download.pdf/schreibweisungen.pdf\", note: \"F\\u00FCr den Bis-Strich konnte keine gleichwertig pr\\u00E4zise Duden-Onlineregel gefunden werden; die schweizerische Weisung formuliert dieselbe im gesamten deutschen Sprachraum \\u00FCbliche Regel und wird hier als \\u00FCberpr\\u00FCfbare Quelle angegeben.\" }, { rule: \"nbsp\", cite: \"DIN 5008 (Schreib- und Gestaltungsregeln f\\u00FCr die Text- und Informationsverarbeitung): gesch\\u00FCtztes Leerzeichen zwischen den Teilen mehrgliedriger Abk\\u00FCrzungen (\\u201Ez. B.\\u201C, \\u201Ed. h.\\u201C), bei Initialen (\\u201EJ. K. Rowling\\u201C) sowie zwischen Zahl und Einheit, Prozentzeichen und Paragrafenzeichen\", note: \"Die Norm selbst ist kostenpflichtig; die Regelinhalte wurden \\u00FCber die Duden-Regeln zu Abk\\u00FCrzungen (D 1) und \\u00FCber die von Duden selbst verwendete Schreibung \\u201Ez. B.\\u201C mit gesch\\u00FCtztem Leerzeichen gegengepr\\u00FCft. Der Einheitenliste liegt keine Normliste zugrunde: sie ist bewusst kurz gehalten und enth\\u00E4lt keine einbuchstabigen Einheitenzeichen (m, g, l, s), weil diese ohne Kontextpr\\u00FCfung zu Falschtreffern f\\u00FChren.\" }, { rule: \"nbsp\", cite: \"Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 251: der Festabstand verhindert, dass Zusammengeh\\u00F6riges beim Zeilensprung auseinandergerissen wird \\u2014 Beispiele \\u201E20 km\\u201C, \\u201ESt. Gallen\\u201C, \\u201EArtikel 35\\u201C, \\u201ES. 17 f.\\u201C, \\u201E20. November\\u201C; Rz. 438: Entsprechendes gilt f\\u00FCr die eingliedrige Abk\\u00FCrzung \\u201ESt.\\u201C f\\u00FCr \\u201ESankt\\u201C in Ortsnamen (\\u201ESt. Gallen\\u201C, \\u201ESt. Moritz\\u201C); Rz. 439: abschliessende Aufz\\u00E4hlung der Begriffszeichen (Ziffern, %, \\u2030, Gedankenstrich, Schr\\u00E4gstrich, \\u00A7, W\\u00E4hrungszeichen, mathematische Zeichen, Einheitenzeichen)\", url: \"https://www.bk.admin.ch/dam/de/sd-web/YVHazXZRkqKn/schreibweisungen.pdf\", note: \"Wortlaut im PDF selbst gepr\\u00FCft. F\\u00FCr Deutschland regelt dieselbe Konstruktion die DIN 5008 (Schreib- und Gestaltungsregeln), die kostenpflichtig ist und deren Wortlaut hier nicht gepr\\u00FCft werden konnte; deshalb steht die schweizerische Weisung als \\u00FCberpr\\u00FCfbarer Beleg \\u2014 dasselbe Vorgehen wie bei der Quelle zu Rz. 234 in diesem File. Die \\u00DCbertragung auf de-DE ist insofern eine Ableitung, keine deutschlandspezifische Weisung. \\u201ES.\\u201C ist mit \\u201ES. 17 f.\\u201C w\\u00F6rtlich belegt und deckt die von docs/PLAN.md \\u00A77 geforderte Schreibung \\u201ES.\\u201C + Zahl. \\u201ENr.\\u201C geh\\u00F6rt nicht hierher, sondern zu den Abk\\u00FCrzungen: die Aufz\\u00E4hlung der Begriffszeichen in Rz. 439 ist abschliessend und enth\\u00E4lt \\u201ENr.\\u201C nicht (im Sachregister unter N stehen nur \\u201ENGO\\u201C, \\u201ENormen\\u201C, \\u201ENull\\u201C). Aus afterSymbols ist es deshalb ersatzlos gestrichen. In beforeNumber steht es seit Spec 1.3.0 \\u2014 nicht als Zitat, sondern als vereinheitlichte Schreibung; die Begr\\u00FCndung steht im n\\u00E4chsten Eintrag.\" }, { rule: \"hyphen\", cite: \"Schweizerische Bundeskanzlei, Schreibweisungen, Rz. 223 und 224: der Bindestrich wird als Erg\\u00E4nzungsstrich f\\u00FCr einen eingesparten Wortteil verwendet (\\u201EPapierproduktion und -handel\\u201C); mit dem gesch\\u00FCtzten Erg\\u00E4nzungsstrich wird verhindert, dass der Erg\\u00E4nzungsstrich am Zeilenende auf der oberen Zeile bleibt, w\\u00E4hrend der zugeh\\u00F6rige zweite Wortbestandteil auf die n\\u00E4chste Zeile rutscht\", url: \"https://www.bk.admin.ch/dam/de/sd-web/YVHazXZRkqKn/schreibweisungen.pdf\", note: \"Beleg daf\\u00FCr, dass die drei Listen leer bleiben. Das Deutsche kennt keine geschlossene Liste von Morphemen mit unteilbarem Bindestrich; die Trennung am Bindestrich ist zul\\u00E4ssig. Der einzige belegte Fall eines gesch\\u00FCtzten Bindestrichs ist der Erg\\u00E4nzungsstrich (Rz. 224), und der ist offen: er betrifft jedes beliebige Zweitglied nach \\u201Eund -\\u201C und l\\u00E4sst sich als literale Wortliste nicht abbilden.\" }, { rule: \"nbsp\", cite: \"Keine frei pr\\u00FCfbare Normquelle f\\u00FCr \\u201ENr.\\u201C + Zahl: DIN 5008:2020-03 ist kostenpflichtig und wurde nicht gelesen; Duden und das Amtliche Regelwerk 2024 sprechen keine Abstandsregel aus. Vereinheitlicht nach vorherrschendem Gebrauch (Operatorentscheid, 18.09.2026)\", note: \"Diese Zeile ist ausdr\\u00FCcklich kein Beleg, sondern eine Festlegung, und wird als solche gef\\u00FChrt. Gepr\\u00FCft und ergebnislos: Duden, Rechtschreibregeln \\u201EAbk\\u00FCrzungen\\u201C (D 1\\u2013D 4, nur der Abk\\u00FCrzungspunkt); Duden, Sprachratgeber \\u201EWorttrennung am Zeilenende\\u201C; Amtliches Regelwerk 2024, Kapitel F (\\u00A7\\u00A7 84\\u201390, nur Worttrennung) und der Kasten \\u201ESonderzeichen\\u201C auf S. 153, der Typografie ausdr\\u00FCcklich den Konventionen bzw. den DIN-, \\u00D6NORM- und SNV-Normen zuweist, also ausserhalb des Regelwerks. Entscheiden k\\u00F6nnte nur DIN 5008:2020-03. Der Projektentscheid dazu: liegt eine Regel hinter einer Bezahlschranke, formuliert polytypo sie nach dem verbreitetsten Gebrauch und h\\u00E4lt sie in allen Runtimes gleich \\u2014 Einheitlichkeit geht hier vor Kanontreue, und die Festlegung wird offen als solche gekennzeichnet statt als Zitat ausgegeben. Der verbreitetste Gebrauch bindet \\u201ENr.\\u201C an die folgende Zahl; die Sekund\\u00E4rquellen, die DIN 5008 referieren, sagen dasselbe. F\\u00E4llt die Schranke, tritt der Wortlaut der Norm an die Stelle dieser Zeile \\u2014 auch wenn er ihr widerspricht.\" }] },\n el: { locale: \"el\", name: \"Greek\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"none\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [], beforeNumber: [], beforeWord: [], afterSymbols: [], initialBinding: \"none\" }, sources: [{ rule: \"quotes\", cite: \"\\u03A5\\u03C0\\u03B7\\u03C1\\u03B5\\u03C3\\u03AF\\u03B1 \\u0395\\u03BA\\u03B4\\u03CC\\u03C3\\u03B5\\u03C9\\u03BD \\u03C4\\u03B7\\u03C2 \\u0395\\u03C5\\u03C1\\u03C9\\u03C0\\u03B1\\u03CA\\u03BA\\u03AE\\u03C2 \\u0388\\u03BD\\u03C9\\u03C3\\u03B7\\u03C2, \\u0394\\u03B9\\u03BF\\u03C1\\u03B3\\u03B1\\u03BD\\u03B9\\u03BA\\u03CC \\u03B5\\u03B3\\u03C7\\u03B5\\u03B9\\u03C1\\u03AF\\u03B4\\u03B9\\u03BF \\u03C3\\u03CD\\u03BD\\u03C4\\u03B1\\u03BE\\u03B7\\u03C2 \\u03BA\\u03B5\\u03B9\\u03BC\\u03AD\\u03BD\\u03C9\\u03BD (\\u03B5\\u03BB\\u03BB\\u03B7\\u03BD\\u03B9\\u03BA\\u03AE \\u03AD\\u03BA\\u03B4\\u03BF\\u03C3\\u03B7 2011, \\u03C4\\u03B5\\u03BB\\u03B5\\u03C5\\u03C4\\u03B1\\u03AF\\u03B1 \\u03B5\\u03BD\\u03B7\\u03BC\\u03AD\\u03C1\\u03C9\\u03C3\\u03B7 30.4.2012), \\u039C\\u03AD\\u03C1\\u03BF\\u03C2 \\u03A4\\u03AD\\u03C4\\u03B1\\u03C1\\u03C4\\u03BF \\u00AB\\u03A3\\u03C5\\u03BC\\u03B2\\u03B1\\u03C4\\u03B9\\u03BA\\u03BF\\u03AF \\u03BA\\u03B1\\u03BD\\u03CC\\u03BD\\u03B5\\u03C2 \\u03B3\\u03B9\\u03B1 \\u03C4\\u03B7\\u03BD \\u03B5\\u03BB\\u03BB\\u03B7\\u03BD\\u03B9\\u03BA\\u03AE \\u03B3\\u03BB\\u03CE\\u03C3\\u03C3\\u03B1\\u00BB, \\u00A710.1.7 \\u00AB\\u0395\\u03B9\\u03C3\\u03B1\\u03B3\\u03C9\\u03B3\\u03B9\\u03BA\\u03AC\\u00BB: \\u00AB\\u03A3\\u03B5 \\u03B5\\u03B9\\u03C3\\u03B1\\u03B3\\u03C9\\u03B3\\u03B9\\u03BA\\u03AC (\\u03C3\\u03C4\\u03BF \\u03B5\\u03BB\\u03BB\\u03B7\\u03BD\\u03B9\\u03BA\\u03CC \\u03BA\\u03B5\\u03AF\\u03BC\\u03B5\\u03BD\\u03BF \\u03C0\\u03C1\\u03BF\\u03C4\\u03B9\\u03BC\\u03CE\\u03BD\\u03C4\\u03B1\\u03B9 \\u03C4\\u03B1 \\u03B4\\u03B9\\u03C0\\u03BB\\u03AC \\u03B3\\u03C9\\u03BD\\u03B9\\u03CE\\u03B4\\u03B7 \\u03B5\\u03B9\\u03C3\\u03B1\\u03B3\\u03C9\\u03B3\\u03B9\\u03BA\\u03AC: \\u00AB \\u00BB) \\u03BA\\u03BB\\u03B5\\u03AF\\u03BD\\u03BF\\u03BD\\u03C4\\u03B1\\u03B9 \\u03BA\\u03C5\\u03C1\\u03AF\\u03C9\\u03C2 \\u03BB\\u03CC\\u03B3\\u03B9\\u03B1 \\u03AE \\u03C0\\u03B1\\u03C1\\u03B1\\u03B8\\u03AD\\u03BC\\u03B1\\u03C4\\u03B1 \\u03C0\\u03BF\\u03C5 \\u03B1\\u03BD\\u03B1\\u03C6\\u03AD\\u03C1\\u03BF\\u03BD\\u03C4\\u03B1\\u03B9 \\u03B1\\u03C5\\u03C4\\u03BF\\u03BB\\u03B5\\u03BE\\u03B5\\u03AF. [\\u2026] \\u03A3\\u03C4\\u03B7\\u03BD \\u03C0\\u03B5\\u03C1\\u03AF\\u03C0\\u03C4\\u03C9\\u03C3\\u03B7 \\u03C0\\u03BF\\u03C5 \\u03C7\\u03C1\\u03B5\\u03B9\\u03AC\\u03B6\\u03BF\\u03BD\\u03C4\\u03B1\\u03B9 \\u03B5\\u03B9\\u03C3\\u03B1\\u03B3\\u03C9\\u03B3\\u03B9\\u03BA\\u03AC \\u03BC\\u03AD\\u03C3\\u03B1 \\u03C3\\u03B5 \\u03BA\\u03B5\\u03AF\\u03BC\\u03B5\\u03BD\\u03BF \\u03C0\\u03BF\\u03C5 \\u03B5\\u03AF\\u03BD\\u03B1\\u03B9 \\u03AE\\u03B4\\u03B7 \\u03C3\\u03B5 \\u03B5\\u03B9\\u03C3\\u03B1\\u03B3\\u03C9\\u03B3\\u03B9\\u03BA\\u03AC, \\u03C4\\u03CC\\u03C4\\u03B5 \\u03B3\\u03B9\\u03B1 \\u03C4\\u03B1 \\u03B5\\u03B9\\u03C3\\u03B1\\u03B3\\u03C9\\u03B3\\u03B9\\u03BA\\u03AC \\u03B1\\u03C5\\u03C4\\u03AC \\u03C7\\u03C1\\u03B7\\u03C3\\u03B9\\u03BC\\u03BF\\u03C0\\u03BF\\u03B9\\u03BF\\u03CD\\u03BD\\u03C4\\u03B1\\u03B9 \\u03C4\\u03B1 \\u03B4\\u03B9\\u03C0\\u03BB\\u03AC \\u03B1\\u03BD\\u03C9\\u03C6\\u03B5\\u03C1\\u03AE \\u03B5\\u03B9\\u03C3\\u03B1\\u03B3\\u03C9\\u03B3\\u03B9\\u03BA\\u03AC (\\u201C \\u201D), \\u03B5\\u03BD\\u03CE \\u03C3\\u03B5 \\u03C4\\u03C1\\u03AF\\u03C4\\u03BF \\u03B5\\u03C0\\u03AF\\u03C0\\u03B5\\u03B4\\u03BF \\u03B5\\u03C3\\u03C9\\u03C4\\u03B5\\u03C1\\u03B9\\u03BA\\u03AC \\u03C7\\u03C1\\u03B7\\u03C3\\u03B9\\u03BC\\u03BF\\u03C0\\u03BF\\u03B9\\u03BF\\u03CD\\u03BD\\u03C4\\u03B1\\u03B9 \\u03C4\\u03B1 \\u03BC\\u03BF\\u03BD\\u03AC \\u03B1\\u03BD\\u03C9\\u03C6\\u03B5\\u03C1\\u03AE \\u03B5\\u03B9\\u03C3\\u03B1\\u03B3\\u03C9\\u03B3\\u03B9\\u03BA\\u03AC (\\u2018 \\u2019)\\u00BB\", url: \"http://publications.europa.eu/resource/cellar/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b.0015.03/DOC_2\", note: \"Primary U+00AB/U+00BB, secondary U+201C/U+201D. Part Four of this guide is a Greek-specific punctuation chapter, not the multilingual part \\u2014 the distinction matters and is the reason this source is cited for Greek at all. innerSpace is \\\"none\\\": the \\u00A76.4 spacing table sets \\u00ABxx\\u00BB with an ordinary space only outside the guillemets, and the Greek chapter never asks for one inside. The third nesting level the source describes (U+2018/U+2019) is not expressible in locale.schema.json, which has primary and secondary only; that is a schema limit, not a gap in the source. Corroborated by \\u03A5\\u03A0\\u0395\\u03A0\\u0398/\\u0399\\u03A4\\u03A5\\u0395, \\u0393\\u03C1\\u03B1\\u03BC\\u03BC\\u03B1\\u03C4\\u03B9\\u03BA\\u03AE \\u039D\\u03AD\\u03B1\\u03C2 \\u0395\\u03BB\\u03BB\\u03B7\\u03BD\\u03B9\\u03BA\\u03AE\\u03C2 \\u0393\\u03BB\\u03CE\\u03C3\\u03C3\\u03B1\\u03C2 \\u0391\\u0384\\u2013\\u0393\\u0384 \\u0393\\u03C5\\u03BC\\u03BD\\u03B1\\u03C3\\u03AF\\u03BF\\u03C5, \\u00A73.3 (\\u00AB\\u03A4\\u03B1 \\u03B5\\u03B9\\u03C3\\u03B1\\u03B3\\u03C9\\u03B3\\u03B9\\u03BA\\u03AC ( \\u00AB \\u00BB ) \\u03C3\\u03B7\\u03BC\\u03B5\\u03B9\\u03CE\\u03BD\\u03BF\\u03BD\\u03C4\\u03B1\\u03B9\\u2026\\u00BB), whose examples likewise carry no inner space. Retrieved 2026-08-15.\" }, { rule: \"dashes\", cite: \"\\u0394\\u03B9\\u03BF\\u03C1\\u03B3\\u03B1\\u03BD\\u03B9\\u03BA\\u03CC \\u03B5\\u03B3\\u03C7\\u03B5\\u03B9\\u03C1\\u03AF\\u03B4\\u03B9\\u03BF \\u03C3\\u03CD\\u03BD\\u03C4\\u03B1\\u03BE\\u03B7\\u03C2 \\u03BA\\u03B5\\u03B9\\u03BC\\u03AD\\u03BD\\u03C9\\u03BD (EL, 2011), \\u00A710.1.8 \\u00AB\\u0395\\u03BD\\u03C9\\u03C4\\u03B9\\u03BA\\u03CC \\u2014 \\u03A0\\u03B1\\u03CD\\u03BB\\u03B1 \\u03BC\\u03B5\\u03C3\\u03B1\\u03AF\\u03BF\\u03C5 \\u03BC\\u03B5\\u03B3\\u03AD\\u03B8\\u03BF\\u03C5\\u03C2 \\u2014 \\u039C\\u03B5\\u03B3\\u03AC\\u03BB\\u03B7 \\u03C0\\u03B1\\u03CD\\u03BB\\u03B1\\u00BB: \\u03B3\\u03B9\\u03B1 \\u03C4\\u03B1 \\u03B1\\u03C1\\u03B9\\u03B8\\u03BC\\u03B7\\u03C4\\u03B9\\u03BA\\u03AC \\u03B4\\u03B9\\u03B1\\u03C3\\u03C4\\u03AE\\u03BC\\u03B1\\u03C4\\u03B1, \\u00AB\\u03A0\\u03B1\\u03CD\\u03BB\\u03B1 \\u03BC\\u03B5\\u03C3\\u03B1\\u03AF\\u03BF\\u03C5 \\u03BC\\u03B5\\u03B3\\u03AD\\u03B8\\u03BF\\u03C5\\u03C2 \\u03AE \\u03BC\\u03B5\\u03AF\\u03BF\\u03BD (\\u2013) [\\u2026] \\u03B3) \\u03B3\\u03B9\\u03B1 \\u03BD\\u03B1 \\u03B4\\u03B7\\u03BB\\u03CE\\u03C3\\u03B5\\u03B9 \\u03C4\\u03BF \\u03B4\\u03B9\\u03AC\\u03C3\\u03C4\\u03B7\\u03BC\\u03B1 \\u03BC\\u03B5\\u03C4\\u03B1\\u03BE\\u03CD \\u03B4\\u03CD\\u03BF \\u03BF\\u03C1\\u03AF\\u03C9\\u03BD (\\u03C0.\\u03C7. \\u03AC\\u03C4\\u03BF\\u03BC\\u03B1 \\u03B7\\u03BB\\u03B9\\u03BA\\u03AF\\u03B1\\u03C2 25\\u201345 \\u03B5\\u03C4\\u03CE\\u03BD) [\\u2026] \\u03B4) \\u03C3\\u03C4\\u03B7\\u03BD \\u03B1\\u03BD\\u03B1\\u03C6\\u03BF\\u03C1\\u03AC \\u03C3\\u03B5 \\u03C0\\u03B5\\u03C1\\u03B9\\u03CC\\u03B4\\u03BF\\u03C5\\u03C2 \\u03C4\\u03BF\\u03C5\\u03BB\\u03AC\\u03C7\\u03B9\\u03C3\\u03C4\\u03BF\\u03BD \\u03B4\\u03CD\\u03BF \\u03C0\\u03BB\\u03AE\\u03C1\\u03C9\\u03BD \\u03B5\\u03C4\\u03CE\\u03BD (\\u03C0.\\u03C7. 1989\\u20131991) [\\u2026] \\u03A9\\u03C3\\u03C4\\u03CC\\u03C3\\u03BF, \\u03BA\\u03B1\\u03B9 \\u03C3\\u03C4\\u03B7\\u03BD \\u03C0\\u03B5\\u03C1\\u03AF\\u03C0\\u03C4\\u03C9\\u03C3\\u03B7 \\u03B1\\u03C5\\u03C4\\u03AE \\u03BC\\u03C0\\u03BF\\u03C1\\u03B5\\u03AF \\u03BD\\u03B1 \\u03C7\\u03C1\\u03B7\\u03C3\\u03B9\\u03BC\\u03BF\\u03C0\\u03BF\\u03B9\\u03B7\\u03B8\\u03B5\\u03AF \\u03BA\\u03B1\\u03B9 \\u03B5\\u03BD\\u03C9\\u03C4\\u03B9\\u03BA\\u03CC\\u00BB. \\u039F \\u03AF\\u03B4\\u03B9\\u03BF\\u03C2 \\u03BA\\u03B1\\u03BD\\u03CC\\u03BD\\u03B1\\u03C2 \\u03B3\\u03B9\\u03B1 \\u03C4\\u03B1 \\u03B1\\u03C1\\u03B9\\u03B8\\u03BC\\u03B7\\u03C4\\u03B9\\u03BA\\u03AC \\u03B4\\u03B9\\u03B1\\u03C3\\u03C4\\u03AE\\u03BC\\u03B1\\u03C4\\u03B1 \\u03B5\\u03BC\\u03C6\\u03B1\\u03BD\\u03AF\\u03B6\\u03B5\\u03C4\\u03B1\\u03B9 \\u0394\\u03A5\\u039F \\u03A6\\u039F\\u03A1\\u0395\\u03A3 \\u03C3\\u03C4\\u03B7\\u03BD \\u00A710.1.8, \\u03BC\\u03AF\\u03B1 \\u03C3\\u03C4\\u03B7\\u03BD \\u03C5\\u03C0\\u03BF\\u03B5\\u03BD\\u03CC\\u03C4\\u03B7\\u03C4\\u03B1 \\u00AB\\u0395\\u03BD\\u03C9\\u03C4\\u03B9\\u03BA\\u03CC (-)\\u00BB \\u03BA\\u03B1\\u03B9 \\u03BC\\u03AF\\u03B1 \\u03C3\\u03C4\\u03B7\\u03BD \\u03C5\\u03C0\\u03BF\\u03B5\\u03BD\\u03CC\\u03C4\\u03B7\\u03C4\\u03B1 \\u00AB\\u03A0\\u03B1\\u03CD\\u03BB\\u03B1 \\u03BC\\u03B5\\u03C3\\u03B1\\u03AF\\u03BF\\u03C5 \\u03BC\\u03B5\\u03B3\\u03AD\\u03B8\\u03BF\\u03C5\\u03C2 (\\u2013)\\u00BB, \\u03BA\\u03B1\\u03B9 \\u03BA\\u03AC\\u03B8\\u03B5 \\u03C6\\u03BF\\u03C1\\u03AC \\u03B7 \\u03C5\\u03C0\\u03BF\\u03B5\\u03BD\\u03CC\\u03C4\\u03B7\\u03C4\\u03B1 \\u03C0\\u03B1\\u03C1\\u03B1\\u03C7\\u03C9\\u03C1\\u03B5\\u03AF \\u03C1\\u03B7\\u03C4\\u03AC \\u03C4\\u03BF \\u03AC\\u03BB\\u03BB\\u03BF \\u03C3\\u03B7\\u03BC\\u03B5\\u03AF\\u03BF (paraphrase of the \\u00AB\\u0395\\u03BD\\u03C9\\u03C4\\u03B9\\u03BA\\u03CC\\u00BB occurrence \\u2014 its verbatim text was not captured at review time; the \\u00AB\\u03A0\\u03B1\\u03CD\\u03BB\\u03B1\\u00BB occurrence is quoted above verbatim)\\u00B7 \\u03B3\\u03B9\\u03B1 \\u03C4\\u03B7\\u03BD \\u03C0\\u03B1\\u03C1\\u03B5\\u03BD\\u03B8\\u03B5\\u03C4\\u03B9\\u03BA\\u03AE \\u03C7\\u03C1\\u03AE\\u03C3\\u03B7, \\u00AB\\u038C\\u03C0\\u03C9\\u03C2 \\u03B7 \\u03C0\\u03B1\\u03C1\\u03AD\\u03BD\\u03B8\\u03B5\\u03C3\\u03B7, \\u03B7 \\u03B4\\u03B9\\u03C0\\u03BB\\u03AE \\u03C0\\u03B1\\u03CD\\u03BB\\u03B1 \\u03B4\\u03B5\\u03BD \\u03C7\\u03C9\\u03C1\\u03AF\\u03B6\\u03B5\\u03C4\\u03B1\\u03B9 \\u03BC\\u03B5 \\u03BA\\u03B5\\u03BD\\u03AC \\u03B4\\u03B9\\u03B1\\u03C3\\u03C4\\u03AE\\u03BC\\u03B1\\u03C4\\u03B1 \\u03B1\\u03C0\\u03CC \\u03C4\\u03B7 \\u03BB\\u03AD\\u03BE\\u03B7, \\u03C6\\u03C1\\u03AC\\u03C3\\u03B7 \\u03AE \\u03C0\\u03C1\\u03CC\\u03C4\\u03B1\\u03C3\\u03B7 \\u03C0\\u03BF\\u03C5 \\u03C0\\u03B5\\u03C1\\u03B9\\u03BA\\u03BB\\u03B5\\u03AF\\u03B5\\u03B9\\u00B7 \\u03B1\\u03BD\\u03C4\\u03AF\\u03B8\\u03B5\\u03C4\\u03B1, \\u03BC\\u03C0\\u03B1\\u03AF\\u03BD\\u03BF\\u03C5\\u03BD \\u03B4\\u03B9\\u03B1\\u03C3\\u03C4\\u03AE\\u03BC\\u03B1\\u03C4\\u03B1 \\u03C0\\u03C1\\u03B9\\u03BD \\u03B1\\u03C0\\u03CC \\u03C4\\u03B7\\u03BD \\u03C0\\u03C1\\u03CE\\u03C4\\u03B7 \\u03BA\\u03B1\\u03B9 \\u03BC\\u03B5\\u03C4\\u03AC \\u03C4\\u03B7 \\u03B4\\u03B5\\u03CD\\u03C4\\u03B5\\u03C1\\u03B7 \\u03C0\\u03B1\\u03CD\\u03BB\\u03B1\\u00BB\", url: \"http://publications.europa.eu/resource/cellar/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b.0015.03/DOC_2\", note: \"Justifies \\\"none\\\" on BOTH fields, which no other locale has \\u2014 but for TWO DIFFERENT REASONS, and conflating them would misrepresent the source. Range: genuinely ambivalent. The rule appears twice in \\u00A710.1.8, once under \\u00AB\\u0395\\u03BD\\u03C9\\u03C4\\u03B9\\u03BA\\u03CC (-)\\u00BB and once under \\u00AB\\u03A0\\u03B1\\u03CD\\u03BB\\u03B1 \\u03BC\\u03B5\\u03C3\\u03B1\\u03AF\\u03BF\\u03C5 \\u03BC\\u03B5\\u03B3\\u03AD\\u03B8\\u03BF\\u03C5\\u03C2 (\\u2013)\\u00BB, and each occurrence explicitly concedes the other mark. That mutual concession is the proof \\u2014 a source that names both forms in both places is not being vague, it is declining to rank them, and substituting either would express a preference the citation does not carry. Parenthetical: NOT ambivalent. The guide prescribes a U+2014 pair (its own header gives \\u00ABAlt 0151\\u00BB) with ordinary spaces outside the pair and none on the inner edges. \\\"none\\\" here is forced by a SCHEMA LIMIT, not by the source: locale.schema.json's dash enum has no value for asymmetric spacing \\u2014 \\\"em-spaced\\\" puts a space on each side of each dash, which is precisely what this sentence forbids. See spec/rules/dashes.md \\u00A76 \\u00ABel\\u00BB, which states the two justifications separately. SOURCE CONFLICT, recorded and deliberately not settled: this guide prescribes U+2014 for the parenthetical dash, while \\u03A5\\u03A0\\u0395\\u03A0\\u0398/\\u0399\\u03A4\\u03A5\\u0395 \\u0393\\u03C1\\u03B1\\u03BC\\u03BC\\u03B1\\u03C4\\u03B9\\u03BA\\u03AE \\u0391\\u0384\\u2013\\u0393\\u0384 \\u0393\\u03C5\\u03BC\\u03BD\\u03B1\\u03C3\\u03AF\\u03BF\\u03C5 \\u00A73.3 appears to set U+2013 in the same role. The sources array has no way to represent a conflict \\u2014 it models agreement, not disagreement \\u2014 so it is recorded here in prose. Resolving it is with the operator and needs a source that ranks the two, not a third that adds a form. Retrieved 2026-08-15.\" }, { rule: \"ellipsis\", cite: \"\\u0394\\u03B9\\u03BF\\u03C1\\u03B3\\u03B1\\u03BD\\u03B9\\u03BA\\u03CC \\u03B5\\u03B3\\u03C7\\u03B5\\u03B9\\u03C1\\u03AF\\u03B4\\u03B9\\u03BF \\u03C3\\u03CD\\u03BD\\u03C4\\u03B1\\u03BE\\u03B7\\u03C2 \\u03BA\\u03B5\\u03B9\\u03BC\\u03AD\\u03BD\\u03C9\\u03BD (EL, 2011), \\u00A710.1.9 \\u00AB\\u0391\\u03C0\\u03BF\\u03C3\\u03B9\\u03C9\\u03C0\\u03B7\\u03C4\\u03B9\\u03BA\\u03AC\\u00BB: \\u00AB\\u03A4\\u03B1 \\u03B1\\u03C0\\u03BF\\u03C3\\u03B9\\u03C9\\u03C0\\u03B7\\u03C4\\u03B9\\u03BA\\u03AC, \\u03C0\\u03BF\\u03C5 \\u03B5\\u03AF\\u03BD\\u03B1\\u03B9 \\u03C0\\u03AC\\u03BD\\u03C4\\u03BF\\u03C4\\u03B5 \\u03C4\\u03C1\\u03B5\\u03B9\\u03C2 (\\u03BA\\u03B1\\u03B9 \\u03CC\\u03C7\\u03B9 \\u03C0\\u03B5\\u03C1\\u03B9\\u03C3\\u03C3\\u03CC\\u03C4\\u03B5\\u03C1\\u03B5\\u03C2) \\u03C4\\u03B5\\u03BB\\u03B5\\u03AF\\u03B5\\u03C2, \\u03C7\\u03C1\\u03B7\\u03C3\\u03B9\\u03BC\\u03BF\\u03C0\\u03BF\\u03B9\\u03BF\\u03CD\\u03BD\\u03C4\\u03B1\\u03B9 \\u03BA\\u03C5\\u03C1\\u03AF\\u03C9\\u03C2: [\\u2026]\\u00BB\\u00B7 \\u03C0\\u03B1\\u03C1\\u03B1\\u03C4\\u03AE\\u03C1\\u03B7\\u03C3\\u03B7 ii): \\u00AB\\u039C\\u03B5\\u03C4\\u03B1\\u03BE\\u03CD \\u03C4\\u03C9\\u03BD \\u03B1\\u03C0\\u03BF\\u03C3\\u03B9\\u03C9\\u03C0\\u03B7\\u03C4\\u03B9\\u03BA\\u03CE\\u03BD \\u03BA\\u03B1\\u03B9 \\u03C4\\u03B7\\u03C2 \\u03BB\\u03AD\\u03BE\\u03B7\\u03C2 \\u03C0\\u03BF\\u03C5 \\u03C0\\u03C1\\u03BF\\u03B7\\u03B3\\u03B5\\u03AF\\u03C4\\u03B1\\u03B9 \\u03B4\\u03B5\\u03BD \\u03B1\\u03C6\\u03AE\\u03BD\\u03BF\\u03C5\\u03BC\\u03B5 \\u03B4\\u03B9\\u03AC\\u03C3\\u03C4\\u03B7\\u03BC\\u03B1\\u00BB\\u00B7 \\u03C0\\u03B1\\u03C1\\u03B1\\u03C4\\u03AE\\u03C1\\u03B7\\u03C3\\u03B7 iii): \\u00AB\\u038C\\u03C4\\u03B1\\u03BD \\u03C4\\u03B1 \\u03B1\\u03C0\\u03BF\\u03C3\\u03B9\\u03C9\\u03C0\\u03B7\\u03C4\\u03B9\\u03BA\\u03AC \\u03B2\\u03C1\\u03AF\\u03C3\\u03BA\\u03BF\\u03BD\\u03C4\\u03B1\\u03B9 \\u03C3\\u03C4\\u03BF \\u03C4\\u03AD\\u03BB\\u03BF\\u03C2 \\u03C4\\u03B7\\u03C2 \\u03C0\\u03B5\\u03C1\\u03B9\\u03CC\\u03B4\\u03BF\\u03C5 \\u03B4\\u03B5\\u03BD \\u03C0\\u03C1\\u03BF\\u03C3\\u03B8\\u03AD\\u03C4\\u03BF\\u03C5\\u03BC\\u03B5 \\u03C4\\u03B5\\u03BB\\u03B5\\u03AF\\u03B1\\u00BB\", url: \"http://publications.europa.eu/resource/cellar/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b.0015.03/DOC_2\", note: \"Justifies abbreviatedAfterTerminal = false. The source requires exactly three dots always and nowhere provides for the two-dot form after \\u00AB?\\u00BB or \\u00AB!\\u00BB that Russian uses, so the Russian branch of spec/rules/ellipsis.md must stay off for Greek. Corroborated by \\u0393\\u03C1\\u03B1\\u03BC\\u03BC\\u03B1\\u03C4\\u03B9\\u03BA\\u03AE \\u0391\\u0384\\u2013\\u0393\\u0384 \\u0393\\u03C5\\u03BC\\u03BD\\u03B1\\u03C3\\u03AF\\u03BF\\u03C5 \\u00A73.3: \\u00AB\\u039F\\u03B9 \\u03C3\\u03B7\\u03BC\\u03B5\\u03B9\\u03BF\\u03CD\\u03BC\\u03B5\\u03BD\\u03B5\\u03C2 \\u03C4\\u03B5\\u03BB\\u03B5\\u03AF\\u03B5\\u03C2 \\u03B5\\u03AF\\u03BD\\u03B1\\u03B9 \\u03C0\\u03AC\\u03BD\\u03C4\\u03B1 \\u03C4\\u03C1\\u03B5\\u03B9\\u03C2\\u00BB. Neither source gives any rule for \\u03B1\\u03C0\\u03BF\\u03C3\\u03B9\\u03C9\\u03C0\\u03B7\\u03C4\\u03B9\\u03BA\\u03AC meeting the \\u03B5\\u03C1\\u03C9\\u03C4\\u03B7\\u03BC\\u03B1\\u03C4\\u03B9\\u03BA\\u03CC or the \\u03B8\\u03B1\\u03C5\\u03BC\\u03B1\\u03C3\\u03C4\\u03B9\\u03BA\\u03CC \\u2014 checked specifically, in the Ministry of Education grammar and in the \\u039A\\u03AD\\u03BD\\u03C4\\u03C1\\u03BF \\u0395\\u03BB\\u03BB\\u03B7\\u03BD\\u03B9\\u03BA\\u03AE\\u03C2 \\u0393\\u03BB\\u03CE\\u03C3\\u03C3\\u03B1\\u03C2 materials \\u2014 so the engine's TERMINAL class is deliberately left as {U+0021, U+003F} and the Greek U+003B is not added to it (spaces.md \\u00A77.8; adding it would also regress Russian, where \\u041B\\u043E\\u043F\\u0430\\u0442\\u0438\\u043D \\u00A7154 ties the two-dot form to \\u00AB?\\u00BB and \\u00AB!\\u00BB by name). Neither source addresses U+2026 versus three U+002E; that choice is the engine's, made identically in every locale, and is not claimed here. KNOWN DIVERGENCE, recorded because a verified source and the engine disagree and neither may stand unremarked: the same \\u00A710.1.9, \\u03C0\\u03B1\\u03C1\\u03B1\\u03C4\\u03AE\\u03C1\\u03B7\\u03C3\\u03B7 ii), states \\u00AB\\u039C\\u03B5\\u03C4\\u03B1\\u03BE\\u03CD \\u03C4\\u03C9\\u03BD \\u03B1\\u03C0\\u03BF\\u03C3\\u03B9\\u03C9\\u03C0\\u03B7\\u03C4\\u03B9\\u03BA\\u03CE\\u03BD \\u03BA\\u03B1\\u03B9 \\u03C4\\u03B7\\u03C2 \\u03BB\\u03AD\\u03BE\\u03B7\\u03C2 \\u03C0\\u03BF\\u03C5 \\u03C0\\u03C1\\u03BF\\u03B7\\u03B3\\u03B5\\u03AF\\u03C4\\u03B1\\u03B9 \\u03B4\\u03B5\\u03BD \\u03B1\\u03C6\\u03AE\\u03BD\\u03BF\\u03C5\\u03BC\\u03B5 \\u03B4\\u03B9\\u03AC\\u03C3\\u03C4\\u03B7\\u03BC\\u03B1\\u00BB - no space between the ellipsis and the preceding word - and polytypo does NOT honour it. spec/rules/spaces.md \\u00A73.4 preserves a space before a dot run in EVERY locale, so \\u00AB\\u03A0\\u03C1\\u03AC\\u03B3\\u03BC\\u03B1\\u03C4\\u03B9 \\u2026\\u00BB is returned as typed. The divergence is deliberate and argued in spaces.md \\u00A77.9 and ellipsis.md \\u00A76: honouring it needs either locale data in a rule that has none by design, or an ellipsis rule that deletes rather than replaces, which changes that rule's kind and forces a new composition argument. It would be revisited if a second locale wanted the same behaviour, at which point the shape is an ellipsis.noSpaceBefore flag consumed by the ellipsis rule. The source is right about Greek; the engine is declining to act on it, not disputing it. Retrieved 2026-08-15.\" }, { rule: \"spaces\", cite: \"\\u0394\\u03B9\\u03BF\\u03C1\\u03B3\\u03B1\\u03BD\\u03B9\\u03BA\\u03CC \\u03B5\\u03B3\\u03C7\\u03B5\\u03B9\\u03C1\\u03AF\\u03B4\\u03B9\\u03BF \\u03C3\\u03CD\\u03BD\\u03C4\\u03B1\\u03BE\\u03B7\\u03C2 \\u03BA\\u03B5\\u03B9\\u03BC\\u03AD\\u03BD\\u03C9\\u03BD (EL, 2011), \\u00A710.1.4 \\u00AB\\u0394\\u03B9\\u03C0\\u03BB\\u03AE \\u03C4\\u03B5\\u03BB\\u03B5\\u03AF\\u03B1\\u00BB, \\u03C0\\u03B1\\u03C1\\u03B1\\u03C4\\u03AE\\u03C1\\u03B7\\u03C3\\u03B7 iv): \\u00AB\\u03A3\\u03C4\\u03B1 \\u03B5\\u03BB\\u03BB\\u03B7\\u03BD\\u03B9\\u03BA\\u03AC, \\u03C0\\u03C1\\u03B9\\u03BD \\u03B1\\u03C0\\u03CC \\u03C4\\u03B7 \\u03B4\\u03B9\\u03C0\\u03BB\\u03AE \\u03C4\\u03B5\\u03BB\\u03B5\\u03AF\\u03B1 \\u03B4\\u03B5\\u03BD \\u03C0\\u03C1\\u03AD\\u03C0\\u03B5\\u03B9 \\u03BD\\u03B1 \\u03C5\\u03C0\\u03AC\\u03C1\\u03C7\\u03B5\\u03B9 \\u03B4\\u03B9\\u03AC\\u03C3\\u03C4\\u03B7\\u03BC\\u03B1 (\\u03C0\\u03C1\\u03AC\\u03B3\\u03BC\\u03B1 \\u03C0\\u03BF\\u03C5 \\u03C3\\u03C5\\u03BC\\u03B2\\u03B1\\u03AF\\u03BD\\u03B5\\u03B9, \\u03C0.\\u03C7., \\u03C3\\u03C4\\u03B1 \\u03B3\\u03B1\\u03BB\\u03BB\\u03B9\\u03BA\\u03AC)\\u00BB\\u00B7 \\u00A710.1.3 \\u00AB\\u0386\\u03BD\\u03C9 \\u03C4\\u03B5\\u03BB\\u03B5\\u03AF\\u03B1\\u00BB, \\u03C0\\u03B1\\u03C1\\u03B1\\u03C4\\u03B7\\u03C1\\u03AE\\u03C3\\u03B5\\u03B9\\u03C2 ii) \\u03BA\\u03B1\\u03B9 iii): \\u00AB\\u03A3\\u03C4\\u03B1 \\u03B5\\u03BB\\u03BB\\u03B7\\u03BD\\u03B9\\u03BA\\u03AC, \\u03C0\\u03C1\\u03B9\\u03BD \\u03B1\\u03C0\\u03CC \\u03C4\\u03B7\\u03BD \\u03AC\\u03BD\\u03C9 \\u03C4\\u03B5\\u03BB\\u03B5\\u03AF\\u03B1 \\u03B4\\u03B5\\u03BD \\u03C0\\u03C1\\u03AD\\u03C0\\u03B5\\u03B9 \\u03BD\\u03B1 \\u03C5\\u03C0\\u03AC\\u03C1\\u03C7\\u03B5\\u03B9 \\u03B4\\u03B9\\u03AC\\u03C3\\u03C4\\u03B7\\u03BC\\u03B1\\u00BB\\u00B7 \\u00AB\\u039C\\u03B5\\u03C4\\u03AC \\u03C4\\u03B7\\u03BD \\u03AC\\u03BD\\u03C9 \\u03C4\\u03B5\\u03BB\\u03B5\\u03AF\\u03B1 \\u03B1\\u03C1\\u03C7\\u03AF\\u03B6\\u03BF\\u03C5\\u03BC\\u03B5 \\u03BC\\u03B5 \\u03BC\\u03B9\\u03BA\\u03C1\\u03CC \\u03B3\\u03C1\\u03AC\\u03BC\\u03BC\\u03B1\\u00BB\", url: \"http://publications.europa.eu/resource/cellar/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b.0015.03/DOC_2\", note: \"Note the exact standing of this citation, because it is weaker than the claim it is often read as supporting. Neither passage is about the \\u03B5\\u03C1\\u03C9\\u03C4\\u03B7\\u03BC\\u03B1\\u03C4\\u03B9\\u03BA\\u03CC: they are about the colon and the \\u03AC\\u03BD\\u03C9 \\u03C4\\u03B5\\u03BB\\u03B5\\u03AF\\u03B1. What they establish is that Greek denies the French space-before-punctuation pattern, by name, for the marks they do cover. No source examined addresses spacing before the Greek question mark specifically, so the position is \\\"no source contradicts it\\\", NOT \\\"a source requires it\\\". Nothing rests on the difference: the Greek question mark is written U+003B, which spec/rules/spaces.md lists in STRIP-BEFORE for the Latin semicolon on its own merits, so the space is stripped under the Latin reading alone and no Greek-specific decision is being made (spaces.md \\u00A73.5 part 2). The \\u00A76.4 spacing table is deliberately NOT offered as corroboration here \\u2014 the nbsp source in this same file rejects \\u00A76.4 as publisher house style rather than evidence about Greek, and it cannot be house style there and evidence here. Retrieved 2026-08-15.\" }, { rule: \"nbsp\", cite: \"\\u0394\\u03B9\\u03BF\\u03C1\\u03B3\\u03B1\\u03BD\\u03B9\\u03BA\\u03CC \\u03B5\\u03B3\\u03C7\\u03B5\\u03B9\\u03C1\\u03AF\\u03B4\\u03B9\\u03BF \\u03C3\\u03CD\\u03BD\\u03C4\\u03B1\\u03BE\\u03B7\\u03C2 \\u03BA\\u03B5\\u03B9\\u03BC\\u03AD\\u03BD\\u03C9\\u03BD (EL, 2011), \\u00A710.1.4 \\u03C0\\u03B1\\u03C1\\u03B1\\u03C4\\u03AE\\u03C1\\u03B7\\u03C3\\u03B7 iv) \\u03BA\\u03B1\\u03B9 \\u00A710.1.3 \\u03C0\\u03B1\\u03C1\\u03B1\\u03C4\\u03AE\\u03C1\\u03B7\\u03C3\\u03B7 ii) (\\u03CC.\\u03C0., \\u03C1\\u03B7\\u03C4\\u03AE \\u03B1\\u03BD\\u03C4\\u03B9\\u03C0\\u03B1\\u03C1\\u03B1\\u03B2\\u03BF\\u03BB\\u03AE \\u03BC\\u03B5 \\u03C4\\u03B1 \\u03B3\\u03B1\\u03BB\\u03BB\\u03B9\\u03BA\\u03AC)\\u00B7 \\u00A710.6 \\u00AB\\u03A3\\u03C5\\u03BD\\u03C4\\u03BF\\u03BC\\u03BF\\u03B3\\u03C1\\u03B1\\u03C6\\u03AF\\u03B5\\u03C2\\u00BB, \\u03B3\\u03B5\\u03BD\\u03B9\\u03BA\\u03CC\\u03C2 \\u03BA\\u03B1\\u03BD\\u03CC\\u03BD\\u03B1\\u03C2 \\u03B3): \\u00AB\\u03A3\\u03C4\\u03B9\\u03C2 \\u03B5\\u03BB\\u03BB\\u03B7\\u03BD\\u03B9\\u03BA\\u03AD\\u03C2 \\u03C3\\u03C5\\u03BD\\u03C4\\u03BF\\u03BC\\u03BF\\u03B3\\u03C1\\u03B1\\u03C6\\u03AF\\u03B5\\u03C2 \\u03BC\\u03B5 \\u03C4\\u03B9\\u03C2 \\u03BF\\u03C0\\u03BF\\u03AF\\u03B5\\u03C2 \\u03C3\\u03C5\\u03BD\\u03C4\\u03AD\\u03BC\\u03BD\\u03BF\\u03BD\\u03C4\\u03B1\\u03B9 \\u03C6\\u03C1\\u03AC\\u03C3\\u03B5\\u03B9\\u03C2 \\u03C0\\u03BF\\u03C5 \\u03B1\\u03C0\\u03BF\\u03C4\\u03B5\\u03BB\\u03BF\\u03CD\\u03BD\\u03C4\\u03B1\\u03B9 \\u03B1\\u03C0\\u03CC \\u03C0\\u03B5\\u03C1\\u03B9\\u03C3\\u03C3\\u03CC\\u03C4\\u03B5\\u03C1\\u03B5\\u03C2 \\u03C4\\u03B7\\u03C2 \\u03BC\\u03AF\\u03B1\\u03C2 \\u03BB\\u03AD\\u03BE\\u03B5\\u03B9\\u03C2 \\u03BC\\u03C0\\u03B1\\u03AF\\u03BD\\u03B5\\u03B9 \\u03BA\\u03B1\\u03C4\\u03AC \\u03BA\\u03B1\\u03BD\\u03CC\\u03BD\\u03B1 \\u03C4\\u03B5\\u03BB\\u03B5\\u03AF\\u03B1 \\u03AD\\u03C0\\u03B5\\u03B9\\u03C4\\u03B1 \\u03B1\\u03C0\\u03CC \\u03BA\\u03AC\\u03B8\\u03B5 \\u03C3\\u03C5\\u03BD\\u03C4\\u03B5\\u03BC\\u03BD\\u03CC\\u03BC\\u03B5\\u03BD\\u03B7 \\u03BB\\u03AD\\u03BE\\u03B7\\u00BB (\\u03C0.\\u03C7. \\u03BA.\\u03BB\\u03C0., \\u03C0.\\u03C7., \\u03C0\\u03C1\\u03B2\\u03BB., \\u03BA.\\u03BF.\\u03BA.)\", url: \"http://publications.europa.eu/resource/cellar/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b.0015.03/DOC_2\", note: \"Two empty lists closed by citation rather than by absence of one. beforePunctuation and narrowBeforePunctuation are empty because Greek takes neither U+00A0 nor U+202F before \\u00AB;\\u00BB \\u00AB:\\u00BB \\u00AB!\\u00BB \\u00AB\\u00B7\\u00BB \\u2014 the source denies the French practice by name. abbreviations is empty because Greek multi-word abbreviations appear to be written with no internal space at all (\\u03BA.\\u03BB\\u03C0., not \\u00AB\\u03BA. \\u03BB\\u03C0.\\u00BB), so there is no U+0020 for the rule to promote. INFERENCE, NOT CITATION: \\u00A710.6 \\u03B3) states only that a full stop follows each abbreviated word; it says nothing about spacing between them. The no-space form is visible in the guide's own printed examples and in no normative sentence examined. The list would be empty on the absence of a citation alone (docs/PLAN.md \\u00A76.1), so nothing rests on the inference \\u2014 it is labelled because an unlabelled inference in a cite field is the failure mode this field exists to prevent. The remaining lists are empty because no Greek normative source examined states a binding: the one candidate, the \\u00A76.4 table binding a number to \\u00AB%\\u00BB and \\u00AB\\u00B0C\\u00BB, sits in Part Three \\u2014 \\u00AB\\u03A3\\u03C5\\u03BC\\u03B2\\u03B1\\u03C4\\u03B9\\u03BA\\u03BF\\u03AF \\u03BA\\u03B1\\u03BD\\u03CC\\u03BD\\u03B5\\u03C2 \\u03BA\\u03BF\\u03B9\\u03BD\\u03BF\\u03AF \\u03B3\\u03B9\\u03B1 \\u039F\\u039B\\u0395\\u03A3 \\u03C4\\u03B9\\u03C2 \\u03B3\\u03BB\\u03CE\\u03C3\\u03C3\\u03B5\\u03C2\\u00BB \\u2014 whose own preamble says it replaced diverging national rules for uniform presentation, which makes it publisher house style rather than evidence about Greek. A missing citation is never a licence to guess (docs/PLAN.md \\u00A76.1). Observed usage does not contradict that reading, which is worth recording because it was checked rather than assumed: a byte-level scan on 2026-08-15 of the Greek-language home pages of kathimerini.gr, kathimerini.gr/economy, tovima.gr, tanea.gr, efsyn.gr, in.gr, naftemporiki.gr, protagon.gr, lifo.gr, meteo.gr, kedros.gr, onassis.org/el and emst.gr found 183 number-plus-unit occurrences \\u2014 140 \\u00AB%\\u00BB, 41 \\u00AB\\u00B0C\\u00BB, 2 \\u00AB\\u20AC\\u00BB \\u2014 and NOT ONE of them carried a space of any kind, no U+0020, no U+00A0. Greek web practice sets \\u00AB50%\\u00BB and \\u00AB20\\u00B0C\\u00BB tight, so beforeUnits would have nothing to promote even if it were populated. Method, so the figure can be re-derived rather than taken on trust: fetch each page, strip script, style and noscript elements and then all tags, decode HTML entities (so that becomes the U+00A0 it denotes rather than disappearing), and count matches of a digit followed by an optional single space character from {U+0020, U+00A0, U+202F, U+2009} followed by the unit. Pages carrying under 200 Greek letters were excluded as not being Greek-language content. That scan is an observation of usage, is not offered as a normative claim, and nothing in this file depends on it: the lists would be empty on the absence of a citation alone. Retrieved 2026-08-15.\" }, { rule: \"hyphen\", cite: \"\\u0394\\u03B9\\u03BF\\u03C1\\u03B3\\u03B1\\u03BD\\u03B9\\u03BA\\u03CC \\u03B5\\u03B3\\u03C7\\u03B5\\u03B9\\u03C1\\u03AF\\u03B4\\u03B9\\u03BF \\u03C3\\u03CD\\u03BD\\u03C4\\u03B1\\u03BE\\u03B7\\u03C2 \\u03BA\\u03B5\\u03B9\\u03BC\\u03AD\\u03BD\\u03C9\\u03BD (EL, 2011), \\u00A710.1.8, \\u03C5\\u03C0\\u03BF\\u03B5\\u03BD\\u03CC\\u03C4\\u03B7\\u03C4\\u03B1 \\u00AB\\u0395\\u03BD\\u03C9\\u03C4\\u03B9\\u03BA\\u03CC (-)\\u00BB: \\u00AB\\u0397 \\u03BC\\u03B9\\u03BA\\u03C1\\u03AE \\u03BF\\u03C1\\u03B9\\u03B6\\u03CC\\u03BD\\u03C4\\u03B9\\u03B1 \\u03C0\\u03B1\\u03CD\\u03BB\\u03B1, \\u03C4\\u03BF \\u03B2\\u03C1\\u03B1\\u03C7\\u03CD\\u03C4\\u03B5\\u03C1\\u03BF \\u03C3\\u03B5 \\u03BC\\u03AE\\u03BA\\u03BF\\u03C2 \\u03B1\\u03C0\\u03CC \\u03C4\\u03B1 \\u03C4\\u03C1\\u03AF\\u03B1 \\u03C3\\u03B7\\u03BC\\u03B5\\u03AF\\u03B1 [\\u2026] \\u03C3\\u03B7\\u03BC\\u03B5\\u03B9\\u03CE\\u03BD\\u03B5\\u03C4\\u03B1\\u03B9 \\u03C7\\u03C9\\u03C1\\u03AF\\u03C2 \\u03BA\\u03B5\\u03BD\\u03AC \\u03C3\\u03B5 \\u03C3\\u03C7\\u03AD\\u03C3\\u03B7 \\u03BC\\u03B5 \\u03CC,\\u03C4\\u03B9 \\u03C0\\u03C1\\u03BF\\u03B7\\u03B3\\u03B5\\u03AF\\u03C4\\u03B1\\u03B9 \\u03AE \\u03AD\\u03C0\\u03B5\\u03C4\\u03B1\\u03B9\\u00BB\", url: \"http://publications.europa.eu/resource/cellar/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b.0015.03/DOC_2\", note: \"Justifies all three lists being empty. The source describes what the hyphen does \\u2014 syllable division, numeric bounds, appositional compounds such as \\u00AB\\u03B1\\u03C0\\u03CC\\u03C6\\u03B1\\u03C3\\u03B7-\\u03C0\\u03BB\\u03B1\\u03AF\\u03C3\\u03B9\\u03BF\\u00BB \\u2014 without defining any closed list of morphological forms whose hyphen must resist a line break, which is the only thing this rule consumes. No Greek source examined defines one. Empty lists make the rule a provable total no-op for Greek (spec/rules/hyphen.md \\u00A72), which is the normal case, not a deficiency. Retrieved 2026-08-15.\" }, { rule: \"apostrophe\", cite: \"\\u03A5\\u03A0\\u0395\\u03A0\\u0398 / \\u0399\\u03BD\\u03C3\\u03C4\\u03B9\\u03C4\\u03BF\\u03CD\\u03C4\\u03BF \\u03A4\\u03B5\\u03C7\\u03BD\\u03BF\\u03BB\\u03BF\\u03B3\\u03AF\\u03B1\\u03C2 \\u03A5\\u03C0\\u03BF\\u03BB\\u03BF\\u03B3\\u03B9\\u03C3\\u03C4\\u03CE\\u03BD \\u03BA\\u03B1\\u03B9 \\u0395\\u03BA\\u03B4\\u03CC\\u03C3\\u03B5\\u03C9\\u03BD, \\u0393\\u03C1\\u03B1\\u03BC\\u03BC\\u03B1\\u03C4\\u03B9\\u03BA\\u03AE \\u039D\\u03AD\\u03B1\\u03C2 \\u0395\\u03BB\\u03BB\\u03B7\\u03BD\\u03B9\\u03BA\\u03AE\\u03C2 \\u0393\\u03BB\\u03CE\\u03C3\\u03C3\\u03B1\\u03C2 \\u0391\\u0384, \\u0392\\u0384, \\u0393\\u0384 \\u0393\\u03C5\\u03BC\\u03BD\\u03B1\\u03C3\\u03AF\\u03BF\\u03C5, \\u00A73.3 \\u00AB\\u0397 \\u03C3\\u03C4\\u03AF\\u03BE\\u03B7 \\u2014 \\u03A4\\u03B1 \\u03C3\\u03B7\\u03BC\\u03B5\\u03AF\\u03B1 \\u03C3\\u03C4\\u03AF\\u03BE\\u03B7\\u03C2\\u00BB: \\u00AB\\u0397 \\u03B1\\u03C0\\u03CC\\u03C3\\u03C4\\u03C1\\u03BF\\u03C6\\u03BF\\u03C2 ( \\u2019 ) \\u03C7\\u03C1\\u03B7\\u03C3\\u03B9\\u03BC\\u03BF\\u03C0\\u03BF\\u03B9\\u03B5\\u03AF\\u03C4\\u03B1\\u03B9 \\u03B3\\u03B9\\u03B1 \\u03BD\\u03B1 \\u03B4\\u03B7\\u03BB\\u03CE\\u03C3\\u03B5\\u03B9 \\u03CC\\u03C4\\u03B9 \\u03AD\\u03BD\\u03B1 \\u03C6\\u03C9\\u03BD\\u03AE\\u03B5\\u03BD \\u03AD\\u03C7\\u03B5\\u03B9 \\u03C0\\u03B1\\u03C1\\u03B1\\u03BB\\u03B5\\u03B9\\u03C6\\u03B8\\u03B5\\u03AF \\u03C3\\u03C4\\u03B7 \\u03B3\\u03C1\\u03B1\\u03C6\\u03AE \\u03BB\\u03CC\\u03B3\\u03C9 \\u03C4\\u03B7\\u03C2 \\u03C0\\u03C1\\u03BF\\u03C6\\u03BF\\u03C1\\u03AC\\u03C2\\u00BB\\u00B7 \\u03BA\\u03B1\\u03B9, \\u03B3\\u03B9\\u03B1 \\u03C4\\u03B7\\u03BD \\u03C4\\u03B1\\u03C5\\u03C4\\u03CC\\u03C4\\u03B7\\u03C4\\u03B1 \\u03C4\\u03BF\\u03C5 \\u03BA\\u03C9\\u03B4\\u03B9\\u03BA\\u03BF\\u03CD \\u03C3\\u03B7\\u03BC\\u03B5\\u03AF\\u03BF\\u03C5, The Unicode Standard 17.0, Core Specification, \\u00A76.2.7 \\u00ABApostrophes\\u00BB: \\u00ABWhen text is set, U+2019 RIGHT SINGLE QUOTATION MARK is preferred as apostrophe, but only U+0027 is present on most keyboards\\u00BB\", url: \"https://ebooks.edu.gr/ebooks/v/html/8547/2334/Grammatiki-Neas-Ellinikis-Glossas_A-B-G-Gymnasiou_html-apli/index_B_03.html\", note: \"Two sources for two separate facts. The Greek grammar establishes that elision and apocope (\\u03B3\\u03B9\\u2019 \\u03B1\\u03C5\\u03C4\\u03CC, \\u03B1\\u03C0\\u2019 \\u03C4\\u03B7\\u03BD, \\u03C3\\u2019 \\u03B1\\u03C5\\u03C4\\u03CC) are marked with an apostrophe; the code point comes only from Unicode, because no Greek normative source examined names one. U+02BC is refused: Unicode \\u00A76.2.7 reserves it for use as a modifier letter, e.g. a glottal stop in transliteration. U+0384 GREEK TONOS is refused: no source proposes a diacritic in this role. The rule reads no locale data, so this citation certifies rather than configures \\u2014 but Greek elision is the shape the rule most often meets in Greek text, and it earns a fixture. Retrieved 2026-08-15.\" }, { rule: \"symbols\", cite: \"Unicode Consortium, The Unicode Standard, Version 17.0, Core Specification, ch. 7 \\u00ABEurope-I\\u00BB, \\u00A77.2.1 Greek, \\u00ABCompatibility Punctuation\\u00BB, verbatim: \\u00ABTherefore, use of U+037E and U+0387 is not necessary for interoperating with legacy Greek data, and their use is not generally encouraged for representation of Greek punctuation.\\u00BB The preceding sentence of that subsection \\u2014 to the effect that the two characters have canonical equivalences to U+003B and U+00B7, so that normalised Greek text loses the distinction \\u2014 is given here as PARAPHRASE, not as quotation: it could not be confirmed word for word at review time. Its substance does not rest on the prose in any case; it is entailed directly by UnicodeData.txt, where U+037E carries the canonical decomposition mapping 003B and U+0387 carries 00B7, each as a singleton\", url: \"https://www.unicode.org/versions/Unicode17.0.0/core-spec/chapter-7/\", note: \"Code-point identity only, which is the one thing this source is authoritative for. Note the split standing of the citation: one sentence is verbatim, one is paraphrase backed by UnicodeData.txt rather than by the Core Specification's wording, and the file says which is which. Everything the rules do rests on the machine-readable field, not on the prose. The \\u03B5\\u03C1\\u03C9\\u03C4\\u03B7\\u03BC\\u03B1\\u03C4\\u03B9\\u03BA\\u03CC is written U+003B, not U+037E; the \\u03AC\\u03BD\\u03C9 \\u03C4\\u03B5\\u03BB\\u03B5\\u03AF\\u03B1 is written U+00B7, not U+0387. Consequence for the rules: no rule may emit U+037E or U+0387, and none may rewrite one to the character it decomposes to \\u2014 that is normalisation, forbidden by docs/ARCHITECTURE.md \\u00A74.3 and performed anyway by any downstream NFC pass. The full argument, including why U+00B7 must not join the spaces rule's STRIP-BEFORE set, is in spec/rules/spaces.md \\u00A73.5. Retrieved 2026-08-15.\" }] },\n \"en-GB\": { locale: \"en-GB\", name: \"English (United Kingdom)\", quotes: { primary: { open: \"\\u2018\", close: \"\\u2019\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [\"s\"] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [\"%\", \"kg\", \"g\", \"mg\", \"km\", \"m\", \"cm\", \"mm\", \"mi\", \"ft\", \"lb\", \"oz\", \"L\", \"mL\", \"h\", \"min\", \"s\", \"ms\", \"\\u00B0C\", \"\\u00B0F\", \"kB\", \"MB\", \"GB\", \"TB\", \"kW\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [], initialBinding: \"none\" }, sources: [{ rule: \"quotes\", cite: \"University of Oxford Style Guide, section \\u201CQuotation marks\\u201D\", url: \"https://www.ox.ac.uk/about/the-university/brand/style-guide/punctuation\", note: \"Verbatim: \\u201CUse single quotation marks for direct speech or a quote, and double quotation marks for direct speech or a quote within that.\\u201D Example given: \\u2018I have never been to Norway,\\u2019 he said, \\u2018but I have heard it described as \\u201Cthe Wales of the North\\u201D.\\u2019 This settles the \\u2753 in PLAN.md \\u00A77 in favour of single-first. The convention is genuinely divided in British practice \\u2014 several national newspapers and trade publishers set double-first \\u2014 but the cited Oxford authority (and New Hart\\u2019s Rules behind it) is unambiguous, and citation, not head-count, is the tie-breaker per ARCHITECTURE.md \\u00A78.\" }, { rule: \"dashes\", cite: \"University of Oxford Style Guide, section \\u201CDashes and hyphens\\u201D\", url: \"https://www.ox.ac.uk/about/the-university/brand/style-guide/punctuation\", note: \"Verbatim, m-dash (\\u2014): \\u201CDo not use; use an n-dash instead.\\u201D n-dash (\\u2013): \\u201CUse in a pair in place of round brackets or commas, surrounded by spaces\\u201D (example: \\u201CIt was \\u2013 as far as I could tell \\u2013 the only example of its kind.\\u201D), and \\u201CUse to link concepts or ranges of numbers, with no spaces either side\\u201D (example: \\u201CThe salary for the post is \\u00A325,000\\u2013\\u00A330,000.\\u201D). Corroborated by CMOS Shop Talk, 23 January 2024: \\u201CIn British style, spaced en dashes \\u2013 like this \\u2013 are more common.\\u201D\" }, { rule: \"ellipsis\", cite: \"University of Oxford Style Guide, section \\u201CEllipsis\\u201D\", url: \"https://www.ox.ac.uk/about/the-university/brand/style-guide/punctuation\", note: \"`abbreviatedAfterTerminal` is false. The Oxford guide describes the ellipsis as a single mark used for omitted text, a pause or a trailing off, and notes \\u201Can exclamation mark or a question mark can and should follow the ellipsis if required\\u201D \\u2014 i.e. no merged two-dot form after terminal punctuation. That form is Russian-only.\" }, { rule: \"nbsp\", cite: \"BIPM, The International System of Units (SI), 9th ed. (2019), concise summary, \\u201CThe language of science: using the SI to express the values of quantities\\u201D\", url: \"https://www.bipm.org/documents/20126/41483022/SI-Brochure-9-concise-EN.pdf\", note: \"Verbatim: \\u201CA single space is always left between the number and the unit.\\u201D Used here because the University of Oxford Style Guide sets measurements closed up (\\u201CThe average height of a woman in the UK is 1.61m.\\u201D, \\u201Cworth 10% of the available marks\\u201D) and is therefore silent on binding a space it does not itself write. The nbsp rule never inserts a space \\u2014 it only makes an author-typed space non-breaking \\u2014 so the two positions do not conflict.\" }, { rule: \"nbsp\", cite: \"University of Oxford Style Guide, \\u201CSpecific abbreviations \\u2014 people\\u2019s initials\\u201D\", url: \"https://www.ox.ac.uk/about/the-university/brand/style-guide/punctuation\", note: \"`initialBinding` is \\\"none\\\" (spec 0.6.0: the field used to be the boolean bindInitials, false). Oxford says only \\u201CUse a space to separate each initial\\u201D (examples: J R R Tolkien, C S Lewis \\u2014 note, without full stops). No British authority consulted prescribes a non-breaking space there, so the true value is set rather than inferred from the American rule. Deliberate divergence from en-US, where Chicago states the nonbreaking space explicitly.\" }, { rule: \"nbsp\", cite: \"No normative source found for English short-word binding; lists deliberately empty\", note: \"`afterShortWords`, `beforePunctuation`, `narrowBeforePunctuation`, `abbreviations` and `afterSymbols` are empty by design. Oxford instructs \\u201Cclose up spaces and don\\u2019t use full stops in abbreviations (eg 6pm)\\u201D, so there are no multi-token abbreviations with internal spaces to bind.\" }, { rule: \"nbsp\", cite: \"University of Oxford Style Guide, \\u201CAbbreviations, contractions and acronyms\\u201D\", url: \"https://www.ox.ac.uk/about/the-university/brand/style-guide/punctuation\", note: \"`beforeNumber` and `beforeWord` are empty. Oxford says \\u201CDon\\u2019t use full stops after any abbreviations, contractions or acronyms\\u201D, so the British forms this field would hold (p., no., fig., ch., Mr., Dr.) are not even written with a full stop in this style, and nothing in the guide requires a non-breaking space after them. Per PLAN.md \\u00A77 the Mr./Dr. + name binding is an optional rule defaulting off; with no per-entry toggle in the schema, and no normative source requiring it, the honest value is an empty list.\" }, { rule: \"hyphen\", cite: \"No English authority prescribes non-breaking hyphens for particular word forms; lists deliberately empty\", note: \"`prefixes`, `suffixes` and `compounds` are empty. The field exists for languages with a closed, normative set of hyphenated morphological forms (Russian \\u043A\\u043E\\u0435-, -\\u0442\\u0430\\u043A\\u0438, \\u0438\\u0437-\\u043F\\u043E\\u0434). The Oxford guide\\u2019s hyphen section describes when to hyphenate (adjectival phrases before a noun, verb participles) and never restricts breaking at the resulting hyphen. An English list here would be an invented sample.\" }, { rule: \"quotes\", cite: \"The Chicago Manual of Style, 7.16 \\u201CPossessive form of most nouns\\u201D (section number and title confirmed against the publisher's own chapter-7 table of contents; cited as 7.16\\u201319 and 7.22 by the CMOS Q&A on the 18th-edition site). Verbatim, as reproduced by CMOS Shop Talk, \\u201CSection 7.16 in the Spotlight\\u201D, 12 May 2015: \\u201CThe possessive of most singular nouns is formed by adding an apostrophe and an s.\\u201D Reconfirmed for the current edition by CMOS Shop Talk, 31 August 2021: \\u201CChicago adds an apostrophe and an s to form the possessive of a singular noun, including singular nouns ending in s\\u201D (see CMOS 7.16)\", url: \"https://cmosshoptalk.com/2021/08/31/introducing-the-chicago-manual-of-style-for-perfectit/\", note: \"Supports quotes.elisionClitics.after = [\\\"s\\\"], identical to en-US. LABELLED GAP: en-GB rests on an American authority because no British one was reachable. New Hart's Rules: The Oxford Style Guide (ed. Anne Waddingham, OUP) is print and paywalled; ox.ac.uk's style guide returned HTTP 403, OUP's own free companion site for New Hart's Rules returned an empty body, and Oxford Reference is paywalled. Every British statement of the rule found was a third-party paraphrase and therefore not citable. The gap is narrow rather than papered over: the single point on which US and UK possessive practice actually diverges is whether a second s follows a sibilant (Dickens's, Chicago's preference per 7.16\\u201319, versus Dickens', the alternative practice per 7.22), and that divergence cannot reach this entry, because the veto matches the maximal LETTER run to the RIGHT of the mark \\u2014 Burns's fires on s, Burns' has no letter there and fires nothing. So the two locales take the identical entry not by assumption but because the two practices coincide wherever this field is consulted. Replace with New Hart's Rules if the book is obtained. Note also that en-GB's primary close is U+2019, so this is the locale where a wrong entry could collide with genuine quotation \\u2014 a one-element list is the minimum that closes issue #53.\" }] },\n \"en-US\": { locale: \"en-US\", name: \"English (United States)\", quotes: { primary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2018\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [{ left: \"rock\", elided: \"n\", right: \"roll\" }], elisionClitics: { before: [], after: [\"s\"] } }, dash: { parenthetical: \"em-tight\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [\"%\", \"kg\", \"g\", \"mg\", \"km\", \"m\", \"cm\", \"mm\", \"mi\", \"ft\", \"lb\", \"oz\", \"L\", \"mL\", \"h\", \"min\", \"s\", \"ms\", \"\\u00B0C\", \"\\u00B0F\", \"kB\", \"MB\", \"GB\", \"TB\", \"kW\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [], initialBinding: \"chain\" }, sources: [{ rule: \"quotes\", cite: \"The Chicago Manual of Style, 18th ed., 6.11 (quotations within quotations); CMOS Q&A, topic \\u201CQuotations\\u201D\", url: \"https://www.chicagomanualofstyle.org/qanda/data/faq/topics/Quotations/faq0025.html\", note: \"US practice: double quotation marks at the first level, single at the second. CMOS 6.11: \\u201CWhen single quotation marks are nested within double quotation marks, and two of the marks appear next to each other, a space between the two marks, though not strictly required, aids legibility.\\u201D That optional legibility space is a typesetting refinement and is not expressed in this file.\" }, { rule: \"quotes\", cite: \"Chicago Manual of Style Online Q&A, topic \\u201CSpecial Characters\\u201D: \\u201CIf you want, for example, an apostrophe rather than an opening single quotation mark at the beginning of a string (e.g., the apostrophe before the n in \\u201Crock \\u2019n\\u2019 roll\\u201D), you must tell the computer that that's what you want.\\u201D\", url: \"https://www.chicagomanualofstyle.org/qanda/data/faq/topics/SpecialCharacters/faq0002.html\", note: \"Supports quotes.elisionIdioms = [{ left: \\\"rock\\\", elided: \\\"n\\\", right: \\\"roll\\\" }]: the leading mark of the elision must not be resolved as an opening quotation mark. CMOS states the mark's function, not a code point; U+2019 follows from spec/rules/apostrophe.md, which is unchanged. Reproduced verbatim, including CMOS's own U+2019 in \\u201Crock \\u2019n\\u2019 roll\\u201D \\u2014 not straightened to U+0027 \\u2014 because it is a direct quotation of the source's printed text. Edition/section not fully cited: the page reports 17th ed. in-body while the site titles itself 18th ed., and the numbered CMOS section is paywalled.\" }, { rule: \"quotes\", cite: \"American Heritage Dictionary of the English Language, entry \\u201Crock and roll\\u201D: headword line \\u201Crock-and-roll or rock 'n' roll\\u201D, the elided variant spaced as rock 'n' roll with a mark on each side of the bare word n.\", url: \"https://www.ahdictionary.com/word/search.html?q=rock+and+roll\", note: \"Attests the spaced two-mark orthography of the \\\"rock\\\"/\\\"n\\\"/\\\"roll\\\" idiom only \\u2014 this citation supports no other elisionIdioms entry. In particular it does not attest \\\"fish 'n' chips\\\", which is not listed here and would need its own citation before being added; the field is a closed set of individually evidenced idioms, not a general elision-word list.\" }, { rule: \"dashes\", cite: \"The Chicago Manual of Style \\u2014 CMOS Shop Talk, \\u201CHyphens and Dashes: A Refresher\\u201D, 23 January 2024\", url: \"https://cmosshoptalk.com/2024/01/23/hyphens-and-dashes-a-refresher/\", note: \"Verbatim: \\u201CIn Chicago style, such dashes consist of em dashes\\u2014like this\\u2014with no space before or after.\\u201D And: \\u201CWhen consecutive digits express a range, however, they are separated in Chicago style not by hyphens but by en dashes, as in the range 3\\u20135.\\u201D\" }, { rule: \"ellipsis\", cite: \"The Chicago Manual of Style, 18th ed., ellipses (three dots)\", url: \"https://cmosshoptalk.com/2021/06/15/navigating-spaces-in-manuscripts-and-beyond/\", note: \"`abbreviatedAfterTerminal` is false: the two-dot form after `!`/`?` is a Russian convention with no counterpart in English usage. Chicago\\u2019s spaced ellipsis (. . .) is a print-typesetting variant, not a separate character sequence this spec models.\" }, { rule: \"nbsp\", cite: \"The Chicago Manual of Style \\u2014 CMOS Shop Talk, \\u201CNavigating Spaces in Manuscripts and Beyond\\u201D, 15 June 2021\", url: \"https://cmosshoptalk.com/2021/06/15/navigating-spaces-in-manuscripts-and-beyond/\", note: \"Chicago recommends a nonbreaking space \\u201Cbetween two or more initials in a name like \\u2018E. B. White\\u2019\\u201D (hence initialBinding: \\\"chain\\\" \\u2014 spec 0.6.0: the field used to be the boolean bindInitials; Chicago's own \\u201Ctwo or more\\u201D wording is the citation for the chain requirement, not merely for turning N7 on) and \\u201Cbetween a numeral and an abbreviated unit of measure, as in \\u201810 kg\\u2019\\u201D (hence beforeUnits).\" }, { rule: \"nbsp\", cite: \"BIPM, The International System of Units (SI), 9th ed. (2019), concise summary, \\u201CThe language of science: using the SI to express the values of quantities\\u201D\", url: \"https://www.bipm.org/documents/20126/41483022/SI-Brochure-9-concise-EN.pdf\", note: \"Verbatim: \\u201CA single space is always left between the number and the unit.\\u201D This is the authority for the unit list itself; Chicago is the authority for making that space non-breaking. `%` is included even though Chicago sets percentages closed up (45%): the rule only converts a space the author already typed, and a spaced `45 %` in English is a deliberate scientific-style choice worth binding.\" }, { rule: \"nbsp\", cite: \"No normative source found for English short-word binding; list deliberately empty\", note: \"`afterShortWords`, `beforePunctuation` and `narrowBeforePunctuation` are empty by design. English typography has no equivalent of the Russian rule against leaving short prepositions at line end, and no English authority prescribes a space before terminal punctuation. `afterSymbols` is empty because no consulted source states that `\\u00A7`/`\\u2116` bind to a following number in English.\" }, { rule: \"hyphen\", cite: \"No English authority prescribes non-breaking hyphens for particular word forms; lists deliberately empty\", note: \"`prefixes`, `suffixes` and `compounds` are empty. This field exists for languages with a closed, normative set of hyphenated morphological forms (Russian \\u043A\\u043E\\u0435-, -\\u0442\\u0430\\u043A\\u0438, \\u0438\\u0437-\\u043F\\u043E\\u0434). English hyphenation is productive and open-ended \\u2014 self-, ex-, -like, well-known and thousands more \\u2014 so any list would be an invented sample, not a specification. Chicago\\u2019s hyphenation guidance (its hyphenation table) governs whether to hyphenate, not whether the resulting hyphen may break, and Chicago explicitly permits breaking at a hyphen.\" }, { rule: \"nbsp\", cite: \"The Chicago Manual of Style Online, Q&A, topic \\u201CWord Division\\u201D: \\u201Cwe don\\u2019t include any recommendation that says you must carry an abbreviation that ends in a period over to the next line when the sentence continues beyond the abbreviation. So a line is allowed to end with an \\u2018a.m.\\u2019 or \\u2018Jr.\\u2019 or the like that occurs in the middle of a sentence.\\u201D\", url: \"https://www.chicagomanualofstyle.org/qanda/data/faq/topics/WordDivision/faq0007.html\", note: \"`beforeNumber` and `beforeWord` are empty, and Chicago does not merely omit reference abbreviations from its nonbreaking-space guidance \\u2014 it states positively that no such rule exists, so `No. 5`, `p. 12` and `pp. 12\\u201314` are refused on the source\\u2019s own words rather than on an argument from silence (issue #30). The same answer attributes the practice to typesetters rather than to Chicago: \\u201Csome typesetters will use a nonbreaking space to prevent a compound like \\u2018St. Louis\\u2019 or \\u2018Dr. Smith\\u2019 from breaking at the end of a line\\u201D \\u2014 which is why `beforeWord` stays empty too; the named exception is initials in a name, carried by `initialBinding`. CMOS Shop Talk, \\u201CNavigating Spaces in Manuscripts and Beyond\\u201D (15 June 2021), cited above for `initialBinding` and `beforeUnits`, introduces its four contexts with \\u201Ccan be helpful in the following contexts, among others\\u201D, so it must not be described as an exhaustive list.\" }, { rule: \"quotes\", cite: \"The Chicago Manual of Style, 7.16 \\u201CPossessive form of most nouns\\u201D (section number and title confirmed against the publisher's own chapter-7 table of contents; cited as 7.16\\u201319 and 7.22 by the CMOS Q&A on the 18th-edition site). Verbatim, as reproduced by CMOS Shop Talk, \\u201CSection 7.16 in the Spotlight\\u201D, 12 May 2015: \\u201CThe possessive of most singular nouns is formed by adding an apostrophe and an s.\\u201D Reconfirmed for the current edition by CMOS Shop Talk, 31 August 2021: \\u201CChicago adds an apostrophe and an s to form the possessive of a singular noun, including singular nouns ending in s\\u201D (see CMOS 7.16)\", url: \"https://cmosshoptalk.com/2021/08/31/introducing-the-chicago-manual-of-style-for-perfectit/\", note: \"Supports the single entry quotes.elisionClitics.after = [\\\"s\\\"] \\u2014 the possessive s, not the contraction enclitics. t, ll, re, ve, d and m are deliberately absent: nobody writes `won`'t, so they have no attested occurrence in the shape this veto is scoped to, whereas possessivising a set-off identifier (`x`'s printer) is everyday technical prose and is the shape reported in canonical issue #53. Chicago states the rule, not a code point; U+2019 follows from apostrophe.md \\u00A73.3, which is unchanged. Edition and section provenance is mixed deliberately and should not be tidied into a single number: the numbered paragraph itself is paywalled, the verbatim wording above is the 16th edition's (the 2015 post carries an editor's note saying so), and the 2021 post plus the 18th-edition Q&A are what establish that 7.16 is still the general rule. CMOS 7.22's alternative practice (Burns' rather than Burns's) does not affect this entry: the veto matches the maximal LETTER run to the RIGHT of the mark, so Burns's fires on s while Burns' has no letter there and fires nothing. CMOS 7.29 \\u201CPossessive with italicized or quoted terms\\u201D is a closer fit to the reported shape than 7.16 and would strengthen this citation, but its text is paywalled and was not read \\u2014 only its title, from the table of contents.\" }] },\n es: { locale: \"es\", name: \"Spanish\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"none\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"p. ej.\", \"a. C.\", \"d. C.\", \"EE. UU.\", \"FF. AA.\", \"N. del T.\", \"q. e. p. d.\", \"et al.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"mg\", \"mL\", \"min\", \"dB\", \"kW\", \"kWh\"], beforeNumber: [\"art.\", \"cap.\", \"n\\u00FAm.\", \"nro.\", \"p\\u00E1g.\", \"p\\u00E1gs.\"], beforeWord: [\"Sr.\", \"Sra.\", \"Srta.\"], afterSymbols: [], initialBinding: \"chain\" }, sources: [{ rule: \"quotes\", cite: \"RAE y ASALE, Diccionario panhisp\\u00E1nico de dudas, entrada \\u00ABcomillas\\u00BB, apartado 1: \\u00ABEn los textos impresos, se recomienda utilizar en primera instancia las comillas angulares, reservando los otros tipos para cuando deban entrecomillarse partes de un texto ya entrecomillado. En este caso, las comillas simples se emplear\\u00E1n en \\u00FAltimo lugar\\u00BB; \\u00ABLas comillas inglesas y las simples se escriben en la parte alta del rengl\\u00F3n, mientras que las angulares se escriben centradas\\u00BB\", url: \"https://www.rae.es/dpd/comillas\", note: \"El DPD establece QU\\u00C9 CLASE de signo corresponde a cada nivel y el orden de anidamiento; no nombra ning\\u00FAn punto de c\\u00F3digo. La identidad U+201C/U+201D procede de Unicode, autoridad para eso y para nada m\\u00E1s. Contra las comillas rectas de m\\u00E1quina de escribir el DPD aporta una descripci\\u00F3n de trazado \\u2014 \\u00ABen la parte alta del rengl\\u00F3n\\u00BB \\u2014 y locale.schema.json las proh\\u00EDbe adem\\u00E1s por su cuenta. El tercer nivel que el DPD describe (\\u2018 \\u2019) no es expresable: el esquema tiene primary y secondary, no tres; l\\u00EDmite del esquema, no laguna de la fuente, igual que en el. ADVERTENCIA DE OBTENCI\\u00D3N: rae.es devuelve HTTP 403 a un cliente autom\\u00E1tico \\u2014 obst\\u00E1culo t\\u00E9cnico, no obra de pago \\u2014 y el texto se ley\\u00F3 por un proxy de extracci\\u00F3n sobre esta URL can\\u00F3nica; el mismo proxy devolvi\\u00F3 la abreviatura de \\u00ABn\\u00FAmero\\u00BB de dos formas distintas en dos pasadas, por lo que ning\\u00FAn campo de este archivo afirma un punto de c\\u00F3digo no ASCII que no se haya podido fijar por otra v\\u00EDa. Consultado el 18.09.2026.\" }, { rule: \"quotes\", cite: \"RAE y ASALE, Diccionario panhisp\\u00E1nico de dudas, entrada \\u00ABcomillas\\u00BB, apartado 1: \\u00ABLas comillas se escriben pegadas a la primera y la \\u00FAltima palabra del periodo que enmarcan, y separadas por un espacio de las palabras o signos que las preceden o las siguen\\u00BB\", url: \"https://www.rae.es/dpd/comillas\", note: \"Justifica innerSpace = \\\"none\\\" en los dos pares: \\u00ABpegadas\\u00BB excluye todo espacio interior, ni U+00A0 ni U+202F. El espa\\u00F1ol no sigue aqu\\u00ED el uso franc\\u00E9s. elisionIdioms queda vac\\u00EDo porque el espa\\u00F1ol no tiene ning\\u00FAn modismo de la forma {left, elided, right}: la entrada \\u00ABap\\u00F3strofo\\u00BB del mismo DPD afirma que el signo \\u00ABapenas se usa en el espa\\u00F1ol actual\\u00BB y lo limita a textos antiguos, al habla reproducida y a nombres de otras lenguas. Consultado el 18.09.2026.\" }, { rule: \"dashes\", cite: \"RAE y ASALE, Diccionario panhisp\\u00E1nico de dudas, entrada \\u00ABraya\\u00BB, apartado 2: \\u00ABComo el resto de los signos dobles, se escriben pegadas a la primera y a la \\u00FAltima palabra del periodo que enmarcan, y separadas por un espacio de la palabra o signo que las precede o las sigue\\u00BB\", url: \"https://www.rae.es/dpd/raya\", note: \"parenthetical = \\\"none\\\" POR UN L\\u00CDMITE DEL ESQUEMA, no por falta de fuente: la fuente es expl\\u00EDcita y prescribe espacios ORDINARIOS FUERA del par y ninguno en los bordes interiores (\\u00ABLleg\\u00F3 \\u2014por fin\\u2014 a casa\\u00BB). El enum no expresa esa asimetr\\u00EDa: \\\"em-spaced\\\" pone un espacio a cada lado de CADA raya, que es lo que la frase proh\\u00EDbe, y \\\"em-tight\\\" suprime los exteriores que la frase exige. Mismo caso que el griego (dashes.md \\u00A76) y que el italiano de este mismo lote; al repetirse en tres idiomas independientes deja de ser una rareza y pasa a ser una carencia del esquema, registrada aparte para resolverse en su propia versi\\u00F3n. Mientras tanto \\\"none\\\" es lo \\u00FAnico que el archivo puede decir con verdad, y no autoriza a aproximar. Consultado el 18.09.2026.\" }, { rule: \"ranges\", cite: \"RAE y ASALE, Diccionario panhisp\\u00E1nico de dudas, entrada \\u00ABguion\\u00BB, apartado 3 b): \\u00ABIndica intervalos expresados tanto en n\\u00FAmeros ar\\u00E1bigos como en romanos: las p\\u00E1ginas 23-45; durante los siglos x-xii\\u00BB; apartado 1: \\u00ABSigno ortogr\\u00E1fico en forma de peque\\u00F1a l\\u00EDnea horizontal (-)\\u00BB\", url: \"https://www.rae.es/dpd/guion\", note: \"range = \\\"none\\\" por una raz\\u00F3n DISTINTA de la de parenthetical, y confundirlas tergiversar\\u00EDa las fuentes. El signo espa\\u00F1ol del intervalo es el guion, U+002D \\u2014 el car\\u00E1cter que el autor ya escribi\\u00F3 \\u2014, y el enum solo ofrece em, en o none: \\u00ABno sustituir nada\\u00BB es aqu\\u00ED a la vez lo honesto y lo correcto, porque \\u00AB23-45\\u00BB ya est\\u00E1 bien escrito. El enum s\\u00ED podr\\u00EDa expresar un valor equivocado: \\\"en-tight\\\" convertir\\u00EDa esa forma en una que el DPD no prescribe. Consultado el 18.09.2026.\" }, { rule: \"ellipsis\", cite: \"RAE y ASALE, Diccionario panhisp\\u00E1nico de dudas, entrada \\u00ABpuntos suspensivos\\u00BB, apartado 1: \\u00ABSigno de puntuaci\\u00F3n formado por tres puntos consecutivos (\\u2026) \\u2015y solo tres\\u2015\\u00BB\", url: \"https://www.rae.es/dpd/puntos%20suspensivos\", note: \"Justifica abbreviatedAfterTerminal = false: \\u00ABy solo tres\\u00BB es una exigencia expresa de n\\u00FAmero, y el espa\\u00F1ol no dispone en ning\\u00FAn apartado de la forma de dos puntos tras \\u00AB?\\u00BB o \\u00AB!\\u00BB que s\\u00ED usa el ruso. El apartado 3.4 de la misma entrada regula el ORDEN de los signos, no su n\\u00FAmero. La fuente no se pronuncia sobre U+2026 frente a tres U+002E: esa elecci\\u00F3n es del motor y es igual en todas las locales. Consultado el 18.09.2026.\" }, { rule: \"hyphen\", cite: \"RAE y ASALE, Diccionario panhisp\\u00E1nico de dudas, entrada \\u00ABguion\\u00BB, apartados 1, 2 y 3: el guion une palabras y segmentos, divide la palabra al final de l\\u00EDnea, indica intervalos y separa grupos de cifras\", url: \"https://www.rae.es/dpd/guion\", note: \"Justifica las tres listas vac\\u00EDas. La entrada enumera los usos del guion y en ninguno define una clase cerrada de formas morfol\\u00F3gicas cuyo guion no deba partirse al final de l\\u00EDnea, que es lo \\u00FAnico que consume esta regla; al contrario, en espa\\u00F1ol el guion es el signo del propio corte de l\\u00EDnea. Con las listas vac\\u00EDas la regla es un no-op total demostrable (hyphen.md \\u00A72), que es el caso normal y no una carencia. Consultado el 18.09.2026.\" }, { rule: \"nbsp\", cite: \"RAE y ASALE, Diccionario panhisp\\u00E1nico de dudas, entrada \\u00ABsignos de interrogaci\\u00F3n y exclamaci\\u00F3n\\u00BB, apartado 1: \\u00ABSe escriben pegados a la primera y la \\u00FAltima palabra del periodo que enmarcan, y separados por un espacio de las palabras que los preceden o los siguen\\u00BB\", url: \"https://www.rae.es/dpd/signos%20de%20interrogaci%C3%B3n%20y%20exclamaci%C3%B3n\", note: \"Justifica beforePunctuation y narrowBeforePunctuation vac\\u00EDos por dos motivos independientes. PRIMERO, la fuente: no hay espacio antes de \\u00AB?\\u00BB ni de \\u00AB!\\u00BB, ni despu\\u00E9s de \\u00AB\\u00BF\\u00BB ni de \\u00AB\\u00A1\\u00BB; el uso franc\\u00E9s queda descartado por la norma, no por silencio. SEGUNDO, y con independencia de lo anterior, el esquema no podr\\u00EDa expresar lo contrario: la restricci\\u00F3n Q-P exige que todo punto de c\\u00F3digo de estas listas pertenezca a CLOSEISH, y U+00BF y U+00A1 no lo son \\u2014 son puntuaci\\u00F3n de APERTURA, y el \\u00FAnico mecanismo de \\u00ABespacio tras un signo de apertura\\u00BB del esquema es quotes.innerSpace. NO ES EXPRESABLE, que es distinto de no estar atestiguado. afterShortWords queda vac\\u00EDo por una raz\\u00F3n m\\u00E1s d\\u00E9bil y se dice cu\\u00E1l: ninguna fuente consultada exige que una palabra breve no quede al final de l\\u00EDnea; lo resolver\\u00EDa el cap\\u00EDtulo \\u00ABDivisi\\u00F3n de palabras al final de l\\u00EDnea\\u00BB de la Ortograf\\u00EDa, no consultado. afterSymbols vac\\u00EDo: ninguna fuente espa\\u00F1ola consultada liga \\u00AB\\u00A7\\u00BB a un n\\u00FAmero. Consultado el 18.09.2026.\" }, { rule: \"nbsp\", cite: \"RAE y ASALE, Diccionario panhisp\\u00E1nico de dudas, entrada \\u00ABs\\u00EDmbolo\\u00BB, apartado 5.4: \\u00ABLos s\\u00EDmbolos deben escribirse pospuestos a la cifra a la que acompa\\u00F1an y dejando un blanco de separaci\\u00F3n: 33 dB, 125 m\\u00B2, 4 H\\u00BB; \\u00ABse separa de ella y se pega al s\\u00EDmbolo de la escala si esta se especifica: 27\\u00B0 (por veintisiete grados), pero 27 \\u00B0C\\u00BB; apartado 5.6: \\u00ABNo deben escribirse en l\\u00EDneas diferentes la cifra y el s\\u00EDmbolo que la acompa\\u00F1a: \\u22973 / $, \\u22977 / km\\u00BB\", url: \"https://www.rae.es/dpd/s%C3%ADmbolo\", note: \"Justifica beforeUnits, y el apartado 5.6 es adem\\u00E1s la base normativa de la INDIVISIBILIDAD, dicha por la RAE y en espa\\u00F1ol. El apartado 5.4 impone una exclusi\\u00F3n que el archivo respeta: \\u00AB\\u00B0\\u00BB a secas NO figura, porque \\u00AB27\\u00B0\\u00BB va pegado; solo \\u00AB\\u00B0C\\u00BB. Dos advertencias de alcance. (1) La lista es M\\u00C1S ESTRECHA QUE LA FUENTE: se omiten los s\\u00EDmbolos de una sola letra (m, g, s, h, L, A, H), que no se desambiguan sin contexto \\u2014 criterio de fr \\u2014, pese a que el ejemplo del propio apartado es \\u00AB4 H\\u00BB. (2) No se incluye ning\\u00FAn s\\u00EDmbolo monetario, y no por prudencia sino por cita: el apartado 5.5 distingue expresamente el uso de Espa\\u00F1a (\\u00AB3 \\u00A3\\u00BB, pospuesto y con blanco) del de Am\\u00E9rica (\\u00AB\\u00A33\\u00BB, antepuesto y sin blanco), y esta locale no lleva subetiqueta de regi\\u00F3n. Ese apartado se cita tambi\\u00E9n en POSITIVO: el DPD sabe marcar la divergencia regional donde existe, luego los campos sobre los que no la marca son seguros para un \\u00ABes\\u00BB regionalmente neutro. Consultado el 18.09.2026.\" }, { rule: \"nbsp\", cite: \"BIPM, The International System of Units (SI), 9th ed. (2019), concise summary: \\u00ABA single space is always left between the number and the unit\\u00BB\", url: \"https://www.bipm.org/documents/20126/41483022/SI-Brochure-9-concise-EN.pdf\", note: \"Autoridad sobre la COMPOSICI\\u00D3N de la lista de unidades, igual que en en-US, en-GB, fi y sv; el DPD \\u00ABs\\u00EDmbolo\\u00BB 5.4 y 5.6 es la autoridad sobre la convenci\\u00F3n espa\\u00F1ola y sobre la indivisibilidad. El BIPM no se invoca como autoridad sobre el espa\\u00F1ol \\u2014 no lo es \\u2014, sino sobre qu\\u00E9 cadenas son s\\u00EDmbolos de unidad del SI. Si ambas fuentes discreparan sobre el espa\\u00F1ol mandar\\u00EDa la RAE; no discrepan. Consultado el 18.09.2026.\" }, { rule: \"nbsp\", cite: \"RAE y ASALE, Diccionario panhisp\\u00E1nico de dudas, entrada \\u00ABabreviatura\\u00BB: \\u00ABTampoco deben aparecer en renglones diferentes la abreviatura y el t\\u00E9rmino del que esta depende: \\u229715 / p\\u00E1gs., \\u2297Sr. / P\\u00E9rez\\u00BB; \\u00ABCuando la abreviatura corresponde a una expresi\\u00F3n compleja, se separan mediante un espacio las letras que representan cada una de las palabras que la integran\\u00BB; \\u00ABLas iniciales de los componentes del nombre propio de una persona son tambi\\u00E9n abreviaturas formadas por truncamiento\\u00BB\", url: \"https://www.rae.es/dpd/abreviatura\", note: \"Una sola cita para cuatro campos, porque una sola regla los gobierna. abbreviations: la fuente exige el espacio interior y proh\\u00EDbe partirlo; las formas listadas est\\u00E1n atestiguadas en esta entrada o en la Lista de abreviaturas de El buen uso del espa\\u00F1ol. beforeNumber y beforeWord: \\u00AB\\u229715 / p\\u00E1gs.\\u00BB y \\u00AB\\u2297Sr. / P\\u00E9rez\\u00BB son los dos ejemplos de la propia fuente, uno en cada orden. beforeWord se limita a la clase cerrada de los tratamientos de cortes\\u00EDa: la regla vale para CUALQUIER abreviatura, pero enumerarlas todas disparar\\u00EDa falsos positivos en la subrregla de mayor riesgo del esquema (nbsp.md \\u00A73.12). NO SE INCLUYEN \\u00ABn.\\u00BA\\u00BB, \\u00ABD.\\u00AA\\u00BB ni \\u00ABSr.\\u00AA\\u00BB: la RAE prescribe una \\u00ABo volada\\u00BB, es decir un TRAZADO y no un punto de c\\u00F3digo, y el texto obtenido devolvi\\u00F3 dos formas distintas en dos pasadas; adivinar ser\\u00EDa peor que omitir. initialBinding = \\\"chain\\\" ES UNA DECISI\\u00D3N DEL OPERADOR (18.09.2026), NO UNA CITA: el DPD no contiene ninguna calificaci\\u00F3n de \\u00ABdos o m\\u00E1s\\u00BB \\u2014 enuncia la regla general y establece que las iniciales SON abreviaturas, lo que apunta m\\u00E1s bien a \\\"single\\\" \\u2014, pero su \\u00FAnico ejemplo con iniciales es \\u00ABJ. A. P\\u00E9rez\\u00BB, de dos, y ante una fuente que no decide se eligi\\u00F3 el valor mayoritario en este proyecto (en-US, de-DE, de-CH, ru) y el de menor superficie de falsos positivos, porque \\\"chain\\\" no liga una may\\u00FAscula con punto aislada. En \\u00ABJ. A. P\\u00E9rez\\u00BB ambos valores dan el mismo resultado; solo difieren ante un inicial suelto. Consultado el 18.09.2026.\" }] },\n fi: { locale: \"fi\", name: \"Finnish\", quotes: { primary: { open: \"\\u201D\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2019\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"fil. maist.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00A7\", \"kg\", \"g\", \"mg\", \"km\", \"m\", \"cm\", \"mm\", \"l\", \"dl\", \"cl\", \"ml\", \"h\", \"min\", \"s\", \"ms\", \"\\u00B0C\", \"kW\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [\"\\u00A7\"], initialBinding: \"none\" }, sources: [{ rule: \"quotes\", cite: \"Kotimaisten kielten keskus (Kotus), Kielitoimiston ohjepankki: \\u201CLainausmerkit\\u201D\", url: \"https://kielitoimistonohjepankki.fi/ohje/lainausmerkit/\", note: \"Verbatim: \\u201CSuomenkielisess\\u00E4 tekstiss\\u00E4 k\\u00E4ytett\\u00E4v\\u00E4t kokolainausmerkit ovat kaarevat \\u201D, ja ne ovat samanmuotoiset lainatun jakson alussa ja lopussa.\\u201D Both the opening and the closing mark are U+201D. The page notes that books and newspapers sometimes use angle marks (\\u00BB\\u2026\\u00BB) as a design choice; the Kotus recommendation for Finnish text is \\u201D\\u2026\\u201D.\" }, { rule: \"quotes\", cite: \"Kotimaisten kielten keskus (Kotus), Kielitoimiston ohjepankki: \\u201CPuolilainausmerkki\\u201D\", url: \"https://kielitoimistonohjepankki.fi/ohje/puolilainausmerkki/\", note: \"Verbatim: \\u201CPuolilainausmerkki\\u00E4 k\\u00E4ytet\\u00E4\\u00E4n my\\u00F6s lainausmerkkin\\u00E4 kokolainausmerkkien sis\\u00E4ll\\u00E4\\u201D, and \\u201CSuomenkielisiss\\u00E4 teksteiss\\u00E4 k\\u00E4ytett\\u00E4v\\u00E4 puolilainausmerkki on \\u2019, ei \\u201B eik\\u00E4 '.\\u201D The page gives the Windows input sequence Alt+0146, which is U+2019, confirming the code point for both the opening and the closing secondary mark.\" }, { rule: \"dashes\", cite: \"Kotimaisten kielten keskus (Kotus), Kielitoimiston ohjepankki: \\u201CAjatusviiva virkkeen v\\u00E4limerkkin\\u00E4\\u201D\", url: \"https://kielitoimistonohjepankki.fi/ohje/ajatusviiva-virkkeen-valimerkkina/\", note: \"Verbatim: \\u201CT\\u00E4llaisen virkkeen v\\u00E4limerkkin\\u00E4 k\\u00E4ytetyn ajatusviivan molemmin puolin tulee v\\u00E4lily\\u00F6nti.\\u201D Hence `parenthetical: en-spaced` \\u2014 Finnish uses the en dash (ajatusviiva, n-viiva), not an em dash.\" }, { rule: \"dashes\", cite: \"Kotimaisten kielten keskus (Kotus), Kielitoimiston ohjepankki: \\u201CAjanilmaukset: aikav\\u00E4lit (1.1.\\u201331.1.)\\u201D, citing standard SFS 4175\", url: \"https://kielitoimistonohjepankki.fi/ohje/ajanilmaukset-aikavalit-1-1-31-1/\", note: \"Verbatim: \\u201CNumero- ja merkkistandardi SFS 4175 suosittaa rajakohdan merkkin\\u00E4 lyhemp\\u00E4\\u00E4 ajatusviivaa eli ns. n-viivaa\\u201D, set tight against the endpoints (ma\\u2013pe). Known exception not expressible in this schema: when the endpoints are themselves multi-word, Kotus spaces the dash (\\u201Cma 10.4. \\u2013 pe 21.4.\\u201D). `range: en-tight` therefore describes the numeric case only.\" }, { rule: \"ellipsis\", cite: \"Kotimaisten kielten keskus (Kotus), Kielitoimiston ohjepankki: \\u201CKolme pistett\\u00E4\\u201D\", url: \"https://kielitoimistonohjepankki.fi/ohje/kolme-pistetta/\", note: \"`abbreviatedAfterTerminal` is false. Kotus describes the mark as three dots marking an unfinished sentence, a missing element or a continuing list; the two-dot form after `!`/`?` is a Russian convention and appears in no Kotus guidance.\" }, { rule: \"nbsp\", cite: \"Kotimaisten kielten keskus (Kotus), Kielitoimiston ohjepankki: \\u201CProsenttimerkki (%)\\u201D\", url: \"https://kielitoimistonohjepankki.fi/ohje/prosenttimerkki/\", note: \"Finnish writes a space between the numeral and the percent sign (10,5 %), unlike English, which sets it closed up. This attests membership: `%` is a Finnish unit-like sign that follows a numeral after a space, which is what `beforeUnits` expresses. `\\u2030` is included on the same reading.\" }, { rule: \"nbsp\", cite: \"Kotimaisten kielten keskus (Kotus), Kielitoimiston ohjepankki: \\u201CPyk\\u00E4l\\u00E4t ja pyk\\u00E4l\\u00E4merkki (\\u00A7)\\u201D\", url: \"https://kielitoimistonohjepankki.fi/ohje/pykalat-ja-pykalamerkki/\", note: \"Kotus gives **three** notations as alternatives, not two: `6. \\u00A7` (general language, with the ordinal full stop), `\\u00A7 6`, and `6 \\u00A7` (legal language, where the ordinal stop is conventionally dropped). An earlier revision of this note named only the last two and read as though Finnish never sets the sign before the number; that was wrong. A space separates the number and the sign in all three. Because Kotus attests both orders, `\\u00A7` is a member of **both** lists: `beforeUnits` covers `6 \\u00A7` (N5, binds to a preceding number) and `afterSymbols` covers `\\u00A7 6` (N6, binds to a following number). The two sub-rules are disjoint by their own left/right tests, so the double membership is safe rather than contradictory. The third form, `6. \\u00A7`, binds under neither \\u2014 N5 requires a digit immediately before the space and there is an ordinal full stop there \\u2014 which is an algorithmic gap held with the spec author, not something this file can express. Contrast Finnish with Swedish, where Spr\\u00E5kr\\u00E5det\\u2019s example is `\\u00A7 7` and only the sign-first order is attested.\" }, { rule: \"nbsp\", cite: \"Oikeusministeri\\u00F6, Lainkirjoittajan opas \\u00A724.4 \\u201CMerkeist\\u00E4 ja taivutusmuodoista lakikieless\\u00E4\\u201D\", url: \"https://lainkirjoittaja.finlex.fi/24-lakikieli/24-4/\", note: \"Second source for the legal form: statutory drafting sets `2 \\u00A7` and inflects it with a colon (`3\\u20135 \\u00A7:ss\\u00E4`). Corroborates the number-first notation Kotus gives, and with it `\\u00A7`\\u2019s membership of `beforeUnits`.\" }, { rule: \"nbsp\", cite: \"BIPM, The International System of Units (SI), 9th ed. (2019), concise summary, \\u201CThe language of science: using the SI to express the values of quantities\\u201D; Kotus, Kielitoimiston ohjepankki: \\u201CProsenttimerkki (%)\\u201D and \\u201CPyk\\u00E4l\\u00E4t ja pyk\\u00E4l\\u00E4merkki (\\u00A7)\\u201D\", url: \"https://www.bipm.org/documents/20126/41483022/SI-Brochure-9-concise-EN.pdf\", note: \"Membership claim, per nbsp.md \\u00A72.1: these tokens are units of measurement in Finnish and are written after a numeral with a space. BIPM verbatim: \\u201CA single space is always left between the number and the unit.\\u201D Kotus supplies the Finnish-specific members that SI does not cover \\u2014 the percent sign takes a space (10,5 %), unlike English, and the section sign follows the number (6 \\u00A7). That is the whole of what this list can express: which tokens are units. Whether the space is then made non-breaking is N5\\u2019s mechanism, fixed for every locale by the rule and not variable per locale, so no citation is owed for it. **Correction kept on the record, because it was real:** an earlier revision of this file justified the list with the sentence \\u201CNumeron ja lyhenteen v\\u00E4liin tulee v\\u00E4lily\\u00F6nti\\u201D, attributed to the Kotus page on numeroiden ryhmittely. That sentence is not on that page \\u2014 it came from a search-engine summary and was never checked against the source. What that page\\u2019s \\u201CSitova v\\u00E4lily\\u00F6nti\\u201D section actually says is \\u201CTekstink\\u00E4sittelyohjelmissa pitk\\u00E4t luvut saa pysym\\u00E4\\u00E4n samalla rivill\\u00E4 k\\u00E4ytt\\u00E4m\\u00E4ll\\u00E4 sitovaa eli yhdist\\u00E4v\\u00E4\\u00E4 v\\u00E4lily\\u00F6nti\\u00E4\\u201D, which is about holding the digit groups of one long number together (100 000) \\u2014 the class nbsp.md \\u00A77.11 declines to implement \\u2014 and not about a number and a following unit. The page is no longer cited here. Kielikello and the rest of the ohjepankki were searched for a Finnish number+unit line-breaking statement and none was found; SFS 4175 may contain one, but it is a paid standard whose text was not read, and it is not cited on the strength of a secondary summary.\" }, { rule: \"nbsp\", cite: \"Kotimaisten kielten keskus (Kotus), Kielitoimiston ohjepankki: \\u201CLyhenteet: pisteelliset\\u201D\", url: \"https://kielitoimistonohjepankki.fi/ohje/lyhenteet-pisteelliset/\", note: \"Verbatim: \\u201CYhdyssanan lyhennettyjen osien v\\u00E4liin ei tule v\\u00E4lily\\u00F6nti\\u00E4, toisin kuin sanaliiton osien v\\u00E4liin\\u201D \\u2014 a compound word abbreviates closed up (sos.dem., dipl.ins.) while a word-group abbreviation keeps the space (fil. maist.). The `abbreviations` list is therefore deliberately minimal: only the one form quoted verbatim on that page is included. Kotus\\u2019s full Lyhenneluettelo contains further space-bearing academic-title abbreviations (fil. tri, valt. maist. and similar); they are omitted rather than guessed at, and should be added by whoever can transcribe that list directly. The membership claim here is precise: `fil. maist.` is **one abbreviation that contains a space**, and Kotus states its internal shape directly. A form that a source merely shows adjacent to another token would not qualify.\" }, { rule: \"nbsp\", cite: \"Kotimaisten kielten keskus (Kotus), Kielitoimiston ohjepankki: v\\u00E4limerkit and lyhenteet, read for membership in each remaining list\", url: \"https://kielitoimistonohjepankki.fi/asiasana/valimerkit/\", note: \"`beforePunctuation` and `narrowBeforePunctuation` are empty because Finnish sets no space before a punctuation mark \\u2014 there are no members to list. `afterShortWords` is empty because Finnish has no closed class of short words that may not end a line; its function words are inflectional suffixes rather than separate particles, so the list has no candidates. `beforeWord` is empty for want of an attested membership claim: no Kotus page shows titles such as hra or prof. as forms that bind to a following name. `beforeNumber` is a genuine open question rather than a settled empty: Kotus does write s. 12 and kuva 3, which under nbsp.md \\u00A72.1 is a membership claim of the right shape, and the earlier justification for leaving it empty (that Kotus does not require the space to be non-breaking) is no longer a valid reason. It is left empty here only because populating it is a live behaviour change that belongs in its own round with N9\\u2019s false-positive surface reviewed. `initialBinding` is \\\"none\\\" (spec 0.6.0: the field used to be the boolean bindInitials, false), and \\u00A72.1 makes plain that this field is unciteable in principle \\u2014 it expresses nothing but mechanism, and no typographic authority states it in terms of a code point. Kotus attests the space in J. K. Paasikivi and says nothing further. The value is therefore a judgement, held at \\\"none\\\" to match the same call made for en-GB, and it should be settled by the operator across all locales at once rather than per file.\" }, { rule: \"hyphen\", cite: \"Kotimaisten kielten keskus (Kotus), Kielitoimiston ohjepankki: \\u201CYhdysmerkki eli yhdysviiva\\u201D\", url: \"https://kielitoimistonohjepankki.fi/ohje/yhdysmerkki-eli-yhdysviiva/\", note: \"`prefixes`, `suffixes` and `compounds` are empty. Kotus\\u2019s hyphen guidance is entirely about when to write a hyphen (compounds with numerals or abbreviations, identical adjoining vowels, word-group compounds such as \\u201Cavaimet k\\u00E4teen -sopimus\\u201D), never about forbidding a line break at one. Finnish compounding is productive, so there is no closed normative list to encode \\u2014 unlike Russian, where \\u043A\\u043E\\u0435-, -\\u0442\\u0430\\u043A\\u0438 and \\u0438\\u0437-\\u043F\\u043E\\u0434 are a fixed inventory. Nothing here, and no Kotus page found, prescribes U+2011.\" }] },\n fr: { locale: \"fr\", name: \"French\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"nbsp\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"l\", \"j\", \"m\", \"t\", \"s\", \"c\", \"qu\", \"jusqu\", \"d\", \"n\", \"lorsqu\", \"puisqu\", \"quoiqu\"], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [\":\"], narrowBeforePunctuation: [\";\", \"!\", \"?\"], afterShortWords: [], abbreviations: [\"p. ex.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u20AC\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"art.\", \"fig.\", \"n\\u00B0\", \"N\\u00B0\"], beforeWord: [\"M.\", \"MM.\", \"Mme\", \"Mmes\", \"Mlle\", \"Mlles\"], afterSymbols: [\"\\u00A7\"], initialBinding: \"single\" }, sources: [{ rule: \"nbsp\", cite: \"Jacques Andr\\u00E9, Petites le\\u00E7ons de typographie, \\u00E9d. du jobet, r\\u00E9vision du 1er juin 2025, \\u00A7 5.1.1 note 21 et \\u00A7 5.2.3 : l'espace ins\\u00E9cable employ\\u00E9e devant les ponctuations doubles \\u00AB c'est la fine des typographes, en premi\\u00E8re approximation (contre-exemple : l'espace avant le deux-points est en fait une espace normale ins\\u00E9cable) \\u00BB ; \\u00AB il faut une espace fine ins\\u00E9cable avant le point-virgule \\u00BB\", url: \"http://jacques-andre.fr/faqtypo/lessons.pdf\", note: \"C'est le point qui tranche la question pos\\u00E9e par docs/PLAN.md \\u00A77 : \\u00AB ; \\u00BB, \\u00AB ! \\u00BB et \\u00AB ? \\u00BB prennent U+202F ; \\u00AB : \\u00BB prend U+00A0. La distinction est donc confirm\\u00E9e, et non simplement r\\u00E9p\\u00E9t\\u00E9e. Le tableau 1 (p. 32) donne la saisie compl\\u00E8te des signes. Recoup\\u00E9 avec l'article \\u00AB Espace fine ins\\u00E9cable \\u00BB de la Wikip\\u00E9dia francophone, qui attribue la m\\u00EAme r\\u00E8gle au Lexique des r\\u00E8gles typographiques en usage \\u00E0 l'Imprimerie nationale, 3e \\u00E9d., 2002 (fine devant ; ? !, \\u00AB sauf devant deux-points, en France \\u00BB).\" }, { rule: \"nbsp\", cite: \"Jacques Andr\\u00E9, Petites le\\u00E7ons de typographie, \\u00A7 2.5 et \\u00A7 5.1.3 \\u00AB Autres emplois de l'espace ins\\u00E9cable \\u00BB : espace ins\\u00E9cable entre un pr\\u00E9nom abr\\u00E9g\\u00E9 et le nom (\\u00AB N. Bourbaki \\u00BB), entre une abr\\u00E9viation et le mot qui la suit (\\u00AB Mme Hugo \\u00BB, \\u00AB le R.P. Durand \\u00BB), entre un nombre et ce qu'il quantifie (\\u00AB 14 francs \\u00BB, \\u00AB 2 \\u20AC \\u00BB, \\u00AB 98 % \\u00BB, \\u00AB art. 237 \\u00BB)\", url: \"http://jacques-andre.fr/faqtypo/lessons.pdf\", note: \"La liste beforeUnits est volontairement courte et exclut les symboles d'une seule lettre (m, g, l, s, A), qui ne peuvent pas \\u00EAtre d\\u00E9sambigu\\u00EFs\\u00E9s sans contexte. La liaison \\u00AB abr\\u00E9viation + mot suivant \\u00BB (M. Dupont, Mme Hugo) n'est pas exprimable dans ce sch\\u00E9ma : afterSymbols lie un symbole \\u00E0 un NOMBRE suivant, pas \\u00E0 un mot ; elle passe par nbsp.initialBinding = \\\"single\\\" (spec 0.6.0 : le champ s'appelait auparavant le bool\\u00E9en bindInitials), qui conserve la liaison sur une seule initiale cit\\u00E9e ici (\\u00AB N. Bourbaki \\u00BB). Contrairement \\u00E0 \\\"chain\\\" (en-US, de-DE, de-CH, ru \\u2014 Chicago exige \\u00AB two or more initials \\u00BB), \\\"single\\\" ne peut pas distinguer structurellement un pr\\u00E9nom abr\\u00E9g\\u00E9 authentique d'une collision de fin de phrase (une initiale isol\\u00E9e suivie d'un mot capitalis\\u00E9 qui commence en fait une nouvelle phrase) ; voir spec/rules/nbsp.md \\u00A77.\" }, { rule: \"quotes\", cite: \"Imprimerie nationale, Lexique des r\\u00E8gles typographiques en usage \\u00E0 l'Imprimerie nationale, 3e \\u00E9d., 2002, entr\\u00E9e \\u00AB Guillemets \\u00BB : les guillemets fran\\u00E7ais \\u00AB \\u2026 \\u00BB sont s\\u00E9par\\u00E9s du texte qu'ils encadrent par une espace ins\\u00E9cable\", url: \"https://fr.wikipedia.org/wiki/Espace_fine_ins%C3%A9cable\", note: \"Le Lexique n'est pas consultable en ligne ; la r\\u00E8gle a \\u00E9t\\u00E9 v\\u00E9rifi\\u00E9e par recoupement de deux articles de la Wikip\\u00E9dia francophone qui la citent (\\u00AB Espace fine ins\\u00E9cable \\u00BB : \\u00AB \\u00E0 l'int\\u00E9rieur des guillemets fran\\u00E7ais [\\u2026] il est recommand\\u00E9 d'ins\\u00E9rer des espaces ins\\u00E9cables \\u00BB, attribu\\u00E9 au Lexique 2002 ; \\u00AB Ponctuation \\u00BB, tableau des espacements) et du tableau 1 de Jacques Andr\\u00E9, qui note une ins\\u00E9cable apr\\u00E8s \\u00AB \\u00AB \\u00BB et avant \\u00AB \\u00BB \\u00BB. D\\u00E9saccord assum\\u00E9 avec docs/PLAN.md \\u00A77, qui annon\\u00E7ait U+202F \\u00E0 l'int\\u00E9rieur des guillemets : la source normative dit espace ins\\u00E9cable (U+00A0). L'usage web contemporain, et JoliTypo, emploient souvent U+202F ; le choix retenu ici est celui de la citation, pas celui de l'usage.\" }, { rule: \"quotes\", cite: \"Jacques Andr\\u00E9, Petites le\\u00E7ons de typographie, \\u00A7 2.2 : \\u00AB en fran\\u00E7ais, les guillemets sont les doubles chevrons \\u00AB \\u2026 \\u00BB et non les (double-)quotes anglaises \\u201C\\u2026\\u201D ni \\u2018\\u2026\\u2019 \\u00BB ; les guillemets anglais \\u201C \\u201D servent de guillemets de second niveau\", url: \"http://jacques-andre.fr/faqtypo/lessons.pdf\", note: \"Le second niveau est le point le moins solidement \\u00E9tabli de ce fichier : l'usage fran\\u00E7ais admet aussi la r\\u00E9p\\u00E9tition des chevrons ou les chevrons simples \\u2039 \\u203A. Les guillemets anglais sont retenus parce qu'ils sont la solution la plus couramment attribu\\u00E9e au Lexique, mais cette ligne m\\u00E9rite d'\\u00EAtre revue si la 3e \\u00E9dition papier dit autre chose.\" }, { rule: \"dashes\", cite: \"Jacques Andr\\u00E9, Petites le\\u00E7ons de typographie, \\u00A7 2.2 et tableau 1 (p. 32) : le tiret marquant les incises est le tiret cadratin \\u00AB \\u2014 \\u00BB, pr\\u00E9c\\u00E9d\\u00E9 et suivi d'une espace (\\u00AB mmm \\u2014_mmm \\u2026 mmm_\\u2014 mmm \\u00BB)\", url: \"http://jacques-andre.fr/faqtypo/lessons.pdf\", note: \"Le m\\u00EAme paragraphe signale que \\u00AB la tendance est d'utiliser \\u00E0 sa place le tiret moyen \\u00AB \\u2013 \\u00BB \\u00BB. La valeur em-spaced suit la r\\u00E8gle cit\\u00E9e, pas la tendance ; docs/PLAN.md \\u00A77 supposait en-spaced. Aucune valeur de plage n'est v\\u00E9rifi\\u00E9e : les exemples de l'Imprimerie nationale et de Jacques Andr\\u00E9 impriment un trait d'union dans les intervalles de pages (\\u00AB p. 123-125 \\u00BB), et l'\\u00E9num\\u00E9ration se fait plut\\u00F4t \\u00AB de \\u2026 \\u00E0 \\u2026 \\u00BB. Le sch\\u00E9ma a donc re\\u00E7u la valeur \\u00AB none \\u00BB (ne rien substituer), retenue ici tant que le point n'est pas tranch\\u00E9 sur le Lexique papier \\u2014 une citation manquante n'autorise jamais \\u00E0 deviner.\" }, { rule: \"nbsp\", cite: \"Jacques Andr\\u00E9, Petites le\\u00E7ons de typographie, \\u00A7 5.1.3 \\u00AB Autres emplois de l'espace ins\\u00E9cable \\u00BB, liste \\u00AB Coupure entre les mots \\u00BB : \\u00AB entre une abr\\u00E9viation et le mot qui la suit, exemples : \\u201CMme_Hugo, D._Knuth, le R.P._Durand\\u201D \\u00BB ; \\u00AB entre un nombre et ce qu'il quantifie, par exemple : \\u201C14_francs, 2_\\u20AC, 1_A, t._vii, art._237, fig._3, pages_23 \\u00E0_25, 98_%\\u201D \\u00BB \\u2014 le caract\\u00E8re \\u00AB _ \\u00BB note l'espace ins\\u00E9cable\", url: \"http://jacques-andre.fr/faqtypo/lessons.pdf\", note: \"Texte relu directement dans le PDF. Cette entr\\u00E9e l\\u00E8ve la limitation signal\\u00E9e plus haut dans ce fichier (\\u00AB la liaison abr\\u00E9viation + mot suivant n'est pas exprimable dans ce sch\\u00E9ma \\u00BB) : le sch\\u00E9ma a depuis re\\u00E7u beforeNumber et beforeWord. beforeNumber ne retient que \\u00AB art. \\u00BB et \\u00AB fig. \\u00BB, cit\\u00E9s litt\\u00E9ralement devant un nombre ; \\u00AB t. vii \\u00BB est suivi d'un chiffre romain et n'a pas \\u00E9t\\u00E9 retenu. beforeWord est volontairement r\\u00E9duit \\u00E0 la classe ferm\\u00E9e des titres de civilit\\u00E9 : la r\\u00E8gle cit\\u00E9e vaut pour toute abr\\u00E9viation, mais l'\\u00E9num\\u00E9rer int\\u00E9gralement produirait des faux positifs (\\u00AB etc. \\u00BB, \\u00AB p. ex. \\u00BB, \\u00AB cf. \\u00BB). \\u00AB Mme \\u00BB est cit\\u00E9 mot pour mot ; \\u00AB M., MM., Mmes, Mlle, Mlles \\u00BB sont les autres membres de la m\\u00EAme classe et rel\\u00E8vent donc de la m\\u00EAme r\\u00E8gle, ce qui reste une inf\\u00E9rence de classe et non une citation litt\\u00E9rale. Un \\u00AB M. \\u00BB qui serait en r\\u00E9alit\\u00E9 une initiale de pr\\u00E9nom re\\u00E7oit de toute fa\\u00E7on l'espace ins\\u00E9cable prescrite au \\u00A7 5.1.3 pour \\u00AB N. Bourbaki \\u00BB : la liaison est correcte dans les deux lectures.\" }, { rule: \"hyphen\", cite: \"Jacques Andr\\u00E9, Petites le\\u00E7ons de typographie, tableau 1 (p. 32), ligne \\u00AB trait d'union \\u00BB : la saisie est \\u00AB mmm-mmm \\u00BB, sans espace ni marque d'ins\\u00E9cabilit\\u00E9, alors que le m\\u00EAme tableau note explicitement l'ins\\u00E9cable pour les ponctuations doubles, les guillemets et les tirets d'incise\", url: \"http://jacques-andre.fr/faqtypo/lessons.pdf\", note: \"Justification des trois listes vides. Aucune source normative consult\\u00E9e n'impose un trait d'union ins\\u00E9cable pour une classe ferm\\u00E9e de formes morphologiques fran\\u00E7aises ; le \\u00A7 5.1.3, qui \\u00E9num\\u00E8re les cas d'ins\\u00E9cabilit\\u00E9, ne mentionne aucun trait d'union. Le champ hyphen est donc sans objet en fran\\u00E7ais.\" }, { rule: \"nbsp\", cite: \"Office qu\\u00E9b\\u00E9cois de la langue fran\\u00E7aise, Banque de d\\u00E9pannage linguistique, \\u00AB Abr\\u00E9viation de num\\u00E9ro \\u00BB : \\u00AB L'abr\\u00E9viation courante du nom num\\u00E9ro est no ou No, avec la lettre o minuscule en exposant \\u00BB ; \\u00AB On n'abr\\u00E8ge le mot num\\u00E9ro que s'il suit imm\\u00E9diatement le nom qu'il d\\u00E9termine \\u00BB ; exemple : \\u00AB C'est le billet no 852410 qui a valu le gros lot \\u00E0 sa d\\u00E9tentrice \\u00BB\", url: \"https://vitrinelinguistique.oqlf.gouv.qc.ca/25450/les-abreviations-et-les-symboles/les-abreviations/cas-particuliers-dabreviations/abreviation-de-numero\", note: \"Deux choses distinctes, et il faut les tenir s\\u00E9par\\u00E9es. Ce que la source \\u00E9tablit : \\u00AB n\\u00B0 \\u00BB est une abr\\u00E9viation, pas un symbole, d'o\\u00F9 beforeNumber et non afterSymbols \\u2014 l'argument est aussi m\\u00E9canique, un \\u00AB \\u00B0 \\u00BB seul plac\\u00E9 dans afterSymbols serait inerte puisque N6 exige que le code point pr\\u00E9c\\u00E9dent ne soit pas ALNUM, or c'est la lettre \\u00AB n \\u00BB (nbsp.md \\u00A73.8). Ce que la source n'\\u00E9tablit pas : la s\\u00E9quence exacte de code points. L'OQLF prescrit un o minuscule en exposant, un trac\\u00E9 et non un code point, et ne nomme nulle part le signe de degr\\u00E9 ni la ligature \\u00AB num\\u00E9ro \\u00BB (U+2116). Pour la France, rien : le \\u00A7 5.1.3 de Jacques Andr\\u00E9, relu int\\u00E9gralement, ne mentionne ni \\u00AB num\\u00E9ro \\u00BB ni \\u00AB no \\u00BB, et le Lexique de l'Imprimerie nationale est un ouvrage imprim\\u00E9 qui n'a pas pu \\u00EAtre consult\\u00E9. D\\u00E9cision de l'op\\u00E9rateur (18.09.2026) : quand la r\\u00E8gle est derri\\u00E8re une source payante, polytypo retient l'usage le plus r\\u00E9pandu et l'applique de la m\\u00EAme fa\\u00E7on partout, l'uniformit\\u00E9 primant la conformit\\u00E9 au canon, et la d\\u00E9cision est signal\\u00E9e comme telle au lieu d'\\u00EAtre pr\\u00E9sent\\u00E9e comme une citation. L'usage le plus r\\u00E9pandu est \\u00AB n \\u00BB + U+00B0, c'est ce que l'on tape et ce que l'on trouve dans les textes en ligne ; N9 n'ayant aucune tol\\u00E9rance de casse, \\u00AB n\\u00B0 \\u00BB et \\u00AB N\\u00B0 \\u00BB sont deux entr\\u00E9es. La phrase \\u00AB on ne s\\u00E9pare pas les num\\u00E9ros par des espacements \\u00BB de la m\\u00EAme page vise les tranches de chiffres \\u00E0 l'int\\u00E9rieur du nombre (\\u00AB billet no 852410 \\u00BB), pas l'espace entre l'abr\\u00E9viation et le nombre.\" }, { rule: \"quotes\", cite: \"Office qu\\u00E9b\\u00E9cois de la langue fran\\u00E7aise, Banque de d\\u00E9pannage linguistique, \\u00AB Cas o\\u00F9 l'\\u00E9lision est obligatoire \\u00BB (derni\\u00E8re mise \\u00E0 jour : 2015) : \\u00AB L'\\u00E9lision ne touche que des mots grammaticaux, habituellement courts, et que les voyelles a, e et i. \\u00BB L'\\u00E9lision est obligatoire pour le d\\u00E9terminant et le pronom la et le, pour les pronoms je, me, te, se et ce plac\\u00E9s devant le verbe, pour si devant il(s), pour que et les conjonctions qui le contiennent, pour jusque, pour la pr\\u00E9position de et pour l'adverbe de n\\u00E9gation ne\", url: \"https://vitrinelinguistique.oqlf.gouv.qc.ca/21737/lorthographe/elision-et-apostrophe/elision-obligatoire\", note: \"Justifie dix des treize entr\\u00E9es de quotes.elisionClitics.before : l (la, le), j (je), m (me), t (te), s (se et si), c (ce), qu (que), jusqu (jusque), d (de), n (ne). Chaque entr\\u00E9e est la plage de lettres maximale \\u00E0 gauche de la marque, d'o\\u00F9 jusqu et non qu pour \\u00AB jusqu'\\u00E0 \\u00BB : sous une comparaison par plage maximale, une entr\\u00E9e qu ne peut pas apparier \\u00AB jusqu' \\u00BB. presqu (presqu'\\u00EEle) et quelqu (quelqu'un) sont volontairement exclus, faute d'attestation dans les articles relus, et l'exclusion est sans co\\u00FBt : dans les deux mots la marque a une lettre de chaque c\\u00F4t\\u00E9. La liste after est vide \\u2014 la BDL d\\u00E9finit l'\\u00E9lision comme l'effacement de la voyelle finale d'un mot, donc la marque suit toujours le mot \\u00E9lid\\u00E9, et l'enclise fran\\u00E7aise prend le trait d'union (donne-moi, y a-t-il), jamais l'apostrophe. Le cas port\\u00E9 par cette liste est l'\\u00E9lision devant un \\u00E9l\\u00E9ment en ligne, l'<em>id\\u00E9e</em> : sans elle, quotes appariait la marque comme une citation et invertissait la paire englobante (issue #53). L'OQLF est l'autorit\\u00E9 du Qu\\u00E9bec : pour fr-CA la citation est directe, pour fr elle tient lieu de substitut, le Lexique de l'Imprimerie nationale et Le Bon Usage n'\\u00E9tant pas consultables en ligne \\u2014 m\\u00EAme lacune que celle d\\u00E9j\\u00E0 signal\\u00E9e ailleurs dans ce fichier. quotes.md \\u00A73.2's span-boundary elision veto (spec 1.4.0) reads this list only when the mark's other literal neighbour is modes.md \\u00A73.2's inline span boundary, so every entry is matched against the maximal LETTER run on one side of the mark and nothing else. The list is decline-only: the worst it can do is refuse a pairing quotes would otherwise have formed.\" }, { rule: \"quotes\", cite: \"Office qu\\u00E9b\\u00E9cois de la langue fran\\u00E7aise, Banque de d\\u00E9pannage linguistique, \\u00AB \\u00C9lision de lorsque, puisque et quoique \\u00BB (2020) : \\u00AB les conjonctions lorsque, puisque et quoique s'\\u00E9lident obligatoirement devant il(s), elle(s), on, un et une, et aussi devant la pr\\u00E9position en \\u00BB ; l'\\u00E9lision g\\u00E9n\\u00E9ralis\\u00E9e devant tout mot commen\\u00E7ant par une voyelle ou un h muet \\u00AB demeure facultative \\u00BB\", url: \"https://vitrinelinguistique.oqlf.gouv.qc.ca/23623/lorthographe/elision-et-apostrophe/elision-de-lorsque-puisque-et-quoique\", note: \"Justifie les trois entr\\u00E9es lorsqu, puisqu, quoiqu. L'\\u00E9lision obligatoire devant il(s), elle(s), on, un, une et en suffit \\u00E0 l'appartenance : la liste \\u00E9tant uniquement restrictive, le caract\\u00E8re facultatif de l'\\u00E9lision g\\u00E9n\\u00E9ralis\\u00E9e ne change rien. L\\u00E0 encore la plage maximale impose des entr\\u00E9es distinctes : qu n'apparie pas \\u00AB lorsqu' \\u00BB. quotes.md \\u00A73.2's span-boundary elision veto (spec 1.4.0) reads this list only when the mark's other literal neighbour is modes.md \\u00A73.2's inline span boundary, so every entry is matched against the maximal LETTER run on one side of the mark and nothing else. The list is decline-only: the worst it can do is refuse a pairing quotes would otherwise have formed.\" }] },\n \"fr-CA\": { locale: \"fr-CA\", name: \"French (Canada)\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"nbsp\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"l\", \"j\", \"m\", \"t\", \"s\", \"c\", \"qu\", \"jusqu\", \"d\", \"n\", \"lorsqu\", \"puisqu\", \"quoiqu\"], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [\":\"], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"p. ex.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u20AC\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"art.\", \"fig.\", \"n\\u00B0\", \"N\\u00B0\"], beforeWord: [\"M.\", \"MM.\", \"Mme\", \"Mmes\", \"Mlle\", \"Mlles\"], afterSymbols: [\"\\u00A7\"], initialBinding: \"single\" }, sources: [{ rule: \"nbsp\", cite: \"Office qu\\u00E9b\\u00E9cois de la langue fran\\u00E7aise, Banque de d\\u00E9pannage linguistique, \\u00AB Espacement avant et apr\\u00E8s les signes de ponctuation et les symboles \\u00BB : \\u00AB L'Office qu\\u00E9b\\u00E9cois de la langue fran\\u00E7aise opte pour l'absence d'espace devant le point-virgule, le point d'exclamation et le point d'interrogation \\u00BB, l'espace fine restant admise \\u00AB lorsqu'elle est disponible \\u00BB ; le deux-points est pr\\u00E9c\\u00E9d\\u00E9 d'une espace ins\\u00E9cable\", url: \"https://vitrinelinguistique.oqlf.gouv.qc.ca/22039/la-typographie/espacement/espacement-avant-et-apres-les-signes-de-ponctuation-et-les-symboles\", note: \"C'est le point qui distingue fr-CA de fr (France) : l'usage de France, document\\u00E9 dans spec/locales/fr.json \\u00E0 partir de Jacques Andr\\u00E9, ins\\u00E8re une espace fine ins\\u00E9cable (U+202F) avant \\u00AB ; \\u00BB, \\u00AB ! \\u00BB et \\u00AB ? \\u00BB. L'OQLF choisit explicitement l'absence d'espace pour l'usage qu\\u00E9b\\u00E9cois ; l'espace fine n'est mentionn\\u00E9e que comme variante disponible, pas comme la r\\u00E8gle par d\\u00E9faut. Le champ narrowBeforePunctuation est donc vide : la r\\u00E8gle \\u00AB spaces \\u00BB retire toute espace ordinaire tap\\u00E9e devant ces signes (comportement ind\\u00E9pendant de la locale, spec/rules/spaces.md), et aucune espace n'est r\\u00E9ins\\u00E9r\\u00E9e ici \\u2014 le r\\u00E9sultat net est \\u00AB Bonjour! \\u00BB, sans espace, ce qui correspond au choix explicite de l'OQLF plut\\u00F4t qu'\\u00E0 un oubli. Le deux-points reste pr\\u00E9c\\u00E9d\\u00E9 d'une espace ins\\u00E9cable ordinaire (U+00A0), comme en France : les deux sources OQLF consult\\u00E9es s'accordent sur ce point avec Jacques Andr\\u00E9.\" }, { rule: \"nbsp\", cite: \"Jacques Andr\\u00E9, Petites le\\u00E7ons de typographie, \\u00E9d. du jobet, \\u00A7 5.1.3 \\u00AB Autres emplois de l'espace ins\\u00E9cable \\u00BB \\u2014 voir spec/locales/fr.json pour la citation compl\\u00E8te\", url: \"http://jacques-andre.fr/faqtypo/lessons.pdf\", note: \"beforeUnits, beforeNumber, beforeWord, abbreviations et initialBinding (spec 0.6.0 : le champ s'appelait auparavant le bool\\u00E9en bindInitials ; fr conserve \\\"single\\\", cit\\u00E9 au \\u00A7 5.1.3 d'Andr\\u00E9 pour \\u00AB N. Bourbaki \\u00BB) sont repris tels quels de spec/locales/fr.json : aucune source sp\\u00E9cifiquement qu\\u00E9b\\u00E9coise n'a \\u00E9t\\u00E9 consult\\u00E9e pour ces cas (seuls le point-virgule/point d'exclamation/point d'interrogation et le deux-points ont \\u00E9t\\u00E9 v\\u00E9rifi\\u00E9s s\\u00E9par\\u00E9ment aupr\\u00E8s de l'OQLF, voir l'entr\\u00E9e pr\\u00E9c\\u00E9dente). L'OQLF confirme par ailleurs, sur la m\\u00EAme page que l'entr\\u00E9e pr\\u00E9c\\u00E9dente, une espace ins\\u00E9cable devant les symboles d'unit\\u00E9s SI et le pourcentage, ce qui corrobore \\u2014 sans le prouver int\\u00E9gralement \\u2014 le maintien de ces listes pour fr-CA.\" }, { rule: \"quotes\", cite: \"Office qu\\u00E9b\\u00E9cois de la langue fran\\u00E7aise, Banque de d\\u00E9pannage linguistique, \\u00AB G\\u00E9n\\u00E9ralit\\u00E9s sur les guillemets \\u00BB : \\u00AB Les guillemets fran\\u00E7ais (\\u00AB \\u00BB), appel\\u00E9s chevrons \\u00E0 cause de leur forme, sont ceux que l'on utilise normalement dans un texte fran\\u00E7ais \\u00BB ; \\u00AB Une espace ins\\u00E9cable s\\u00E9pare les guillemets ouvrants et fermants du texte \\u00BB ; pour une citation \\u00E0 l'int\\u00E9rieur d'une citation, \\u00AB on utilise successivement les guillemets anglais doubles, puis anglais simples \\u00BB\", url: \"https://vitrinelinguistique.oqlf.gouv.qc.ca/23363/la-ponctuation/guillemets/generalites-sur-les-guillemets\", note: \"Chevrons, second niveau et espace int\\u00E9rieure identiques \\u00E0 fr (France) ; aucun \\u00E9cart qu\\u00E9b\\u00E9cois trouv\\u00E9. La largeur exacte de l'espace int\\u00E9rieure (U+00A0 ordinaire vs U+202F fine) n'est pas non plus tranch\\u00E9e ici \\u2014 l'OQLF emploie le terme g\\u00E9n\\u00E9rique \\u00AB espace ins\\u00E9cable \\u00BB ; la valeur \\u00AB nbsp \\u00BB est reprise de fr.json en attendant que ce point soit r\\u00E9solu pour les deux locales.\" }, { rule: \"dashes\", cite: \"Jacques Andr\\u00E9, Petites le\\u00E7ons de typographie, \\u00A7 2.2 et tableau 1 \\u2014 voir spec/locales/fr.json pour la citation compl\\u00E8te ; corrobor\\u00E9 par l'OQLF, \\u00AB Tiret : mise en valeur \\u00BB : \\u00AB Les tirets sont pr\\u00E9c\\u00E9d\\u00E9s et suivis d'un espacement. \\u00BB\", url: \"https://vitrinelinguistique.oqlf.gouv.qc.ca/index.php?id=23378\", note: \"Repris de fr : tiret cadratin espac\\u00E9 pour l'incise, aucune valeur de plage v\\u00E9rifi\\u00E9e (range: none). L'OQLF confirme l'espacement mais ne distingue pas le cadratin du demi-cadratin ; aucun \\u00E9cart qu\\u00E9b\\u00E9cois trouv\\u00E9 sur ce point.\" }, { rule: \"ellipsis\", cite: \"Jacques Andr\\u00E9, Petites le\\u00E7ons de typographie, \\u00A7 5.1.2 et tableau 2 \\u2014 voir spec/locales/fr.json pour la citation compl\\u00E8te\", url: \"http://jacques-andre.fr/faqtypo/lessons.pdf\", note: \"Repris tel quel de fr ; aucune source qu\\u00E9b\\u00E9coise consult\\u00E9e s\\u00E9par\\u00E9ment pour ce point, aucun \\u00E9cart identifi\\u00E9 dans les sources OQLF lues.\" }, { rule: \"hyphen\", cite: \"Jacques Andr\\u00E9, Petites le\\u00E7ons de typographie, tableau 1 \\u2014 voir spec/locales/fr.json pour la citation compl\\u00E8te\", url: \"http://jacques-andre.fr/faqtypo/lessons.pdf\", note: \"Repris tel quel de fr : aucune source consult\\u00E9e n'impose un trait d'union ins\\u00E9cable pour une classe ferm\\u00E9e de formes morphologiques fran\\u00E7aises, en France comme au Qu\\u00E9bec.\" }, { rule: \"nbsp\", cite: \"Office qu\\u00E9b\\u00E9cois de la langue fran\\u00E7aise, Banque de d\\u00E9pannage linguistique, \\u00AB Abr\\u00E9viation de num\\u00E9ro \\u00BB : \\u00AB L'abr\\u00E9viation courante du nom num\\u00E9ro est no ou No, avec la lettre o minuscule en exposant \\u00BB ; \\u00AB On n'abr\\u00E8ge le mot num\\u00E9ro que s'il suit imm\\u00E9diatement le nom qu'il d\\u00E9termine \\u00BB ; exemple : \\u00AB C'est le billet no 852410 qui a valu le gros lot \\u00E0 sa d\\u00E9tentrice \\u00BB\", url: \"https://vitrinelinguistique.oqlf.gouv.qc.ca/25450/les-abreviations-et-les-symboles/les-abreviations/cas-particuliers-dabreviations/abreviation-de-numero\", note: \"Deux choses distinctes, et il faut les tenir s\\u00E9par\\u00E9es. Ce que la source \\u00E9tablit : \\u00AB n\\u00B0 \\u00BB est une abr\\u00E9viation, pas un symbole, d'o\\u00F9 beforeNumber et non afterSymbols \\u2014 l'argument est aussi m\\u00E9canique, un \\u00AB \\u00B0 \\u00BB seul plac\\u00E9 dans afterSymbols serait inerte puisque N6 exige que le code point pr\\u00E9c\\u00E9dent ne soit pas ALNUM, or c'est la lettre \\u00AB n \\u00BB (nbsp.md \\u00A73.8). Ce que la source n'\\u00E9tablit pas : la s\\u00E9quence exacte de code points. L'OQLF prescrit un o minuscule en exposant, un trac\\u00E9 et non un code point, et ne nomme nulle part le signe de degr\\u00E9 ni la ligature \\u00AB num\\u00E9ro \\u00BB (U+2116). Pour la France, rien : le \\u00A7 5.1.3 de Jacques Andr\\u00E9, relu int\\u00E9gralement, ne mentionne ni \\u00AB num\\u00E9ro \\u00BB ni \\u00AB no \\u00BB, et le Lexique de l'Imprimerie nationale est un ouvrage imprim\\u00E9 qui n'a pas pu \\u00EAtre consult\\u00E9. D\\u00E9cision de l'op\\u00E9rateur (18.09.2026) : quand la r\\u00E8gle est derri\\u00E8re une source payante, polytypo retient l'usage le plus r\\u00E9pandu et l'applique de la m\\u00EAme fa\\u00E7on partout, l'uniformit\\u00E9 primant la conformit\\u00E9 au canon, et la d\\u00E9cision est signal\\u00E9e comme telle au lieu d'\\u00EAtre pr\\u00E9sent\\u00E9e comme une citation. L'usage le plus r\\u00E9pandu est \\u00AB n \\u00BB + U+00B0, c'est ce que l'on tape et ce que l'on trouve dans les textes en ligne ; N9 n'ayant aucune tol\\u00E9rance de casse, \\u00AB n\\u00B0 \\u00BB et \\u00AB N\\u00B0 \\u00BB sont deux entr\\u00E9es. La phrase \\u00AB on ne s\\u00E9pare pas les num\\u00E9ros par des espacements \\u00BB de la m\\u00EAme page vise les tranches de chiffres \\u00E0 l'int\\u00E9rieur du nombre (\\u00AB billet no 852410 \\u00BB), pas l'espace entre l'abr\\u00E9viation et le nombre.\" }, { rule: \"quotes\", cite: \"Office qu\\u00E9b\\u00E9cois de la langue fran\\u00E7aise, Banque de d\\u00E9pannage linguistique, \\u00AB Cas o\\u00F9 l'\\u00E9lision est obligatoire \\u00BB (derni\\u00E8re mise \\u00E0 jour : 2015) : \\u00AB L'\\u00E9lision ne touche que des mots grammaticaux, habituellement courts, et que les voyelles a, e et i. \\u00BB L'\\u00E9lision est obligatoire pour le d\\u00E9terminant et le pronom la et le, pour les pronoms je, me, te, se et ce plac\\u00E9s devant le verbe, pour si devant il(s), pour que et les conjonctions qui le contiennent, pour jusque, pour la pr\\u00E9position de et pour l'adverbe de n\\u00E9gation ne\", url: \"https://vitrinelinguistique.oqlf.gouv.qc.ca/21737/lorthographe/elision-et-apostrophe/elision-obligatoire\", note: \"Justifie dix des treize entr\\u00E9es de quotes.elisionClitics.before : l (la, le), j (je), m (me), t (te), s (se et si), c (ce), qu (que), jusqu (jusque), d (de), n (ne). Chaque entr\\u00E9e est la plage de lettres maximale \\u00E0 gauche de la marque, d'o\\u00F9 jusqu et non qu pour \\u00AB jusqu'\\u00E0 \\u00BB : sous une comparaison par plage maximale, une entr\\u00E9e qu ne peut pas apparier \\u00AB jusqu' \\u00BB. presqu (presqu'\\u00EEle) et quelqu (quelqu'un) sont volontairement exclus, faute d'attestation dans les articles relus, et l'exclusion est sans co\\u00FBt : dans les deux mots la marque a une lettre de chaque c\\u00F4t\\u00E9. La liste after est vide \\u2014 la BDL d\\u00E9finit l'\\u00E9lision comme l'effacement de la voyelle finale d'un mot, donc la marque suit toujours le mot \\u00E9lid\\u00E9, et l'enclise fran\\u00E7aise prend le trait d'union (donne-moi, y a-t-il), jamais l'apostrophe. Le cas port\\u00E9 par cette liste est l'\\u00E9lision devant un \\u00E9l\\u00E9ment en ligne, l'<em>id\\u00E9e</em> : sans elle, quotes appariait la marque comme une citation et invertissait la paire englobante (issue #53). L'OQLF est l'autorit\\u00E9 du Qu\\u00E9bec : pour fr-CA la citation est directe, pour fr elle tient lieu de substitut, le Lexique de l'Imprimerie nationale et Le Bon Usage n'\\u00E9tant pas consultables en ligne \\u2014 m\\u00EAme lacune que celle d\\u00E9j\\u00E0 signal\\u00E9e ailleurs dans ce fichier. quotes.md \\u00A73.2's span-boundary elision veto (spec 1.4.0) reads this list only when the mark's other literal neighbour is modes.md \\u00A73.2's inline span boundary, so every entry is matched against the maximal LETTER run on one side of the mark and nothing else. The list is decline-only: the worst it can do is refuse a pairing quotes would otherwise have formed.\" }, { rule: \"quotes\", cite: \"Office qu\\u00E9b\\u00E9cois de la langue fran\\u00E7aise, Banque de d\\u00E9pannage linguistique, \\u00AB \\u00C9lision de lorsque, puisque et quoique \\u00BB (2020) : \\u00AB les conjonctions lorsque, puisque et quoique s'\\u00E9lident obligatoirement devant il(s), elle(s), on, un et une, et aussi devant la pr\\u00E9position en \\u00BB ; l'\\u00E9lision g\\u00E9n\\u00E9ralis\\u00E9e devant tout mot commen\\u00E7ant par une voyelle ou un h muet \\u00AB demeure facultative \\u00BB\", url: \"https://vitrinelinguistique.oqlf.gouv.qc.ca/23623/lorthographe/elision-et-apostrophe/elision-de-lorsque-puisque-et-quoique\", note: \"Justifie les trois entr\\u00E9es lorsqu, puisqu, quoiqu. L'\\u00E9lision obligatoire devant il(s), elle(s), on, un, une et en suffit \\u00E0 l'appartenance : la liste \\u00E9tant uniquement restrictive, le caract\\u00E8re facultatif de l'\\u00E9lision g\\u00E9n\\u00E9ralis\\u00E9e ne change rien. L\\u00E0 encore la plage maximale impose des entr\\u00E9es distinctes : qu n'apparie pas \\u00AB lorsqu' \\u00BB. quotes.md \\u00A73.2's span-boundary elision veto (spec 1.4.0) reads this list only when the mark's other literal neighbour is modes.md \\u00A73.2's inline span boundary, so every entry is matched against the maximal LETTER run on one side of the mark and nothing else. The list is decline-only: the worst it can do is refuse a pairing quotes would otherwise have formed.\" }] },\n it: { locale: \"it\", name: \"Italian\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"l\", \"un\", \"d\"], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [\"%\", \"\\u2030\", \"\\u20AC\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"n.\", \"pag.\"], beforeWord: [], afterSymbols: [], initialBinding: \"none\" }, sources: [{ rule: \"quotes\", cite: \"Ufficio delle pubblicazioni dell'Unione europea, Manuale interistituzionale di convenzioni redazionali, ed. 2011 (IT), punto 4.2.3, riquadro \\u00ABVirgolette\\u00BB: \\u00ABNella lingua italiana esistono tre livelli di virgolette [\\u2026]: livello 1 (citazione principale) \\u00AB\\u2026\\u00BB (Alt 0171/Alt 0187); livello 2 (citazione nella citazione) \\u201C\\u2026\\u201D (Alt 0147/Alt 0148); livello 3 (citazione nella citazione nella citazione) \\u2018\\u2026\\u2019 (Alt 0145/Alt 0146)\\u00BB\", url: \"https://op.europa.eu/it/publication-detail/-/publication/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b\", note: \"L'attribuzione \\u00E8 per LIVELLO DI ANNIDAMENTO, cio\\u00E8 esattamente la forma che lo schema sa esprimere. Il terzo livello non \\u00E8 rappresentabile: lo schema prevede primary e secondary, non tre \\u2014 limite dello schema, non lacuna della fonte, come gi\\u00E0 in el. INFERENZA DICHIARATA sull'identit\\u00E0 dei code point: la guida fornisce un \\u00ABcodice alfanumerico\\u00BB per Windows, non un code point Unicode; Alt 0171/0187/0147/0148 sono CP1252 0xAB/0xBB/0x93/0x94, da cui U+00AB/U+00BB/U+201C/U+201D. Riscontro indipendente: Treccani, Enciclopedia dell'Italiano (2011), voce \\u00ABVirgolette\\u00BB (Luca Cignetti): \\u00AB\\u00E8 consuetudine fare ricorso a tipi diversi di virgoletta, solitamente bassa per la prima citazione e alta per gli altri usi\\u00BB. POSIZIONE CONTRARIA, registrata: l'Accademia della Crusca (\\u00ABLa punteggiatura\\u00BB, 16 luglio 2004) rifiuta di ordinare i due segni al primo livello \\u2014 \\u00ABAlte e basse si usano indifferentemente\\u00BB \\u2014 ma non tratta l'annidamento, quindi non c'\\u00E8 conflitto: la scelta del segno di primo livello \\u00E8 una variante permessa che questo file compie, l'ordine dei livelli \\u00E8 ci\\u00F2 che le altre due fonti stabiliscono. Consultati il 18.09.2026.\" }, { rule: \"quotes\", cite: \"Manuale interistituzionale di convenzioni redazionali, ed. 2011 (IT), Parte quarta, punto 10.1.7 \\u00ABVirgolette\\u00BB: \\u00ABLe virgolette non richiedono spazio n\\u00E9 in apertura n\\u00E9 in chiusura\\u00BB\", url: \"https://op.europa.eu/it/publication-detail/-/publication/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b\", note: \"Giustifica innerSpace = \\\"none\\\" su entrambe le coppie, ed \\u00E8 il punto che separa l'italiano dal francese. LETTURA DICHIARATA COME TALE: \\u00ABn\\u00E9 in apertura n\\u00E9 in chiusura\\u00BB va inteso come \\u00ABn\\u00E9 dal lato di apertura n\\u00E9 dal lato di chiusura del testo racchiuso\\u00BB, cio\\u00E8 nessuno spazio interno; la lettura alternativa \\u00E8 impossibile, perch\\u00E9 lo spazio fra la parola precedente e il segno di apertura non \\u00E8 facoltativo. La tabella del punto 6.4 disambiguerebbe la frase ma NON \\u00E8 invocata: il suo preambolo la qualifica come accordo interistituzionale adottato \\u00ABa vantaggio di una convenzione comune\\u00BB al posto dei codici tipografici nazionali divergenti, cio\\u00E8 prassi editoriale e non norma italiana \\u2014 la stessa lettura gi\\u00E0 applicata in el.json. Conseguenza pratica: l'elisione italiana \\u00E8 al sicuro, perch\\u00E9 dell'\\u00ABamico\\u00BB non richiede spazio interno. elisionIdioms resta vuoto: l'elisione italiana \\u00E8 un fenomeno clitico, non un idioma della forma {left, elided, right}. Consultati il 18.09.2026.\" }, { rule: \"dashes\", cite: \"Manuale interistituzionale di convenzioni redazionali, ed. 2011 (IT), punto 4.2.3, riquadro \\u00ABTrattini\\u00BB: \\u00ABIn italiano utilizzare il trattino lungo come eventuale alternativa alle parentesi\\u00BB; Parte quarta, punto 10.1.10 \\u00ABLineetta\\u00BB, con l'esempio stampato \\u00ABLa casa \\u2014 se casa si poteva definire quel rudere \\u2014 sorgeva ai piedi del colle\\u00BB\", url: \"https://op.europa.eu/it/publication-detail/-/publication/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b\", note: \"Giustifica dash.parenthetical = \\\"em-spaced\\\": U+2014 con uno spazio ordinario su CIASCUN lato di CIASCUNA lineetta. La spaziatura \\u00E8 simmetrica, quindi \\u2014 a differenza dello spagnolo e del greco \\u2014 l'enum la esprime senza forzature. INFERENZA DICHIARATA sul code point: Alt 0151 \\u00E8 CP1252 0x97, da cui U+2014. Riscontro sulla SPAZIATURA, non sul code point: Treccani, \\u00ABTrattino [prontuario]\\u00BB (Stefano Telve, 2011), che del trattino breve scrive \\u00ABA differenza della lineetta, non \\u00E8 preceduto n\\u00E9 seguito da spazi\\u00BB. COSTO ACCETTATO, verificato sul motore e registrato qui perch\\u00E9 non venga riscoperto come bug: il punto 10.1.11 prescrive il trattino spaziato per collegare due date di mesi diversi (\\u00AB25 maggio - 10 giugno 1985\\u00BB), e la guardia P1 di dashes.md \\u00A73.2 converte qualunque trattino isolato e spaziato fra parole, quindi il motore produce una lineetta l\\u00EC. Non \\u00E8 una particolarit\\u00E0 italiana: fr, ru, de-DE e en-GB, gi\\u00E0 pubblicate, si comportano allo stesso modo sulla stessa stringa. Consultati il 18.09.2026.\" }, { rule: \"ranges\", cite: \"Manuale interistituzionale di convenzioni redazionali, ed. 2011 (IT), Parte quarta, punto 10.3.1 \\u00ABNumeri arabi\\u00BB: \\u00ABI numeri arabi non richiedono la lineetta (lineato) bens\\u00EC il trattino (divisione)\\u00BB, con l'esempio stampato \\u00ABla sessione del 15-19 giugno 1985\\u00BB; punto 10.1.11: \\u00ABIl trattino \\u00E8 anche impiegato, senza alcuno spazio, per collegare due anni civili o due date di uno stesso mese: 1971-1972, 10-15 settembre 1985\\u00BB\", url: \"https://op.europa.eu/it/publication-detail/-/publication/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b\", note: \"Giustifica dash.range = \\\"none\\\", e lo fa in POSITIVO, non per assenza di citazione: la fonte prescrive il trattino U+002D \\u2014 il carattere che l'autore ha gi\\u00E0 digitato \\u2014 ed esclude la lineetta per nome. L'enum non ha un valore \\u00ABtrattino\\u00BB: \\\"none\\\" \\u00E8 la codifica esatta di ci\\u00F2 che la fonte richiede. Riscontro: Treccani, \\u00ABTrattino [prontuario]\\u00BB (Telve 2011), esempi \\u00ABil fascicolo del 2-3 luglio\\u00BB, \\u00ABanno accademico 2010-2011\\u00BB. Voce separata da quella di dashes bench\\u00E9 entrambe le regole leggano il campo dash: la citazione \\u00E8 distinta e pi\\u00F9 forte. Consultati il 18.09.2026.\" }, { rule: \"ellipsis\", cite: \"Manuale interistituzionale di convenzioni redazionali, ed. 2011 (IT), Parte quarta, punto 10.1.8 \\u00ABPunti di sospensione\\u00BB: \\u00ABSegno d'interpunzione costituito da tre punti\\u00BB; Accademia della Crusca, Consulenza linguistica, \\u00ABLa punteggiatura\\u00BB (Mara Marzullo, 16 luglio 2004): \\u00ABI puntini di sospensione si usano sempre nel numero di tre\\u00BB\", url: \"https://accademiadellacrusca.it/it/consulenza/la-punteggiatura/143\", note: \"Giustifica abbreviatedAfterTerminal = false. Due fonti indipendenti affermano che i puntini sono sempre tre, e nessuna prevede la forma a due punti dopo U+003F o U+0021 che usa il russo: il ramo russo di ellipsis.md resta spento per l'italiano. Nessuna delle due si pronuncia su U+2026 contro tre U+002E; quella scelta \\u00E8 del motore ed \\u00E8 identica in ogni locale. DIVERGENZA NOTA, registrata: gli esempi stampati del Manuale non lasciano spazio prima dei puntini, mentre spaces.md \\u00A73.4 conserva in ogni locale lo spazio che precede una sequenza di punti; \\u00E8 deliberata e argomentata in spaces.md \\u00A77.9, identica a quella gi\\u00E0 registrata per el. Il Manuale \\u00E8 consultabile all'indirizzo op.europa.eu (cfr. le altre voci di questo file); l'url di questa voce punta alla fonte Crusca, poich\\u00E9 lo schema ne ammette uno solo. Consultati il 18.09.2026.\" }, { rule: \"hyphen\", cite: \"Manuale interistituzionale di convenzioni redazionali, ed. 2011 (IT), Parte quarta, punto 10.1.11 \\u00ABTrattino\\u00BB: \\u00ABIl trattino (\\u00ABdivisione\\u00BB in linguaggio tipografico) [\\u2026] si impiega principalmente per dividere la parola in fin di riga\\u00BB; \\u00ABSi pu\\u00F2 anche usare per unire due parole contraendo la prima: trattato italo-francese\\u00BB\", url: \"https://op.europa.eu/it/publication-detail/-/publication/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b\", note: \"Giustifica le tre liste vuote. La fonte enumera gli impieghi del trattino \\u2014 e il primo che nomina \\u00E8 l'OPPOSTO dell'insecabilit\\u00E0 \\u2014 senza definire alcuna classe chiusa di forme morfologiche il cui trattino debba resistere all'andata a capo, che \\u00E8 l'unica cosa che questa regola consuma. Riscontro: Treccani, \\u00ABTrattino [prontuario]\\u00BB (Telve 2011), che elenca le funzioni di unione (afro-cubano, porta-finestra, maxi-schermo) senza definire neppure essa un elenco chiuso. La famiglia di prefissi (ex-, anti-, maxi-) \\u00E8 stata verificata espressamente perch\\u00E9 \\u00E8 l'unica che lo schema saprebbe contenere: le fonti la trattano come schema produttivo e aperto, e un insieme aperto non \\u00E8 esprimibile in wordList. Consultati il 18.09.2026.\" }, { rule: \"nbsp\", cite: \"BIPM, The International System of Units (SI), 9th ed. (2019), concise summary: \\u00ABA single space is always left between the number and the unit\\u00BB\", url: \"https://www.bipm.org/documents/20126/41483022/SI-Brochure-9-concise-EN.pdf\", note: \"Autorit\\u00E0 per l'ELENCO delle unit\\u00E0, non per il legame: che lo spazio sia insecabile e che sia U+00A0 \\u00E8 deciso da nbsp.md \\u00A72.1, che una locale non pu\\u00F2 variare. Stessa impostazione di en-US, en-GB, fi e sv. L'elenco segue la forma prudente di fr e de-DE ed esclude deliberatamente i simboli di una sola lettera (m, g, l, s, A), che non si possono disambiguare senza contesto. La tabella del punto 6.4 del Manuale darebbe lo stesso risultato per \\u00AB%\\u00BB e \\u00AB\\u00B0C\\u00BB ma non \\u00E8 invocata, per la ragione detta nella voce quotes. Consultati il 18.09.2026.\" }, { rule: \"nbsp\", cite: \"Manuale interistituzionale di convenzioni redazionali, ed. 2011 (IT), punto 4.2.3, riquadro \\u00ABSpazi vuoti protetti\\u00BB: \\u00ABConsentono di evitare la troncatura a fine riga di elementi che devono rimanere uniti\\u00BB; \\u00ABDa usare solo nei casi seguenti [\\u2026]: n.\\u2022 JO L\\u2022 10\\u2022000 / pag.\\u2022 JO C\\u2022 C.\\u2022M. Dupont\\u00BB, dove \\u00AB\\u2022\\u00BB indica lo spazio fisso\", url: \"https://op.europa.eu/it/publication-detail/-/publication/e774ea2a-ef84-4bf6-be92-c9ebebf91c1b\", note: \"INFERENZA DICHIARATA, accettata per decisione dell'operatore il 18.09.2026, non citazione piena \\u2014 ed \\u00E8 esattamente la distinzione che questo campo esiste per non far sparire. I riquadri \\u00ABVirgolette\\u00BB e \\u00ABTrattini\\u00BB dello stesso punto 4.2.3 dicono \\u00ABNella lingua italiana\\u00BB e \\u00ABIn italiano\\u00BB: questo riquadro NON lo dice, ed \\u00E8 in parte non adattato, poich\\u00E9 \\u00ABJO L\\u00BB e \\u00ABJO C\\u00BB sono il Journal officiel francese e \\u00ABDupont\\u00BB \\u00E8 un cognome francese, in un'edizione italiana il cui testo originale era in francese. Ci\\u00F2 che l'italiano c'\\u00E8 davvero: \\u00ABpag.\\u00BB \\u00E8 italiano (il francese scrive \\u00ABp.\\u00BB) e \\u00ABn.\\u00BB \\u00E8 uso italiano corrente, quindi il riquadro \\u00E8 stato localizzato almeno in parte \\u2014 su questo poggia beforeNumber. La sequenza \\u00ABC.\\u2022M. Dupont\\u00BB non contiene invece alcun materiale italiano, e initialBinding resta perci\\u00F2 \\\"none\\\", il valore pulito da citazione. Nessuna tolleranza di caso: N9 non ne ha, e sono stampate solo le forme minuscole \\u00ABn.\\u00BB e \\u00ABpag.\\u00BB. \\u00AB10\\u2022000\\u00BB \\u00E8 raggruppamento delle migliaia e \\u00ABJO L\\u2022\\u00BB una serie della Gazzetta ufficiale: nessuno dei due \\u00E8 esprimibile in questo schema. Consultati il 18.09.2026.\" }, { rule: \"nbsp\", cite: \"Nessuna fonte normativa italiana esaminata prescrive uno spazio prima di un segno d'interpunzione, n\\u00E9 un legame per abbreviazioni con spazio interno, simboli o parole seguenti; liste deliberatamente vuote\", note: \"beforePunctuation e narrowBeforePunctuation sono vuote, e va detto con esattezza su che cosa poggiano: sull'ASSENZA di una fonte italiana che richieda quello spazio, NON su una fonte che lo neghi. A differenza del capitolo greco, che respinge la prassi francese nominandola, la Parte quarta italiana non la nomina mai: i punti 10.1.3 e 10.1.4 descrivono la funzione dei segni e tacciono sulla spaziatura. Il vincolo Q-P rende comunque la lista vuota la scelta strutturalmente sicura. afterShortWords, abbreviations, beforeWord e afterSymbols sono vuote per la stessa ragione: nessuna fonte esaminata le attesta per l'italiano. SEGNALAZIONE ALL'OPERATORE, non risolta qui: la Parte quarta si apre, al punto 10.1, con \\u00ABPer la spaziatura dei segni d'interpunzione, cfr. punto 6.4\\u00BB, cio\\u00E8 il capitolo squalificato come prassi editoriale in el.json; se quel rinvio si leggesse come un'adozione, la tabella diventerebbe evidenza italiana e rafforzerebbe queste liste vuote. Consultati il 18.09.2026.\" }, { rule: \"quotes\", cite: \"Accademia della Crusca, Consulenza linguistica : Vera Gheno, \\u00AB L'articolo indeterminativo \\u00BB (30 settembre 2002), sulla forma femminile \\u00AB un' (nei casi in cui si userebbe l'articolo determinativo l', ma l'elisione non \\u00E8 obbligatoria) [...] va usata davanti a parole che iniziano per vocale \\u00BB ; Raffaella Setti, \\u00AB Elisione e troncamento nell'italiano contemporaneo \\u00BB (14 marzo 2008) : con di l'elisione \\u00E8 spesso applicata e in alcuni casi obbligatoria (d'accordo, d'oro), mentre con mi, ti, la, vi, si \\u00AB l'apostrofo \\u00E8 del tutto facoltativo \\u00BB e \\u00AB non c'\\u00E8 nessun obbligo di elidere, ma \\u00E8 opportuno valutare caso per caso \\u00BB\", url: \"https://accademiadellacrusca.it/it/consulenza/elisione-e-troncamento-nellitaliano-contemporaneo/174\", note: \"Italian elision is not a closed set \\u2014 the Accademia states in terms that it is optional and to be judged case by case \\u2014 so this entry evidences membership per fragment, exactly as quotes.md \\u00A73.2 requires of each elisionIdioms triple, and not the completeness of the list. Three fragments are named literally and are all that is listed: l (definite article l'), un (feminine indefinite un' \\u2014 Crusca is categorical that masculine un takes no apostrophe, and the mechanism cannot tell the two apart, which is harmless because it only ever declines a pairing), and d (di, with d'accordo and d'oro given as obligatory). dell, nell, all, sull and dall are deliberately absent, being unattested by the consulenze read here; under maximal-run matching an l entry does not cover dell'arte either way, since the run there is dell. after is empty: Italian has no enclitic written with an apostrophe. quotes.md \\u00A73.2's span-boundary elision veto (spec 1.4.0) reads this list only when the mark's other literal neighbour is modes.md \\u00A73.2's inline span boundary, so every entry is matched against the maximal LETTER run on one side of the mark and nothing else. The list is decline-only: the worst it can do is refuse a pairing quotes would otherwise have formed.\" }] },\n nl: { locale: \"nl\", name: \"Dutch\", quotes: { primary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2018\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [\"s\", \"t\", \"ns\", \"k\", \"m\", \"em\", \"r\", \"et\"] } }, dash: { parenthetical: \"en-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"prof. dr.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [\"\\u20AC\", \"$\"], initialBinding: \"none\" }, sources: [{ rule: \"quotes\", cite: \"Nederlandse Taalunie, Taaladvies.net, \\u00ABDubbele of enkele aanhalingstekens bij een citaat\\u00BB: \\u00ABEr zijn geen vaste regels voor het gebruik van enkele of dubbele aanhalingstekens. Traditioneel werd aangeraden om bij letterlijk citeren dubbele aanhalingstekens te gebruiken [\\u2026] We raden aan om consequent voor \\u00E9\\u00E9n systeem te kiezen\\u00BB, met voorbeeld (4a): \\u00ABDe koning zei: [U+201C]Ik herinner me nog dat iemand [U+2018]Vive la r\\u00E9publique[U+2019] riep[U+201D]\\u00BB\", url: \"https://taaladvies.net/dubbele-of-enkele-aanhalingstekens-bij-een-citaat/\", note: \"BESLISSING VAN DE OPERATOR, 18.09.2026, en uitdrukkelijk geen citaat: de Taalunie WEIGERT te rangschikken \\u2014 \\u00ABEr zijn geen vaste regels\\u00BB \\u2014 en noemt drie mogelijke nestingen zonder er \\u00E9\\u00E9n te verkiezen. Het schema kent maar \\u00E9\\u00E9n paar per niveau, dus er moet gekozen worden. Gekozen is variant (4a) van de Taalunie zelf: U+201C/U+201D als eerste niveau, U+2018/U+2019 als tweede. Twee gronden, allebei genoemd omdat geen van beide een voorschrift is: het is de vorm die de Taalunie \\u00ABtraditioneel\\u00BB aan het letterlijke citaat verbindt, en het is de vorm die elk ander locale in dit project al heeft. TEGENGESTELDE AANWIJZING, niet verzwegen: \\u00ABAanhalingstekens (algemeen)\\u00BB merkt op dat \\u00ABEnkele aanhalingstekens [\\u2026] het meest gebruikt\\u00BB worden \\u2014 een waarneming over frequentie, geen voorschrift, maar hij wijst de andere kant op. GECONTROLEERD, want het was het enige technische argument dat de keuze had kunnen beslissen: de vrees dat U+2019 als sluitteken zou botsen met de Nederlandse apostrof (auto's, 's-Hertogenbosch, A4'tje) blijkt ONGEGROND \\u2014 beide varianten geven op die zinnen hetzelfde, correcte resultaat. De keuze berust dus op de bron en op eenvormigheid, niet op een motoreigenschap. innerSpace = \\u00ABnone\\u00BB: geen geraadpleegde bron vraagt om een spatie binnen de tekens. Geraadpleegd op 18.09.2026.\" }, { rule: \"dashes\", cite: \"Nederlandse Taalunie, Taaladvies.net, \\u00ABWel of geen spaties voor en na leestekens en symbolen (algemeen)\\u00BB (12 mei 2021): \\u00ABVoor een gedachtestreepje komt altijd een spatie, en ook erna\\u00BB; en \\u00ABGedachtestreepje\\u00BB: \\u00ABAls gedachtestreepje wordt doorgaans het zogeheten halve kastlijntje (\\u2013) gebruikt. Het halve kastlijntje is wat langer dan het koppelteken of het afbreekteken (-)\\u00BB\", url: \"https://taaladvies.net/wel-of-geen-spaties-voor-en-na-leestekens-en-symbolen-algemeen/\", note: \"Onderbouwt dash.parenthetical = \\u00ABen-spaced\\u00BB: een spatie aan weerszijden en een streepje ter lengte van een halve kastlijn, dus U+2013 en niet U+2014. AFLEIDING, als zodanig gemarkeerd: de Taalunie noemt de lengte, niet het codepunt. De toewijzing aan U+2013 steunt op Genootschap Onze Taal, Taalloket, \\u00ABkort streepje (-) of lang streepje (\\u2013)\\u00BB, dat de twee tekens expliciet tegenover elkaar zet en het \\u00ABhele kastlijntje\\u00BB (\\u2014) als vooral Engels en \\u00ABin Nederland [\\u2026] minder gebruikelijk\\u00BB beschrijft. Rangorde, want de bronnen zijn niet gelijkwaardig: de Taalunie is het offici\\u00EBle taalorgaan, Onze Taal een taalvereniging, en Onze Taal wordt hier alleen gebruikt om vast te stellen welk van twee met name genoemde tekens de term van de Taalunie aanduidt. Geraadpleegd op 18.09.2026.\" }, { rule: \"ranges\", cite: \"Genootschap Onze Taal, Taalloket, \\u00ABkort streepje (-) of lang streepje (\\u2013)\\u00BB: het korte streepje geeft tussen getallen \\u00ABtot en met\\u00BB aan \\u2014 \\u00AB1940-1945, de categorie 30-45 jaar, pagina 10-12\\u00BB; Nederlandse Taalunie, \\u00AB20 tot 30-jarigen of 20-30-jarigen?\\u00BB (12 mei 2021), dat overal U+002D toont zonder over het streepjestype iets voor te schrijven\", url: \"https://onzetaal.nl/taalloket/streepje-kort-of-lang\", note: \"Onderbouwt dash.range = \\u00ABnone\\u00BB als een keuze en niet als een leemte: het Nederlandse bereikteken is het koppelteken U+002D, dat de auteur al heeft getypt, en het schema kent daarvoor geen enum-waarde. \\u00ABnone\\u00BB laat de invoer ongemoeid, wat precies is wat de bron beschrijft; \\u00ABen-tight\\u00BB zou er een vorm van maken die geen enkele Nederlandse bron voorschrijft. Aparte ingang van die van dashes, omdat de twee velden op verschillende bronnen rusten. De regel \\u00ABranges\\u00BB staat standaard uit (spec 0.5.0). Geraadpleegd op 18.09.2026.\" }, { rule: \"ellipsis\", cite: \"Nederlandse Taalunie, Taaladvies.net, \\u00ABPunt na enz. of beletselteken aan het einde van een zin\\u00BB (12 mei 2021): \\u00ABna een afkorting met een punt of na een beletselteken aan het eind van een zin, komt geen extra punt\\u00BB, met het voorbeeld \\u00ABHou je van jazz, blues, soul \\u2026?\\u00BB\", url: \"https://taaladvies.net/punt-na-enz-of-beletselteken-aan-het-einde-van-een-zin/\", note: \"Onderbouwt abbreviatedAfterTerminal = false. Het beletselteken is \\u00ABeen vaste eenheid van drie punten\\u00BB en het vraagteken volgt erop; voor de Russische tweepuntsvorm \\u00AB?..\\u00BB geeft geen geraadpleegde Nederlandse bron een grondslag. Anders dan bij het Grieks valt hier niets af te wijken: het Nederlands schrijft juist w\\u00E9l een spatie v\\u00F3\\u00F3r het beletselteken, en spaces.md \\u00A73.4 laat die spatie in elk locale staan \\u2014 bron en motor zijn het hier eens. Geraadpleegd op 18.09.2026.\" }, { rule: \"hyphen\", cite: \"Nederlandse Taalunie, Taaladvies.net, \\u00ABAuto-ongeluk (afbreking)\\u00BB (12 mei 2021): \\u00ABBij woordafbreking valt een koppelteken weg als wordt afgebroken op de plaats waar dat koppelteken in de grondvorm staat\\u00BB\", url: \"https://taaladvies.net/auto-ongeluk-afbreking/\", note: \"Onderbouwt drie lege lijsten. Het Nederlands staat afbreking op het koppelteken niet alleen toe, het laat het koppelteken daarbij w\\u00E9gvallen \\u2014 het omgekeerde van een claim op U+2011. Geen geraadpleegde bron omschrijft een gesloten klasse vormen waarvan het koppelteken een regelovergang moet weerstaan, en dat is het enige wat deze regel leest. Geraadpleegd op 18.09.2026.\" }, { rule: \"nbsp\", cite: \"Nederlandse Taalunie, Taaladvies.net, \\u00ABWel of geen spaties voor en na leestekens en symbolen (algemeen)\\u00BB (12 mei 2021): \\u00ABV\\u00F3\\u00F3r een punt, een komma, een dubbele punt, een puntkomma, een uitroepteken en een vraagteken komt geen spatie\\u00BB; \\u00ABBij toevallige, niet-conventionele combinaties van een getal en een afgekorte eenheid [\\u2026] komt er een spatie tussen het getal en de eenheid\\u00BB; \\u00ABTussen een valutateken en het bijbehorende getal staat een spatie, tenzij het geheel deel uitmaakt van een samenstelling\\u00BB \\u2014 \\u00ABDe vaas kostte \\u20AC 179,\\u2013\\u00BB; BIPM, The International System of Units (SI), 9th ed., concise summary \\u2014 uitsluitend voor de samenstelling van de symbolenlijst\", url: \"https://taaladvies.net/wel-of-geen-spaties-voor-en-na-leestekens-en-symbolen-algemeen/\", note: \"Drie velden uit \\u00E9\\u00E9n pagina. beforePunctuation en narrowBeforePunctuation leeg: alle zes leestekens worden bij name genoemd en krijgen geen spatie \\u2014 een ontkenning, geen stilzwijgen. beforeUnits: BIPM levert welke reeksen SI-symbolen zijn, de Taalunie de Nederlandse conventie; eenletterige symbolen blijven weg zoals in fr.json. afterSymbols = [\\u00AB\\u20AC\\u00BB, \\u00AB$\\u00BB]: LET OP BIJ HET OVERNEMEN VAN fr.json \\u2014 in het Nederlands gaat het valutateken aan het getal vooraf (\\u00AB\\u20AC 179\\u00BB), in het Frans volgt het erop (\\u00AB2 \\u20AC\\u00BB), dus het hoort hier in afterSymbols en niet in beforeUnits. De twee leden zijn die welke het kopje \\u00ABValutatekens (\\u20AC, $)\\u00BB zelf noemt: een klasse-afleiding over een MET NAME GENOEMDE tweeledige klasse, gemarkeerd naar het voorbeeld van fr.json bij M., MM., Mmes. TOEGESTANE VARIANTEN, vastgelegd: voor het procentteken laat de Taalunie zowel \\u00AB25 %\\u00BB als \\u00AB25%\\u00BB toe, en bij \\u00B0C schrijft zij dat er \\u00ABmeestal geen spatie\\u00BB staat terwijl ISO er \\u00E9\\u00E9n voorschrijft. Dat hoeft niet beslecht te worden: N5 zet alleen een bestaande spatie om en voegt er nooit een in (nbsp.md \\u00A73.7). afterShortWords, beforeNumber en beforeWord zijn leeg: deze pagina loopt de leestekens en symbolen \\u00E9\\u00E9n voor \\u00E9\\u00E9n langs en zegt daarover niets, en het Nederlands kent geen tegenhanger van de Poolse sierotka-regel. Geraadpleegd op 18.09.2026.\" }, { rule: \"nbsp\", cite: \"Nederlandse Taalunie, Taaladvies.net, \\u00ABProf.( )dr.\\u00BB (12 mei 2021): \\u00ABJa, tussen bijvoorbeeld prof. dr. komt een spatie\\u00BB; \\u00ABAlleen als de afgekorte woorden tezamen een afkorting vormen, vervalt de spatie: a.s., a.u.b., m.b.v., n.a.v., z.o.z.\\u00BB; \\u00ABIn verzorgd zetwerk wordt tussen voorletters en in afkortingen als v.d. bij voorkeur een halve spatie (of dunspatie) geplaatst\\u00BB\", url: \"http://taaladvies.net/legacylink.php?id=vraag/678\", note: \"Onderbouwt abbreviations = [\\u00ABprof. dr.\\u00BB] \\u2014 de enige Nederlandse afkorting met een interne U+0020 die letterlijk is aangetroffen. De gesloten vormen (a.s., a.u.b.) hebben geen interne spatie, zodat N4 daar niets te bevorderen heeft; d\\u00E1\\u00E1rom telt de lijst \\u00E9\\u00E9n ingang en is hij niet leeg. initialBinding = \\u00ABnone\\u00BB: de enige Nederlandse uitspraak hierover vraagt om een DUNNE spatie, een waarde die het schema niet kent terwijl N7 U+00A0 invoegt \\u2014 en, belangrijker, geen geraadpleegde bron zegt dat een voorletter niet door een regelovergang van de achternaam gescheiden mag worden, en d\\u00E1t is wat N7 werkelijk doet. Geraadpleegd op 18.09.2026.\" }, { rule: \"quotes\", cite: \"Nederlandse Taalunie, Taaladvies.net, \\u00AB Wat-ie wil / wat ie wil \\u00BB (12 mei 2021) : \\u00AB Gereduceerde vormen van persoonlijke voornaamwoorden komen voor in de gesproken taal. Bij de weergave daarvan in schrift gebruiken we bij vormen als 'k, '(e)m, 'r, d'r en '(e)t een weglatingsteken of apostrof. \\u00BB\", url: \"https://taaladvies.net/wat-ie-wil/\", note: \"Attests five entries of quotes.elisionClitics.after: k ('k), m and em ('(e)m \\u2014 the Taalunie's own notation covers both 'm and 'em), r ('r), and t with et ('(e)t). These are word-initial omissions: the mark stands at the start of the reduced form, so the letter run is on the mark's right, which is why they belong in after and not before even though the fragment attaches forward rather than back \\u2014 both lists are positional, per quotes.md \\u00A72. before is empty: m'n, z'n, d'r, zo'n and foto's all have a letter on each side of the mark, so the medial-elision veto already declines them and any before entry would be evidenced-inert; keeping it empty also avoids having to adjudicate m, which occurs on both sides of the mark across the language ('m = hem, m'n = mijn). 'n (een) is not listed \\u2014 it was not attested by a qualifying Taalunie page in this pass. quotes.md \\u00A73.2's span-boundary elision veto (spec 1.4.0) reads this list only when the mark's other literal neighbour is modes.md \\u00A73.2's inline span boundary, so every entry is matched against the maximal LETTER run on one side of the mark and nothing else. The list is decline-only: the worst it can do is refuse a pairing quotes would otherwise have formed.\" }, { rule: \"quotes\", cite: \"Nederlandse Taalunie, Taaladvies.net, \\u00AB 'S avonds / 's Avonds (hoofdletter?) \\u00BB (12 mei 2021, op grond van de Woordenlijst 2015) : \\u00AB Als de zin met een apostrof begint, krijgt het eerstvolgende volledige woord in de zin de hoofdletter \\u00BB, met de voorbeelden \\u00AB 's Avonds werkt John in een caf\\u00E9 \\u00BB, \\u00AB 't Was een mooie dag \\u00BB en \\u00AB 'ns Kijken hoe we dat doen \\u00BB\", url: \"https://taaladvies.net/s-avonds-of-s-avonds-hoofdletter/\", note: \"Attests s ('s avonds, from the older genitive des avonds), t ('t was) and ns ('ns kijken). The same entries cover 's-Gravenhage and 's-Hertogenbosch, where a hyphen rather than a space follows the letter run.\" }] },\n pl: { locale: \"pl\", name: \"Polish\", quotes: { primary: { open: \"\\u201E\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u00BB\", close: \"\\u00AB\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [\"a\", \"i\", \"o\", \"u\", \"w\", \"z\"], abbreviations: [\"lek. med.\", \"in\\u017C. g\\u00F3rn.\", \"bp sufr.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [\"\\u00A7\"], initialBinding: \"none\" }, sources: [{ rule: \"quotes\", cite: \"S\\u0142ownik j\\u0119zyka polskiego PWN, \\u00ABZasady pisowni i interpunkcji\\u00BB, \\u00A798 \\u00ABCudzys\\u0142\\u00F3w\\u00BB, wst\\u0119p: \\u00ABW druku i w r\\u0119kopisach u\\u017Cywa si\\u0119 najcz\\u0119\\u015Bciej cudzys\\u0142owu o postaci: [U+201E] [U+201D] (tzw. cudzys\\u0142\\u00F3w apostrofowy)\\u00BB; \\u00ABW specyficznych zastosowaniach pojawia si\\u0119 te\\u017C cudzys\\u0142\\u00F3w ostrok\\u0105tny: [U+00BB] [U+00AB] lub [U+00AB] [U+00BB]. Cudzys\\u0142\\u00F3w o ostrzach skierowanych do \\u015Brodka jest u\\u017Cywany [\\u2026] w przypadku, gdy wyst\\u0119puje cudzys\\u0142\\u00F3w w cudzys\\u0142owie\\u00BB\", url: \"https://sjp.pwn.pl/zasady/Cudzyslow;629866.html\", note: \"Pierwszy stopie\\u0144: U+201E otwieraj\\u0105cy, U+201D zamykaj\\u0105cy \\u2014 nie U+201C, jak w niemieckim. Drugi stopie\\u0144: para \\u00ABo ostrzach skierowanych do \\u015Brodka\\u00BB, czyli U+00BB otwieraj\\u0105cy i U+00AB zamykaj\\u0105cy; para U+00AB\\u2026U+00BB jest w tym samym paragrafie przypisana do wyodr\\u0119bniania znacze\\u0144 i do dialog\\u00F3w, a nie do cudzys\\u0142owu w cudzys\\u0142owie \\u2014 kierunek jest wi\\u0119c odwrotny do tego, czego spodziewa si\\u0119 czytelnik znaj\\u0105cy francuskie \\u00AB\\u2026\\u00BB. Kody znak\\u00F3w ustalono, pytaj\\u0105c o U+XXXX dla ka\\u017Cdego glifu z osobna, a nie na oko. innerSpace = \\u00ABnone\\u00BB: \\u017Cadne \\u017Ar\\u00F3d\\u0142o nie \\u017C\\u0105da odst\\u0119pu wewn\\u0105trz cudzys\\u0142owu. WARIANT DOPUSZCZALNY, odnotowany: Wola\\u0144ski, Poradnia J\\u0119zykowa PWN, \\u00ABCudzys\\u0142owy drugiego stopnia\\u00BB (26.05.2020) dopuszcza na drugim stopniu zar\\u00F3wno \\u00BB\\u2026\\u00AB, jak i \\u00AB\\u2026\\u00BB; Poradnia jest \\u017Ar\\u00F3d\\u0142em doradczym ni\\u017Cszej rangi ni\\u017C \\u00ABZasady\\u00BB, wi\\u0119c wybrano form\\u0119, kt\\u00F3r\\u0105 \\u00A798 wi\\u0105\\u017Ce wprost z cudzys\\u0142owem w cudzys\\u0142owie. Trzeci stopie\\u0144 zagnie\\u017Cd\\u017Cenia nie jest wyra\\u017Calny w locale.schema.json. Konsultowano 18.09.2026.\" }, { rule: \"dashes\", cite: \"S\\u0142ownik j\\u0119zyka polskiego PWN, \\u00ABZasady pisowni i interpunkcji\\u00BB, [403] 93.7: \\u00ABWtr\\u0105cenia ujmujemy w dwa my\\u015Blniki\\u00BB; [408] 93.12, UWAGA: \\u00ABP\\u00F3\\u0142pauza u\\u017Cywana w funkcji my\\u015Blnika ma po bokach spacje\\u00BB; 21.4, z przyk\\u0142adem \\u00ABWyrazy: czarny \\u2013 bia\\u0142y to antonimy\\u00BB\", url: \"https://sjp.pwn.pl/zasady/408-93-12-Myslnik-wyznaczajacy-relacje-miedzy-dwoma-wyrazami-lub-wartosciami;629831.html\", note: \"Uzasadnia dash.parenthetical = \\u00ABen-spaced\\u00BB. Odst\\u0119py s\\u0105 w \\u017Ar\\u00F3d\\u0142ach jednomy\\u015Blne \\u2014 my\\u015Blnik ma spacje po obu stronach \\u2014 natomiast D\\u0141UGO\\u015A\\u0106 kreski nie jest przez PWN rozstrzygni\\u0119ta: korpus [408] sk\\u0142ada my\\u015Blnik jako U+2014, przyk\\u0142ad w 21.4 jako U+2013, a Ba\\u0144ko (\\u00ABprzedzia\\u0142y liczbowe\\u00BB, 28.02.2012) pisze wprost, \\u017Ce my\\u015Blnik \\u00ABokre\\u015Blany jest przez obecno\\u015B\\u0107 pauz po bokach, a nie przez d\\u0142ugo\\u015B\\u0107 kreski\\u00BB. DECYZJA OPERATORA, 18.09.2026, a nie cytat: wybrano p\\u00F3\\u0142pauz\\u0119 U+2013, bo to ona jest w UWADZE [408] nazwana po imieniu w funkcji my\\u015Blnika i bo tak\\u0105 sam\\u0105 warto\\u015B\\u0107 maj\\u0105 ju\\u017C de-DE, en-GB, fi i sv \\u2014 przy \\u017Ar\\u00F3dle, kt\\u00F3re nie rozstrzyga, jednolito\\u015B\\u0107 w obr\\u0119bie projektu jest lepszym kryterium ni\\u017C preferencja. Skutek uboczny, odnotowany: dashes.md \\u00A73.4 P5 odrzuca ci\\u0105g dok\\u0142adnie jednej U+2013 w ka\\u017Cdym locale, wi\\u0119c istniej\\u0105ce polskie wtr\\u0105cenia z p\\u00F3\\u0142pauz\\u0105 pozostaj\\u0105 nietkni\\u0119te, a zamieniane s\\u0105 U+002D i U+2014. Konsultowano 18.09.2026.\" }, { rule: \"ranges\", cite: \"S\\u0142ownik j\\u0119zyka polskiego PWN, \\u00ABZasady pisowni i interpunkcji\\u00BB, [408] 93.12, UWAGA: \\u00ABW druku liczby arabskie oznaczaj\\u0105ce przedzia\\u0142 od \\u2014 do rozdziela si\\u0119 p\\u00F3\\u0142pauz\\u0105, czyli kreseczk\\u0105 \\u015Bredniej wielko\\u015Bci, niemaj\\u0105c\\u0105 po bokach odst\\u0119p\\u00F3w, np. 1914\\u20131918\\u00BB\", url: \"https://sjp.pwn.pl/zasady/408-93-12-Myslnik-wyznaczajacy-relacje-miedzy-dwoma-wyrazami-lub-wartosciami;629831.html\", note: \"Uzasadnia dash.range = \\u00ABen-tight\\u00BB: p\\u00F3\\u0142pauza U+2013 bez spacji. Potwierdzone dwukrotnie: Wola\\u0144ski, \\u00ABZakres liczbowy\\u00BB (1.01.2024) \\u2014 \\u00ABSpacje wok\\u00F3\\u0142 znaku przedzia\\u0142u [\\u2026] to po prostu b\\u0142\\u0105d ortotypograficzny\\u00BB; oraz Ba\\u0144ko (28.02.2012), kt\\u00F3ry przywo\\u0142uje \\u00ABEdycj\\u0119 tekst\\u00F3w\\u00BB Wola\\u0144skiego w tym samym duchu \\u2014 przywo\\u0142anie jest cudze, samej ksi\\u0105\\u017Cki nie konsultowano i nie jest tu cytowana. Regu\\u0142a \\u00ABranges\\u00BB jest domy\\u015Blnie wy\\u0142\\u0105czona (spec 0.5.0). Konsultowano 18.09.2026.\" }, { rule: \"ellipsis\", cite: \"S\\u0142ownik j\\u0119zyka polskiego PWN, \\u00ABZasady pisowni i interpunkcji\\u00BB, [396] 92.4: gdy wielokropek zbiega si\\u0119 z pytajnikiem lub wykrzyknikiem, \\u00ABznaki te w tek\\u015Bcie umieszczamy\\u00BB, np. \\u00ABCzy jest ona tu z wami\\u2026?\\u00BB, \\u00ABJak strasznie gor\\u0105co\\u2026!\\u00BB\", url: \"https://sjp.pwn.pl/zasady/Wielokropek-obok-innych-znakow-interpunkcyjnych;629818.html\", note: \"Uzasadnia abbreviatedAfterTerminal = false. Wielokropek to zawsze trzy kropki, a pytajnik i wykrzyknik stoj\\u0105 PO nim \\u2014 rosyjska forma dwukropkowa \\u00AB?..\\u00BB nie jest w polszczy\\u017Anie przewidziana przez \\u017Cadne konsultowane \\u017Ar\\u00F3d\\u0142o. Sprawdzono to celowo: gdyby polski t\\u0119 form\\u0119 mia\\u0142, by\\u0142by drugim po rosyjskim locale z warto\\u015Bci\\u0105 true. Konsultowano 18.09.2026.\" }, { rule: \"hyphen\", cite: \"S\\u0142ownik j\\u0119zyka polskiego PWN, \\u00ABZasady pisowni i interpunkcji\\u00BB, [196]: \\u0142\\u0105cznik przenosi si\\u0119 do nast\\u0119pnego wiersza, a na ko\\u0144cu poprzedniego stawia si\\u0119 znak podzia\\u0142u, np. \\u00ABczarno- / -bia\\u0142e fotografie\\u00BB, \\u00ABwojew\\u00F3dztwo warmi\\u0144sko- / -mazurskie\\u00BB\", url: \"https://sjp.pwn.pl/zasady/Podzial-wyrazu-w-miejscu-lacznika;629553.html\", note: \"Uzasadnia trzy puste listy. Polszczyzna nie tylko dopuszcza podzia\\u0142 w miejscu \\u0142\\u0105cznika \\u2014 ona go normuje, co jest przeciwie\\u0144stwem \\u017C\\u0105dania U+2011. Puste listy czyni\\u0105 regu\\u0142\\u0119 dowodliwym no-opem dla polskiego (hyphen.md \\u00A72). Konsultowano 18.09.2026.\" }, { rule: \"nbsp\", cite: \"S\\u0142ownik j\\u0119zyka polskiego PWN, \\u00ABZasady pisowni i interpunkcji\\u00BB, 21.4: \\u00ABMi\\u0119dzy liter\\u0105 ko\\u0144cz\\u0105c\\u0105 wyraz a znakiem interpunkcyjnym [\\u2026] nie stosujemy spacji\\u00BB; 21.1.3: \\u00ABw skr\\u00F3tach od nazw os\\u00F3b [\\u2026] np. lek. med., in\\u017C. g\\u00F3rn., bp sufr.\\u00BB; 21.2: \\u00ABSpacj\\u0119 pomijamy [\\u2026] mi\\u0119dzy inicja\\u0142ami, np. J.K. Bielecki\\u00BB\", url: \"https://sjp.pwn.pl/zasady/Stosowanie-spacji-w-skrotach-od-dwoch-i-wiecej-wyrazow;4836486.html\", note: \"Trzy rzeczy z trzech s\\u0105siaduj\\u0105cych paragraf\\u00F3w. (1) beforePunctuation i narrowBeforePunctuation puste: polszczyzna nie stawia przed \\u00AB:\\u00BB, \\u00AB;\\u00BB, \\u00AB!\\u00BB, \\u00AB?\\u00BB ani U+00A0, ani U+202F, a \\u017Ar\\u00F3d\\u0142o odmawia im odst\\u0119pu wprost \\u2014 to zaprzeczenie, nie milczenie. (2) abbreviations: trzy skr\\u00F3ty zacytowane dos\\u0142ownie wraz z wewn\\u0119trzn\\u0105 spacj\\u0105, czyli twierdzenie o PRZYNALE\\u017BNO\\u015ACI w rozumieniu nbsp.md \\u00A72.1. \\u015Awiadomie pomini\\u0119to \\u00ABi in.\\u00BB i \\u00ABz d.\\u00BB: N3 zajmuje te spacje pierwszy (nbsp.md \\u00A73.2), wi\\u0119c wpisy by\\u0142yby martwe, nie b\\u0142\\u0119dne. (3) initialBinding = \\u00ABnone\\u00BB: polskie inicja\\u0142y pisze si\\u0119 bez odst\\u0119pu (\\u00ABJ.K. Bielecki\\u00BB), wi\\u0119c N7 nie ma czego zamienia\\u0107; to rzadki przypadek, w kt\\u00F3rym \\u00ABnone\\u00BB opiera si\\u0119 na twierdzeniu pozytywnym, a nie na niecytowalnym zaprzeczeniu. beforeNumber i beforeWord pozostaj\\u0105 puste: 21.1, 21.2 i 21.4 przeczytano w ca\\u0142o\\u015Bci i \\u017Caden nie wi\\u0105\\u017Ce skr\\u00F3tu z nast\\u0119puj\\u0105c\\u0105 liczb\\u0105 ani z wyrazem. Konsultowano 18.09.2026.\" }, { rule: \"nbsp\", cite: \"dr hab. Adam Wola\\u0144ski, Poradnia J\\u0119zykowa PWN, \\u00ABSieroty na ko\\u0144cu wiersza\\u00BB (8.06.2018): \\u00ABW wierszach tekstu, kt\\u00F3re licz\\u0105 powy\\u017Cej 40 znak\\u00F3w, nie nale\\u017Cy zasadniczo pozostawia\\u0107 na ko\\u0144cu wiersza jednoliterowych sp\\u00F3jnik\\u00F3w i przyimk\\u00F3w (a, i, o, u, w, z, A, I, O, U, W, Z)\\u00BB\", url: \"https://sjp.pwn.pl/poradnia/haslo/Sieroty-na-koncu-wiersza;18684.html\", note: \"Uzasadnia afterShortWords. Lista jest zamkni\\u0119ta i zacytowana dos\\u0142ownie; wersaliki pomini\\u0119to, bo N3 dopasowuje pierwsz\\u0105 liter\\u0119 bez wzgl\\u0119du na wielko\\u015B\\u0107 (nbsp.md \\u00A73.5 krok 1). RANGA \\u0179R\\u00D3D\\u0141A, powiedziana wprost, bo jest tu s\\u0142absza ni\\u017C gdzie indziej w tym pliku: bezwarunkowy zakaz pochodzi z Poradni, kt\\u00F3ra jest \\u017Ar\\u00F3d\\u0142em doradczym, natomiast \\u00ABZasady\\u00BB [204] 54.8.1 s\\u0105 \\u0141AGODNIEJSZE \\u2014 \\u00ABW w\\u0105skich \\u0142amach jednoliterowe sp\\u00F3jniki i przyimki mog\\u0105 pozostawa\\u0107 na ko\\u0144cu wiersza w tek\\u015Bcie ci\\u0105g\\u0142ym, natomiast w tytu\\u0142ach [\\u2026] zawsze powinny by\\u0107 przenoszone\\u00BB \\u2014 a Ba\\u0144ko (\\u00ABs\\u0142owa jednoliterowe na ko\\u0144cu wiersza\\u00BB, 16.02.2003) dodaje, \\u017Ce pozostawienie ich \\u00ABnie stanowi b\\u0142\\u0119du ortograficznego\\u00BB. Obie kwalifikacje \\u2014 szeroko\\u015B\\u0107 \\u0142amu i to, czy tekst jest tytu\\u0142em \\u2014 s\\u0105 dla silnika niewidoczne. DECYZJA OPERATORA, 18.09.2026: regu\\u0142a jedzie bezwarunkowo, jak rosyjska afterShortWords, poniewa\\u017C wi\\u0105zanie jednoliterowego przyimka jest w polskim sk\\u0142adzie praktyk\\u0105 powszechn\\u0105, a koszt b\\u0142\\u0119dnego zadzia\\u0142ania to jeden U+00A0 tam, gdzie i tak nikt nie chce z\\u0142amania wiersza. Konsultowano 18.09.2026.\" }, { rule: \"nbsp\", cite: \"G\\u0142\\u00F3wny Urz\\u0105d Miar, \\u00ABZasady stosowania oznacze\\u0144 i nazw jednostek miar\\u00BB, akapit \\u00ABSpacja\\u00BB: \\u00ABnale\\u017Cy zostawia\\u0107 spacj\\u0119 mi\\u0119dzy warto\\u015Bci\\u0105 liczbow\\u0105 a oznaczeniem jednostki\\u00BB (100 g, 2 L; ale nie: 100g); pkt 12: \\u00ABpomi\\u0119dzy [symbolem %] a warto\\u015Bci\\u0105 liczbow\\u0105 wielko\\u015Bci pozostawia si\\u0119 spacj\\u0119\\u00BB; BIPM, The International System of Units (SI), 9th ed., concise summary \\u2014 dla sk\\u0142adu samej listy symboli\", url: \"https://www.bipm.org/documents/20126/41483022/SI-Brochure-9-concise-EN.pdf\", note: \"Podzia\\u0142 r\\u00F3l taki sam jak w en-US, fi, sv, es i pt: BIPM m\\u00F3wi, kt\\u00F3re \\u0142a\\u0144cuchy s\\u0105 symbolami jednostek SI, a GUM i rozporz\\u0105dzenie \\u2014 jaka jest polska konwencja odst\\u0119pu. ZASTRZE\\u017BENIE CO DO \\u0179R\\u00D3D\\u0141A: dob\\u00F3r regu\\u0142 w dokumencie GUM jest zaw\\u0119\\u017Cony do towar\\u00F3w paczkowanych, natomiast akapit \\u00ABSpacja\\u00BB i pkt 12 powo\\u0142uj\\u0105 si\\u0119 na \\u00A7 15 i \\u00A7 8 ust. 4 rozporz\\u0105dzenia, kt\\u00F3re s\\u0105 prawem powszechnym. WARIANT DOPUSZCZALNY, odnotowany, bo dotyczy najcz\\u0119stszego wpisu: polska tradycja ortotypograficzna pisze procent bez spacji, co Wola\\u0144ski (\\u00ABJeszcze raz o spacji lub jej braku po znaku %\\u00BB, 26.11.2021) uznaje za r\\u00F3wnie poprawne. Rozbie\\u017Cno\\u015B\\u0107 nie wymaga rozstrzygni\\u0119cia: N5 wy\\u0142\\u0105cznie ZAMIENIA istniej\\u0105c\\u0105 spacj\\u0119 i nigdy jej nie wstawia (nbsp.md \\u00A73.7), wi\\u0119c \\u00AB5 %\\u00BB dostaje U+00A0, a \\u00AB5%\\u00BB zostaje nietkni\\u0119te \\u2014 jedna lista obs\\u0142uguje obie po\\u015Bwiadczone formy. Symbole jednoliterowe (m, g, l, s, A) pomini\\u0119to zgodnie z praktyk\\u0105 fr.json. Konsultowano 18.09.2026.\" }, { rule: \"nbsp\", cite: \"dr hab. Adam Wola\\u0144ski, Poradnia J\\u0119zykowa PWN, \\u00ABSymbol paragrafu i wyr\\u00F3\\u017Cnienia tytu\\u0142\\u00F3w akt\\u00F3w prawnych\\u00BB (20.02.2019): \\u00ABSymbol \\u00A7, zast\\u0119puj\\u0105cy wyraz paragraf, mo\\u017Ce by\\u0107 u\\u017Cyty tylko przed liczb\\u0105 zapisan\\u0105 cyframi. Nale\\u017Cy go oddziela\\u0107 od liczby spacj\\u0105\\u00BB\", url: \"https://sjp.pwn.pl/poradnia/haslo/Symbol-paragrafu-i-wyroznienia-tytulow-aktow-prawnych;19239.html\", note: \"Uzasadnia afterSymbols = [\\u00AB\\u00A7\\u00BB]. Warunek \\u00ABtylko przed liczb\\u0105 zapisan\\u0105 cyframi\\u00BB pokrywa si\\u0119 co do joty z w\\u0142asnym stra\\u017Cnikiem N6, kt\\u00F3ry wymaga, by cp[a+k+1] nale\\u017Ca\\u0142o do klasy DIGIT (nbsp.md \\u00A73.8). Poradnia jest \\u017Ar\\u00F3d\\u0142em doradczym; \\u00ABZasady\\u00BB kwestii nie poruszaj\\u0105, wi\\u0119c nie ma sprzeczno\\u015Bci. Konsultowano 18.09.2026.\" }] },\n \"pt-BR\": { locale: \"pt-BR\", name: \"Portuguese (Brazil)\", quotes: { primary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2018\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"d\", \"n\", \"pel\", \"m\", \"t\", \"lh\", \"sant\"], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"p. ex.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"kW\", \"kWh\", \"Hz\"], beforeNumber: [\"p.\"], beforeWord: [], afterSymbols: [], initialBinding: \"none\" }, sources: [{ rule: \"quotes\", cite: \"Brasil, Presid\\u00EAncia da Rep\\u00FAblica, Manual de Reda\\u00E7\\u00E3o da Presid\\u00EAncia da Rep\\u00FAblica, 2.\\u00AA ed. rev. e atual., Bras\\u00EDlia 2002, \\u00A79.1.3.2 \\u00ABAspas\\u00BB: \\u00ABAs aspas t\\u00EAm os seguintes empregos: a) usam-se antes e depois de uma cita\\u00E7\\u00E3o textual\\u00BB, com os exemplos impressos \\u00ABA Constitui\\u00E7\\u00E3o [\\u2026] afirma: \\u201CTodo o poder emana do povo, que o exerce por meio de representantes eleitos ou diretamente\\u201D\\u00BB, \\u00ABpublicado no \\u201CJornal do Brasil\\u201D\\u00BB, \\u00ABa al\\u00EDnea \\u201Ca\\u201D do artigo 146 da Constitui\\u00E7\\u00E3o\\u00BB\", url: \"https://legis.sigepe.gov.br/sigepe-bgp-ws-legis/legis-service/download/?id=0000356386-ALPDF%2F2018\", note: \"Prim\\u00E1rio U+201C/U+201D, secund\\u00E1rio U+2018/U+2019, ambos colados ao texto. FONTE DE N\\u00CDVEL INFERIOR, dito sem rodeios: \\u00E9 o manual de reda\\u00E7\\u00E3o de um editor estatal, n\\u00E3o uma academia \\u2014 a Academia Brasileira de Letras publica um vocabul\\u00E1rio ortogr\\u00E1fico, que \\u00E9 lexical e n\\u00E3o trata de pontua\\u00E7\\u00E3o, e n\\u00E3o foi encontrada fonte brasileira de n\\u00EDvel acad\\u00E9mico que enuncie o par prim\\u00E1rio. O manual nunca usa aspas angulares em nenhuma das p\\u00E1ginas lidas e o seu cap\\u00EDtulo III declara-se derivado das gram\\u00E1ticas brasileiras (Bechara, Cegalla, Luft, Kury). DECIS\\u00C3O DO OPERADOR, 18.9.2026: perante um uso regional atestado mas sem fonte de n\\u00EDvel acad\\u00E9mico, ficheiro pr\\u00F3prio com a fonte que existe, claramente identificada, em vez de deixar o Brasil cair no fallback de pt-PT e receber aspas angulares que n\\u00E3o usa \\u2014 a mesma decis\\u00E3o registada na issue #29, \\u00ABcorrige-se acrescentando locales\\u00BB. O n\\u00EDvel secund\\u00E1rio assenta no exemplo de cita\\u00E7\\u00E3o dentro de cita\\u00E7\\u00E3o, n\\u00E3o numa frase de regra, e \\u00E9 por isso a afirma\\u00E7\\u00E3o mais fraca deste ficheiro. Consultado em 18.9.2026.\" }, { rule: \"dashes\", cite: \"Manual de Reda\\u00E7\\u00E3o da Presid\\u00EAncia da Rep\\u00FAblica (2.\\u00AA ed., 2002), \\u00A79.1.3.4 \\u00ABTravess\\u00E3o\\u00BB: \\u00ABO travess\\u00E3o, que \\u00E9 um h\\u00EDfen prolongado (\\u2013), \\u00E9 empregado nos seguintes casos: a) substitui par\\u00EAnteses, v\\u00EDrgulas, dois-pontos: O controle inflacion\\u00E1rio \\u2013 meta priorit\\u00E1ria do Governo \\u2013 ser\\u00E1 ainda mais rigoroso\\u00BB\", url: \"https://legis.sigepe.gov.br/sigepe-bgp-ws-legis/legis-service/download/?id=0000356386-ALPDF%2F2018\", note: \"Justifica dash.parenthetical = \\\"en-spaced\\\", e \\u00E9 aqui que pt-BR diverge de pt-PT de forma mensur\\u00E1vel. A LARGURA n\\u00E3o foi julgada a olho: extraiu-se a camada de texto do PDF e o car\\u00E1cter do exemplo \\u00E9 U+2013, ao passo que o mesmo exemplo estrutural no guia europeu d\\u00E1 U+2014. O papel e o espa\\u00E7amento coincidem nas duas regi\\u00F5es \\u2014 o travess\\u00E3o substitui par\\u00EAnteses e leva um espa\\u00E7o de cada lado \\u2014, diverge a largura. Consultado em 18.9.2026.\" }, { rule: \"ranges\", cite: \"Nenhuma fonte brasileira consultada prescreve um sinal de intervalo diferente do h\\u00EDfen j\\u00E1 escrito; o Manual de Reda\\u00E7\\u00E3o da Presid\\u00EAncia da Rep\\u00FAblica nada diz sobre intervalos\", note: \"dash.range = \\\"none\\\" por aus\\u00EAncia de prescri\\u00E7\\u00E3o, e n\\u00E3o por prescri\\u00E7\\u00E3o positiva como em pt-PT \\u2014 a diferen\\u00E7a de fundamento fica registada em vez de ser dissimulada. \\u00ABnone\\u00BB preserva o que o autor escreveu, que \\u00E9 o comportamento seguro quando nenhuma fonte fala. Consultado em 18.9.2026.\" }, { rule: \"ellipsis\", cite: \"Acordo Ortogr\\u00E1fico da L\\u00EDngua Portuguesa (1990) e C\\u00F3digo de Reda\\u00E7\\u00E3o Interinstitucional (PT, 2022), ponto 10.4.7 \\u00ABRetic\\u00EAncias\\u00BB: as retic\\u00EAncias completas seguem-se imediatamente a \\u00AB!\\u00BB e a \\u00AB?\\u00BB (\\u00AB\\u00C9 o dianho!\\u2026\\u00BB, \\u00ABporque n\\u00E3o vais ter com o padre?\\u2026\\u00BB); o Manual de Reda\\u00E7\\u00E3o da Presid\\u00EAncia da Rep\\u00FAblica n\\u00E3o tem sec\\u00E7\\u00E3o sobre retic\\u00EAncias \\u2014 o seu cap\\u00EDtulo de pontua\\u00E7\\u00E3o (\\u00A79.2.4) trata apenas da v\\u00EDrgula, do ponto-e-v\\u00EDrgula, dos dois-pontos e dos pontos de interroga\\u00E7\\u00E3o e exclama\\u00E7\\u00E3o\", url: \"https://op.europa.eu/pt/publication-detail/-/publication/01ed788a-d266-11ec-a95f-01aa75ed71a1\", note: \"Justifica abbreviatedAfterTerminal = false. O passo citado escreve as retic\\u00EAncias completas imediatamente a seguir a \\u00AB!\\u00BB e a \\u00AB?\\u00BB \\u2014 \\u00AB!\\u2026\\u00BB e \\u00AB?\\u2026\\u00BB \\u2014, e nenhuma fonte consultada prev\\u00EA a forma abreviada de dois pontos que o russo usa, pelo que esse ramo de ellipsis.md fica desligado para o portugu\\u00EAs. Nenhuma fonte se pronuncia sobre U+2026 contra tr\\u00EAs U+002E: essa escolha \\u00E9 do motor e \\u00E9 igual em todas as locales. Consultado em 18.9.2026. A fonte brasileira cala-se sobre as retic\\u00EAncias, pelo que o valor vem do lado europeu; n\\u00E3o h\\u00E1 diverg\\u00EAncia a registar, h\\u00E1 sil\\u00EAncio.\" }, { rule: \"hyphen\", cite: \"Acordo Ortogr\\u00E1fico da L\\u00EDngua Portuguesa (1990), Base XX: \\u00ABdeve, por clareza gr\\u00E1fica, repetir-se o h\\u00EDfen no in\\u00EDcio da linha imediata\\u00BB; Manual de Reda\\u00E7\\u00E3o da Presid\\u00EAncia da Rep\\u00FAblica (2.\\u00AA ed., 2002), \\u00A79.1.3.1, Observa\\u00E7\\u00E3o: \\u00ABH\\u00EDfen de composi\\u00E7\\u00E3o vocabular ou de \\u00EAnclise e mes\\u00F3clise \\u00E9 repetido quando coincide com translinea\\u00E7\\u00E3o: decreto-/-lei, exigem-/-lhe, far-/-se-\\u00E1\\u00BB\", url: \"http://www.portaldalinguaportuguesa.org/?action=acordo&version=1990\", note: \"Justifica as tr\\u00EAs listas vazias, e justifica-as pela positiva, n\\u00E3o por aus\\u00EAncia de fonte. O portugu\\u00EAs n\\u00E3o s\\u00F3 permite como PRESCREVE a quebra de linha sobre o h\\u00EDfen de um composto, repetindo-o na linha seguinte: uma forma que \\u00E9 normativamente quebrada nesse ponto n\\u00E3o pode ser uma forma cujo h\\u00EDfen tenha de resistir \\u00E0 quebra, que \\u00E9 a \\u00FAnica coisa que esta regra consome. A regra \\u00E9, portanto, um no-op total demonstr\\u00E1vel para o portugu\\u00EAs (hyphen.md \\u00A72), e qualquer runtime que ligue compostos portugueses com U+2011 est\\u00E1 errado. Corroborado pelo C\\u00F3digo de Reda\\u00E7\\u00E3o Interinstitucional (PT, 2022), ponto 10.2 e ponto 10.4.12 (\\u00ABsegunda-/-feira\\u00BB, \\u00ABsalm\\u00E3o-do-/-atl\\u00E2ntico\\u00BB), e pelo Manual de Reda\\u00E7\\u00E3o da Presid\\u00EAncia da Rep\\u00FAblica (Brasil, 2.\\u00AA ed., 2002), \\u00A79.1.3.1 (\\u00ABdecreto-/-lei\\u00BB, \\u00ABfar-/-se-\\u00E1\\u00BB). \\u00C9 o campo em que Portugal, o Brasil e o pr\\u00F3prio Acordo dizem explicitamente a mesma coisa. Consultado em 18.9.2026.\" }, { rule: \"nbsp\", cite: \"BIPM, The International System of Units (SI), 9.\\u00AA ed., resumo conciso: \\u00ABA single space is always left between the number and the unit\\u00BB; C\\u00F3digo de Reda\\u00E7\\u00E3o Interinstitucional (PT, 2022), anexo A3, pontos 2 e 3, para a lista de s\\u00EDmbolos\", url: \"https://www.bipm.org/documents/20126/41483022/SI-Brochure-9-concise-EN.pdf\", note: \"Justifica nbsp.beforeUnits. A locale atesta a PERTEN\\u00C7A \\u2014 que estes s\\u00EDmbolos s\\u00E3o unidades e que se escrevem depois do n\\u00FAmero com um espa\\u00E7o; o mecanismo (converter esse espa\\u00E7o em U+00A0, nunca o inserir) \\u00E9 da regra e est\\u00E1 fixado em nbsp.md \\u00A72.1. REPARO CITADO, mais importante do que qualquer inclus\\u00E3o: o ponto 10.9.1 exclui \\u00ABh\\u00BB por nome \\u2014 \\u00ABhoras (o s\\u00EDmbolo \\u00ABh\\u00BB escreve-se sempre sem ponto, sem espa\\u00E7os): eram as 18h30\\u00BB \\u2014, pelo que \\u00ABh\\u00BB N\\u00C3O entra na lista e h\\u00E1 um caso de conformidade a fix\\u00E1-lo. Os s\\u00EDmbolos de uma s\\u00F3 letra (m, g, l, t, s, A, W, V, K) ficam igualmente de fora, embora atestados, pela mesma raz\\u00E3o que em fr: n\\u00E3o s\\u00E3o desambigu\\u00E1veis sem contexto. Note-se que o portugu\\u00EAs escreve \\u00AB7 %\\u00BB com espa\\u00E7o, ao contr\\u00E1rio do grego. Consultado em 18.9.2026. Para pt-BR a lista \\u00E9 a mesma: nenhuma fonte brasileira consultada a contradiz, e o BIPM n\\u00E3o \\u00E9 uma autoridade sobre o portugu\\u00EAs mas sobre que cadeias s\\u00E3o s\\u00EDmbolos de unidade do SI.\" }, { rule: \"nbsp\", cite: \"Nenhuma fonte brasileira consultada exige espa\\u00E7o antes de pontua\\u00E7\\u00E3o dupla, nem liga\\u00E7\\u00E3o de abreviaturas a palavras ou iniciais; listas deliberadamente vazias\", note: \"Justifica as listas vazias e initialBinding = \\\"none\\\", e diz com exatid\\u00E3o em que se apoiam: ao contr\\u00E1rio do guia grego, a parte portuguesa N\\u00C3O cont\\u00E9m nenhuma frase que negue pelo nome o uso franc\\u00EAs do espa\\u00E7o antes da pontua\\u00E7\\u00E3o dupla. A posi\\u00E7\\u00E3o \\u00E9 \\u00ABnenhuma fonte o exige\\u00BB, e n\\u00E3o \\u00ABuma fonte o pro\\u00EDbe\\u00BB; o que se observa \\u00E9 que nenhum exemplo do cap\\u00EDtulo o escreve, e isso \\u00E9 uma observa\\u00E7\\u00E3o, assinalada como tal. beforeNumber cont\\u00E9m apenas \\u00ABp.\\u00BB: o ponto 10.9.1 atesta a liga\\u00E7\\u00E3o (\\u00ABp. 24\\u00BB, \\u00ABLei n.\\u00BA 123\\u00BB), mas \\u00ABn.\\u00BA\\u00BB N\\u00C3O pode ser listado, porque a nota (3) do ponto 6.4 do mesmo guia prescreve um \\u00ABo\\u00BB sobrescrito e RECUSA expressamente tanto U+00BA como U+00B0 \\u2014 listar \\u00ABn.\\u00BA\\u00BB seria citar uma fonte que pro\\u00EDbe esse mesmo car\\u00E1cter. A decis\\u00E3o do operador de 18.9.2026 sobre o \\u00ABn\\u00B0\\u00BB franc\\u00EAs cobre uma fonte SILENCIOSA e n\\u00E3o se estende a uma que fala e recusa. beforeWord fica vazio: o anexo A3 enumera \\u00ABSr.\\u00BB, \\u00ABDr.\\u00BB, \\u00ABProf.\\u00BB, mas limita-se a expandi-los e nenhuma fonte os mostra ligados ao nome seguinte. GAP REGISTADO, n\\u00E3o resolvido: o ponto 10.9.1 exige espa\\u00E7o protegido DENTRO dos grupos de algarismos (\\u00ABum total de 12 345 euros\\u00BB; \\u00ABeste espa\\u00E7o \\u00E9 protegido\\u00BB), e locale.schema.json n\\u00E3o tem campo para isso. Consultado em 18.9.2026.\" }, { rule: \"quotes\", cite: \"Acordo Ortogr\\u00E1fico da L\\u00EDngua Portuguesa (1990), Base XVIII \\u00AB Do ap\\u00F3strofo \\u00BB, 1.\\u00BA : a) \\u00AB Faz-se uso do ap\\u00F3strofo para cindir graficamente uma contra\\u00E7\\u00E3o ou aglutina\\u00E7\\u00E3o vocabular, quando um elemento ou fra\\u00E7\\u00E3o respetiva pertence propriamente a um conjunto vocabular distinto: d'Os Lus\\u00EDadas, d'Os Sert\\u00F5es; n'Os Lus\\u00EDadas, n'Os Sert\\u00F5es; pel'Os Lus\\u00EDadas, pel'Os Sert\\u00F5es \\u00BB ; b) \\u00AB d'Ele, n'Ele, d'Aquele, n'Aquele, d'O, n'O, pel'O, m'O, t'O, lh'O \\u00BB e a s\\u00E9rie feminina correspondente ; c) \\u00AB Sant'Ana, Sant'Iago \\u00BB ; d) \\u00AB borda-d'\\u00E1gua, copo-d'\\u00E1gua, estrela-d'alva, m\\u00E3e-d'\\u00E1gua, pau-d'alho, pau-d'arco \\u00BB\", url: \"https://www.priberam.pt/docs/AcOrtog90.pdf\", note: \"Base XVIII is a primary normative text common to both orthographies, which is why pt-PT and pt-BR carry the identical list: d, n, pel (1.\\u00BA a and b), m, t, lh (1.\\u00BA b) and sant (1.\\u00BA c). Base XVIII 2.\\u00BA bounds the set from the other side \\u2014 the ap\\u00F3strofo is not admissible in the combinations of de and em with the definite-article forms (do, da, dele, no, na, nele, num and the rest) \\u2014 so this is an enumerated set rather than an argument from silence. The archaic anthroponymic forms of 1.\\u00BA c) (Nun'\\u00C1lvares, Pedr'Eanes) are cited by the same clause but deliberately not listed: both have a letter on each side of the mark, so quotes.md \\u00A73.2's medial-elision veto already declines them and an entry would be evidenced-inert. after is empty: Portuguese enclisis takes a hyphen (Base XVII: am\\u00E1-lo, d\\u00E1-se), never an apostrophe. The clause that makes this list load-bearing is 1.\\u00BA a), which is about book titles: a title set in emphasis rather than italics puts a span boundary immediately after the mark, d'<em>Os Lus\\u00EDadas</em>, which is precisely the shape the veto reads. Retrieved from a faithful reproduction hosted by Priberam/FLiP, including the official text's own errata footnotes, rather than from the official gazette; the Academia Brasileira de Letras PDF has no extractable text layer. quotes.md \\u00A73.2's span-boundary elision veto (spec 1.4.0) reads this list only when the mark's other literal neighbour is modes.md \\u00A73.2's inline span boundary, so every entry is matched against the maximal LETTER run on one side of the mark and nothing else. The list is decline-only: the worst it can do is refuse a pairing quotes would otherwise have formed.\" }] },\n \"pt-PT\": { locale: \"pt-PT\", name: \"Portuguese (Portugal)\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"d\", \"n\", \"pel\", \"m\", \"t\", \"lh\", \"sant\"], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"p. ex.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"kW\", \"kWh\", \"Hz\"], beforeNumber: [\"p.\"], beforeWord: [], afterSymbols: [], initialBinding: \"none\" }, sources: [{ rule: \"quotes\", cite: \"Servi\\u00E7o das Publica\\u00E7\\u00F5es da Uni\\u00E3o Europeia, C\\u00F3digo de Reda\\u00E7\\u00E3o Interinstitucional (edi\\u00E7\\u00E3o PT, 2022, ISBN 978-92-78-42820-4), Quarta parte \\u00ABConven\\u00E7\\u00F5es pr\\u00F3prias da l\\u00EDngua portuguesa\\u00BB, ponto 10.4.10 \\u00ABAspas\\u00BB, N. B.: \\u00ABO primeiro n\\u00EDvel de aspas a utilizar corresponde \\u00E0s aspas angulares (\\u00AB\\u00BB). Quando necess\\u00E1rio, utilizam-se tr\\u00EAs n\\u00EDveis de aspas devidamente hierarquizadas: \\u00AB\\u2026\\u00BB \\u2014 as aspas angulares, \\u201C\\u2026\\u201D \\u2014 as aspas curvas duplas ou v\\u00EDrgulas dobradas, \\u2018\\u2026\\u2019 \\u2014 as aspas curvas simples ou v\\u00EDrgulas simples\\u00BB\", url: \"https://op.europa.eu/pt/publication-detail/-/publication/01ed788a-d266-11ec-a95f-01aa75ed71a1\", note: \"Prim\\u00E1rio U+00AB/U+00BB, secund\\u00E1rio U+201C/U+201D. O terceiro n\\u00EDvel descrito pela fonte n\\u00E3o \\u00E9 exprim\\u00EDvel em locale.schema.json, que s\\u00F3 tem primary e secondary \\u2014 limite do esquema, n\\u00E3o lacuna da fonte, como j\\u00E1 consta de el.json. innerSpace = \\\"none\\\": todos os exemplos do ponto 10.4.10 escrevem o texto colado \\u00E0s aspas e a sec\\u00E7\\u00E3o nunca pede espa\\u00E7o interior. A Quarta parte \\u00E9 o cap\\u00EDtulo espec\\u00EDfico da l\\u00EDngua portuguesa; a Terceira parte do mesmo guia \\u00E9 deliberadamente N\\u00C3O invocada, porque o seu \\u00A76.4 declara que as suas regras \\u00ABs\\u00E3o o resultado de um acordo interinstitucional\\u00BB e que \\u00ABcertas escolhas foram feitas em prol de uma conven\\u00E7\\u00E3o comum\\u00BB \\u2014 estilo de editor, n\\u00E3o prova sobre o portugu\\u00EAs, a mesma desqualifica\\u00E7\\u00E3o que el.json regista. \\u00C9 POR ISTO que esta locale \\u00E9 pt-PT e n\\u00E3o pt: o uso brasileiro diverge e tem ficheiro pr\\u00F3prio (pt-BR), em vez de ser apanhado por um fallback que lhe daria aspas que n\\u00E3o usa. Consultado em 18.9.2026.\" }, { rule: \"dashes\", cite: \"C\\u00F3digo de Reda\\u00E7\\u00E3o Interinstitucional (PT, 2022), Quarta parte, ponto 10.4.8 \\u00ABTravess\\u00E3o\\u00BB: \\u00ABO travess\\u00E3o (tra\\u00E7o horizontal maior que o h\\u00EDfen) emprega-se: [\\u2026] d) No lugar de par\\u00EAnteses: As condi\\u00E7\\u00F5es \\u2014 ordenado e subven\\u00E7\\u00F5es \\u2014 eram boas\\u00BB\", url: \"https://op.europa.eu/pt/publication-detail/-/publication/01ed788a-d266-11ec-a95f-01aa75ed71a1\", note: \"Justifica dash.parenthetical = \\\"em-spaced\\\". O papel (substitui par\\u00EAnteses) e o espa\\u00E7amento (um espa\\u00E7o ordin\\u00E1rio de cada lado de CADA travess\\u00E3o) est\\u00E3o no exemplo impresso; ao contr\\u00E1rio do grego, do espanhol e do italiano, o portugu\\u00EAs n\\u00E3o usa o padr\\u00E3o \\u00ABespa\\u00E7os fora do par, colado por dentro\\u00BB, pelo que o enum exprime a conven\\u00E7\\u00E3o sem for\\u00E7ar nada. A LARGURA foi verificada extraindo a camada de texto do PDF, n\\u00E3o julgada a olho sobre a p\\u00E1gina rasterizada: o car\\u00E1cter \\u00E9 U+2014. Esta \\u00E9 a segunda diverg\\u00EAncia regional do portugu\\u00EAs \\u2014 o Manual de Reda\\u00E7\\u00E3o da Presid\\u00EAncia da Rep\\u00FAblica (Brasil) define o travess\\u00E3o como \\u00ABum h\\u00EDfen prolongado\\u00BB e o seu texto extra\\u00EDdo d\\u00E1 U+2013 \\u2014, e \\u00E9 a segunda raz\\u00E3o para pt-PT e pt-BR serem ficheiros distintos. Consultado em 18.9.2026.\" }, { rule: \"ranges\", cite: \"C\\u00F3digo de Reda\\u00E7\\u00E3o Interinstitucional (PT, 2022), ponto 10.4.11: \\u00ABQuando se trata de dois anos completos ou de um per\\u00EDodo de v\\u00E1rios anos usa-se o h\\u00EDfen: o programa para 1996-1997; o per\\u00EDodo de 1993-1996\\u00BB; ponto 10.9.1: \\u00ABPara qualquer per\\u00EDodo que decorra entre dois anos consecutivos, estes s\\u00E3o separados por um h\\u00EDfen, se o per\\u00EDodo abrange a totalidade dos dois anos (1990-1991), e por uma barra, em caso contr\\u00E1rio (ano letivo de 1990/1991)\\u00BB\", url: \"https://op.europa.eu/pt/publication-detail/-/publication/01ed788a-d266-11ec-a95f-01aa75ed71a1\", note: \"Justifica dash.range = \\\"none\\\" pela positiva. A regra \\u00E9 enunciada duas vezes, em dois cap\\u00EDtulos da parte espec\\u00EDfica da l\\u00EDngua, e as duas vezes nomeia o h\\u00EDfen; a barra fica reservada para o per\\u00EDodo que n\\u00E3o abrange os dois anos completos. \\u00ABnone\\u00BB \\u00E9 o \\u00FAnico valor do enum que respeita a fonte, porque `ranges` n\\u00E3o emite nada nesse modo (ranges.md \\u00A72) e o U+002D escrito pelo autor sobrevive \\u2014 substitu\\u00ED-lo por U+2013 contrariaria a cita\\u00E7\\u00E3o. Consultado em 18.9.2026.\" }, { rule: \"ellipsis\", cite: \"C\\u00F3digo de Reda\\u00E7\\u00E3o Interinstitucional (PT, 2022), ponto 10.4.7 \\u00ABRetic\\u00EAncias\\u00BB, com o exemplo impresso \\u00AB\\u00C9 o dianho!\\u2026 \\u00C9 o dianho!\\u2026 E, olha l\\u00E1, porque n\\u00E3o vais ter com o padre?\\u2026\\u00BB (Aquilino Ribeiro)\", url: \"https://op.europa.eu/pt/publication-detail/-/publication/01ed788a-d266-11ec-a95f-01aa75ed71a1\", note: \"Justifica abbreviatedAfterTerminal = false. O passo citado escreve as retic\\u00EAncias completas imediatamente a seguir a \\u00AB!\\u00BB e a \\u00AB?\\u00BB \\u2014 \\u00AB!\\u2026\\u00BB e \\u00AB?\\u2026\\u00BB \\u2014, e nenhuma fonte consultada prev\\u00EA a forma abreviada de dois pontos que o russo usa, pelo que esse ramo de ellipsis.md fica desligado para o portugu\\u00EAs. Nenhuma fonte se pronuncia sobre U+2026 contra tr\\u00EAs U+002E: essa escolha \\u00E9 do motor e \\u00E9 igual em todas as locales. Consultado em 18.9.2026.\" }, { rule: \"hyphen\", cite: \"Acordo Ortogr\\u00E1fico da L\\u00EDngua Portuguesa (1990), Base XX \\u00ABDa divis\\u00E3o sil\\u00E1bica\\u00BB: \\u00ABNa translinea\\u00E7\\u00E3o de uma palavra composta ou de uma combina\\u00E7\\u00E3o de palavras em que h\\u00E1 um h\\u00EDfen, ou mais, se a parti\\u00E7\\u00E3o coincide com o final de um dos elementos ou membros, deve, por clareza gr\\u00E1fica, repetir-se o h\\u00EDfen no in\\u00EDcio da linha imediata: ex- -alferes\\u00BB\", url: \"http://www.portaldalinguaportuguesa.org/?action=acordo&version=1990\", note: \"Justifica as tr\\u00EAs listas vazias, e justifica-as pela positiva, n\\u00E3o por aus\\u00EAncia de fonte. O portugu\\u00EAs n\\u00E3o s\\u00F3 permite como PRESCREVE a quebra de linha sobre o h\\u00EDfen de um composto, repetindo-o na linha seguinte: uma forma que \\u00E9 normativamente quebrada nesse ponto n\\u00E3o pode ser uma forma cujo h\\u00EDfen tenha de resistir \\u00E0 quebra, que \\u00E9 a \\u00FAnica coisa que esta regra consome. A regra \\u00E9, portanto, um no-op total demonstr\\u00E1vel para o portugu\\u00EAs (hyphen.md \\u00A72), e qualquer runtime que ligue compostos portugueses com U+2011 est\\u00E1 errado. Corroborado pelo C\\u00F3digo de Reda\\u00E7\\u00E3o Interinstitucional (PT, 2022), ponto 10.2 e ponto 10.4.12 (\\u00ABsegunda-/-feira\\u00BB, \\u00ABsalm\\u00E3o-do-/-atl\\u00E2ntico\\u00BB), e pelo Manual de Reda\\u00E7\\u00E3o da Presid\\u00EAncia da Rep\\u00FAblica (Brasil, 2.\\u00AA ed., 2002), \\u00A79.1.3.1 (\\u00ABdecreto-/-lei\\u00BB, \\u00ABfar-/-se-\\u00E1\\u00BB). \\u00C9 o campo em que Portugal, o Brasil e o pr\\u00F3prio Acordo dizem explicitamente a mesma coisa. Consultado em 18.9.2026.\" }, { rule: \"nbsp\", cite: \"C\\u00F3digo de Reda\\u00E7\\u00E3o Interinstitucional (PT, 2022), anexo A3 \\u00ABAbreviaturas e s\\u00EDmbolos\\u00BB, pontos 2 e 3, com as Observa\\u00E7\\u00F5es \\u00ABTodos os n\\u00FAmeros s\\u00E3o acompanhados dos respetivos s\\u00EDmbolos: de 4 m em 4 m; de 1 kg, 6 kg a 15 kg\\u00BB, e Quarta parte, ponto 10.9.1: \\u00ABAs percentagens, pesos e medidas escrevem-se numericamente: 7 % do volume de neg\\u00F3cios\\u00BB, \\u00ABa temperatura atingiu hoje os 39 \\u00B0C\\u00BB; BIPM, The International System of Units (SI), 9.\\u00AA ed., resumo conciso: \\u00ABA single space is always left between the number and the unit\\u00BB\", url: \"https://www.bipm.org/documents/20126/41483022/SI-Brochure-9-concise-EN.pdf\", note: \"Justifica nbsp.beforeUnits. A locale atesta a PERTEN\\u00C7A \\u2014 que estes s\\u00EDmbolos s\\u00E3o unidades e que se escrevem depois do n\\u00FAmero com um espa\\u00E7o; o mecanismo (converter esse espa\\u00E7o em U+00A0, nunca o inserir) \\u00E9 da regra e est\\u00E1 fixado em nbsp.md \\u00A72.1. REPARO CITADO, mais importante do que qualquer inclus\\u00E3o: o ponto 10.9.1 exclui \\u00ABh\\u00BB por nome \\u2014 \\u00ABhoras (o s\\u00EDmbolo \\u00ABh\\u00BB escreve-se sempre sem ponto, sem espa\\u00E7os): eram as 18h30\\u00BB \\u2014, pelo que \\u00ABh\\u00BB N\\u00C3O entra na lista e h\\u00E1 um caso de conformidade a fix\\u00E1-lo. Os s\\u00EDmbolos de uma s\\u00F3 letra (m, g, l, t, s, A, W, V, K) ficam igualmente de fora, embora atestados, pela mesma raz\\u00E3o que em fr: n\\u00E3o s\\u00E3o desambigu\\u00E1veis sem contexto. Note-se que o portugu\\u00EAs escreve \\u00AB7 %\\u00BB com espa\\u00E7o, ao contr\\u00E1rio do grego. Consultado em 18.9.2026.\" }, { rule: \"nbsp\", cite: \"C\\u00F3digo de Reda\\u00E7\\u00E3o Interinstitucional (PT, 2022), anexo A3, ponto 4 \\u00ABObras\\u00BB: \\u00ABp. ex. por exemplo\\u00BB; \\u00ABe. g. exempli gratia (por exemplo). Utilizar de prefer\\u00EAncia p. ex.\\u00BB; Quarta parte, ponto 10.9.1: \\u00ABpagina\\u00E7\\u00E3o corrente, par\\u00E1grafos, artigos: artigo 2.\\u00BA, terceiro par\\u00E1grafo, al\\u00EDnea b), p. 24\\u00BB; nota (3) do ponto 6.4: \\u00ABPara o \\u00AB\\u00BA\\u00BB ordinal (1.\\u00BA, 2.\\u00BA\\u2026) ou em \\u00ABn.\\u00BA\\u00BB, utilizar a termina\\u00E7\\u00E3o \\u00ABo\\u00BB ap\\u00F3s o ponto e em posi\\u00E7\\u00E3o superior \\u00E0 linha [n\\u00E3o utilizar o sinal \\u00AB\\u00BA\\u00BB do teclado Azerty nem a sequ\\u00EAncia Alt 0176 (s\\u00EDmbolo do grau \\u00AB\\u00B0\\u00BB)]\\u00BB\", url: \"https://op.europa.eu/pt/publication-detail/-/publication/01ed788a-d266-11ec-a95f-01aa75ed71a1\", note: \"Justifica as listas vazias e initialBinding = \\\"none\\\", e diz com exatid\\u00E3o em que se apoiam: ao contr\\u00E1rio do guia grego, a parte portuguesa N\\u00C3O cont\\u00E9m nenhuma frase que negue pelo nome o uso franc\\u00EAs do espa\\u00E7o antes da pontua\\u00E7\\u00E3o dupla. A posi\\u00E7\\u00E3o \\u00E9 \\u00ABnenhuma fonte o exige\\u00BB, e n\\u00E3o \\u00ABuma fonte o pro\\u00EDbe\\u00BB; o que se observa \\u00E9 que nenhum exemplo do cap\\u00EDtulo o escreve, e isso \\u00E9 uma observa\\u00E7\\u00E3o, assinalada como tal. beforeNumber cont\\u00E9m apenas \\u00ABp.\\u00BB: o ponto 10.9.1 atesta a liga\\u00E7\\u00E3o (\\u00ABp. 24\\u00BB, \\u00ABLei n.\\u00BA 123\\u00BB), mas \\u00ABn.\\u00BA\\u00BB N\\u00C3O pode ser listado, porque a nota (3) do ponto 6.4 do mesmo guia prescreve um \\u00ABo\\u00BB sobrescrito e RECUSA expressamente tanto U+00BA como U+00B0 \\u2014 listar \\u00ABn.\\u00BA\\u00BB seria citar uma fonte que pro\\u00EDbe esse mesmo car\\u00E1cter. A decis\\u00E3o do operador de 18.9.2026 sobre o \\u00ABn\\u00B0\\u00BB franc\\u00EAs cobre uma fonte SILENCIOSA e n\\u00E3o se estende a uma que fala e recusa. beforeWord fica vazio: o anexo A3 enumera \\u00ABSr.\\u00BB, \\u00ABDr.\\u00BB, \\u00ABProf.\\u00BB, mas limita-se a expandi-los e nenhuma fonte os mostra ligados ao nome seguinte. GAP REGISTADO, n\\u00E3o resolvido: o ponto 10.9.1 exige espa\\u00E7o protegido DENTRO dos grupos de algarismos (\\u00ABum total de 12 345 euros\\u00BB; \\u00ABeste espa\\u00E7o \\u00E9 protegido\\u00BB), e locale.schema.json n\\u00E3o tem campo para isso. Consultado em 18.9.2026.\" }, { rule: \"quotes\", cite: \"Acordo Ortogr\\u00E1fico da L\\u00EDngua Portuguesa (1990), Base XVIII \\u00AB Do ap\\u00F3strofo \\u00BB, 1.\\u00BA : a) \\u00AB Faz-se uso do ap\\u00F3strofo para cindir graficamente uma contra\\u00E7\\u00E3o ou aglutina\\u00E7\\u00E3o vocabular, quando um elemento ou fra\\u00E7\\u00E3o respetiva pertence propriamente a um conjunto vocabular distinto: d'Os Lus\\u00EDadas, d'Os Sert\\u00F5es; n'Os Lus\\u00EDadas, n'Os Sert\\u00F5es; pel'Os Lus\\u00EDadas, pel'Os Sert\\u00F5es \\u00BB ; b) \\u00AB d'Ele, n'Ele, d'Aquele, n'Aquele, d'O, n'O, pel'O, m'O, t'O, lh'O \\u00BB e a s\\u00E9rie feminina correspondente ; c) \\u00AB Sant'Ana, Sant'Iago \\u00BB ; d) \\u00AB borda-d'\\u00E1gua, copo-d'\\u00E1gua, estrela-d'alva, m\\u00E3e-d'\\u00E1gua, pau-d'alho, pau-d'arco \\u00BB\", url: \"https://www.priberam.pt/docs/AcOrtog90.pdf\", note: \"Base XVIII is a primary normative text common to both orthographies, which is why pt-PT and pt-BR carry the identical list: d, n, pel (1.\\u00BA a and b), m, t, lh (1.\\u00BA b) and sant (1.\\u00BA c). Base XVIII 2.\\u00BA bounds the set from the other side \\u2014 the ap\\u00F3strofo is not admissible in the combinations of de and em with the definite-article forms (do, da, dele, no, na, nele, num and the rest) \\u2014 so this is an enumerated set rather than an argument from silence. The archaic anthroponymic forms of 1.\\u00BA c) (Nun'\\u00C1lvares, Pedr'Eanes) are cited by the same clause but deliberately not listed: both have a letter on each side of the mark, so quotes.md \\u00A73.2's medial-elision veto already declines them and an entry would be evidenced-inert. after is empty: Portuguese enclisis takes a hyphen (Base XVII: am\\u00E1-lo, d\\u00E1-se), never an apostrophe. The clause that makes this list load-bearing is 1.\\u00BA a), which is about book titles: a title set in emphasis rather than italics puts a span boundary immediately after the mark, d'<em>Os Lus\\u00EDadas</em>, which is precisely the shape the veto reads. Retrieved from a faithful reproduction hosted by Priberam/FLiP, including the official text's own errata footnotes, rather than from the official gazette; the Academia Brasileira de Letras PDF has no extractable text layer. quotes.md \\u00A73.2's span-boundary elision veto (spec 1.4.0) reads this list only when the mark's other literal neighbour is modes.md \\u00A73.2's inline span boundary, so every entry is matched against the maximal LETTER run on one side of the mark and nothing else. The list is decline-only: the worst it can do is refuse a pairing quotes would otherwise have formed.\" }] },\n ru: { locale: \"ru\", name: \"Russian\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201E\", close: \"\\u201C\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"em-tight\" }, ellipsis: { abbreviatedAfterTerminal: true }, hyphen: { prefixes: [\"\\u043A\\u043E\\u0435-\", \"\\u043A\\u043E\\u0439-\"], suffixes: [\"-\\u0442\\u043E\", \"-\\u043B\\u0438\\u0431\\u043E\", \"-\\u043D\\u0438\\u0431\\u0443\\u0434\\u044C\", \"-\\u0442\\u0430\\u043A\\u0438\", \"-\\u043A\\u0430\"], compounds: [\"\\u0438\\u0437-\\u0437\\u0430\", \"\\u0438\\u0437-\\u043F\\u043E\\u0434\"] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [\"\\u0430\", \"\\u0432\", \"\\u0438\", \"\\u043A\", \"\\u043E\", \"\\u0441\", \"\\u0443\", \"\\u0432\\u043E\", \"\\u0434\\u043E\", \"\\u0437\\u0430\", \"\\u0438\\u0437\", \"\\u043A\\u043E\", \"\\u043D\\u0430\", \"\\u043E\\u0431\", \"\\u043E\\u0442\", \"\\u043F\\u043E\", \"\\u0441\\u043E\"], abbreviations: [\"\\u0438 \\u0442. \\u0434.\", \"\\u0438 \\u0442. \\u043F.\", \"\\u0442. \\u0435.\", \"\\u0438 \\u0434\\u0440.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u20BD\", \"\\u00B0C\", \"\\u043A\\u043C\", \"\\u0441\\u043C\", \"\\u043C\\u043C\", \"\\u043A\\u0433\", \"\\u0433.\", \"\\u0433\\u0433.\", \"\\u0432.\", \"\\u0432\\u0432.\", \"\\u0442\\u044B\\u0441.\", \"\\u043C\\u043B\\u043D\", \"\\u043C\\u043B\\u0440\\u0434\"], beforeNumber: [], beforeWord: [\"\\u0443\\u043B.\", \"\\u043F\\u043B.\"], afterSymbols: [\"\\u2116\", \"\\u00A7\"], initialBinding: \"chain\" }, sources: [{ rule: \"quotes\", cite: \"\\u041F\\u0440\\u0430\\u0432\\u0438\\u043B\\u0430 \\u0440\\u0443\\u0441\\u0441\\u043A\\u043E\\u0439 \\u043E\\u0440\\u0444\\u043E\\u0433\\u0440\\u0430\\u0444\\u0438\\u0438 \\u0438 \\u043F\\u0443\\u043D\\u043A\\u0442\\u0443\\u0430\\u0446\\u0438\\u0438. \\u041F\\u043E\\u043B\\u043D\\u044B\\u0439 \\u0430\\u043A\\u0430\\u0434\\u0435\\u043C\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438\\u0439 \\u0441\\u043F\\u0440\\u0430\\u0432\\u043E\\u0447\\u043D\\u0438\\u043A / \\u043F\\u043E\\u0434 \\u0440\\u0435\\u0434. \\u0412. \\u0412. \\u041B\\u043E\\u043F\\u0430\\u0442\\u0438\\u043D\\u0430. \\u041C., 2006, \\u0440\\u0430\\u0437\\u0434\\u0435\\u043B \\u00AB\\u0417\\u043D\\u0430\\u043A\\u0438 \\u043F\\u0440\\u0435\\u043F\\u0438\\u043D\\u0430\\u043D\\u0438\\u044F \\u043F\\u0440\\u0438 \\u043F\\u0440\\u044F\\u043C\\u043E\\u0439 \\u0440\\u0435\\u0447\\u0438 \\u0438 \\u0446\\u0438\\u0442\\u0430\\u0442\\u0430\\u0445\\u00BB: \\u0432 \\u043F\\u0435\\u0447\\u0430\\u0442\\u043D\\u043E\\u043C \\u0442\\u0435\\u043A\\u0441\\u0442\\u0435 \\u0432\\u043D\\u0435\\u0448\\u043D\\u0438\\u0435 \\u043A\\u0430\\u0432\\u044B\\u0447\\u043A\\u0438 \\u2014 \\u00AB\\u0451\\u043B\\u043E\\u0447\\u043A\\u0438\\u00BB, \\u0432\\u043D\\u0443\\u0442\\u0440\\u0435\\u043D\\u043D\\u0438\\u0435 \\u2014 \\u201E\\u043B\\u0430\\u043F\\u043A\\u0438\\u201C\", url: \"https://gramota.ru/journal/stati/pravila-i-normy/elochki-ili-lapki-kak-pravilno-ispolzovat-kavychki\", note: \"\\u0421\\u0442\\u0440\\u0430\\u043D\\u0438\\u0446\\u0430 \\u00AB\\u0413\\u0440\\u0430\\u043C\\u043E\\u0442\\u044B\\u00BB \\u043E\\u0442\\u0434\\u0430\\u0451\\u0442 403 \\u0430\\u0432\\u0442\\u043E\\u043C\\u0430\\u0442\\u0438\\u0447\\u0435\\u0441\\u043A\\u043E\\u043C\\u0443 \\u043A\\u043B\\u0438\\u0435\\u043D\\u0442\\u0443; \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u043E \\u043F\\u043E\\u0434\\u0442\\u0432\\u0435\\u0440\\u0436\\u0434\\u0435\\u043D\\u043E \\u043F\\u043E \\u0435\\u0451 \\u0438\\u043D\\u0434\\u0435\\u043A\\u0441\\u0438\\u0440\\u0443\\u0435\\u043C\\u043E\\u043C\\u0443 \\u0438\\u0437\\u043B\\u043E\\u0436\\u0435\\u043D\\u0438\\u044E \\u0438 \\u0441\\u043E\\u0432\\u043F\\u0430\\u0434\\u0430\\u0435\\u0442 \\u0441 \\u0440\\u0435\\u043A\\u043E\\u043C\\u0435\\u043D\\u0434\\u0430\\u0446\\u0438\\u0435\\u0439 \\u041C\\u0438\\u043B\\u044C\\u0447\\u0438\\u043D\\u0430 \\u0438 \\u0427\\u0435\\u043B\\u044C\\u0446\\u043E\\u0432\\u043E\\u0439 (\\u00AB\\u0421\\u043F\\u0440\\u0430\\u0432\\u043E\\u0447\\u043D\\u0438\\u043A \\u0438\\u0437\\u0434\\u0430\\u0442\\u0435\\u043B\\u044F \\u0438 \\u0430\\u0432\\u0442\\u043E\\u0440\\u0430\\u00BB). \\u041D\\u043E\\u043C\\u0435\\u0440 \\u043F\\u0430\\u0440\\u0430\\u0433\\u0440\\u0430\\u0444\\u0430 \\u043D\\u0435 \\u0443\\u043A\\u0430\\u0437\\u0430\\u043D, \\u043F\\u043E\\u0441\\u043A\\u043E\\u043B\\u044C\\u043A\\u0443 \\u0441\\u0432\\u0435\\u0440\\u0438\\u0442\\u044C \\u0435\\u0433\\u043E \\u043F\\u043E \\u0431\\u0443\\u043C\\u0430\\u0436\\u043D\\u043E\\u043C\\u0443 \\u0438\\u0437\\u0434\\u0430\\u043D\\u0438\\u044E \\u043D\\u0435 \\u0443\\u0434\\u0430\\u043B\\u043E\\u0441\\u044C \\u2014 \\u043F\\u0440\\u0438\\u0432\\u043E\\u0434\\u0438\\u0442\\u044C \\u043D\\u0435\\u043F\\u0440\\u043E\\u0432\\u0435\\u0440\\u0435\\u043D\\u043D\\u044B\\u0439 \\u043D\\u043E\\u043C\\u0435\\u0440 \\u0431\\u044B\\u043B\\u043E \\u0431\\u044B \\u0445\\u0443\\u0436\\u0435, \\u0447\\u0435\\u043C \\u0435\\u0433\\u043E \\u043E\\u0442\\u0441\\u0443\\u0442\\u0441\\u0442\\u0432\\u0438\\u0435.\" }, { rule: \"ellipsis\", cite: \"\\u041F\\u0440\\u0430\\u0432\\u0438\\u043B\\u0430 \\u0440\\u0443\\u0441\\u0441\\u043A\\u043E\\u0439 \\u043E\\u0440\\u0444\\u043E\\u0433\\u0440\\u0430\\u0444\\u0438\\u0438 \\u0438 \\u043F\\u0443\\u043D\\u043A\\u0442\\u0443\\u0430\\u0446\\u0438\\u0438 (1956), \\u0440\\u0430\\u0437\\u0434\\u0435\\u043B \\u00AB\\u041C\\u043D\\u043E\\u0433\\u043E\\u0442\\u043E\\u0447\\u0438\\u0435\\u00BB: \\u043F\\u043E\\u0441\\u043B\\u0435 \\u0432\\u043E\\u043F\\u0440\\u043E\\u0441\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0433\\u043E \\u0438\\u043B\\u0438 \\u0432\\u043E\\u0441\\u043A\\u043B\\u0438\\u0446\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E\\u0433\\u043E \\u0437\\u043D\\u0430\\u043A\\u0430 \\u0441\\u0442\\u0430\\u0432\\u044F\\u0442\\u0441\\u044F \\u043D\\u0435 \\u0442\\u0440\\u0438 \\u0442\\u043E\\u0447\\u043A\\u0438, \\u0430 \\u0434\\u0432\\u0435 (\\u0442\\u0440\\u0435\\u0442\\u044C\\u044F \\u0442\\u043E\\u0447\\u043A\\u0430 \\u0441\\u0442\\u043E\\u0438\\u0442 \\u043F\\u043E\\u0434 \\u043E\\u0434\\u043D\\u0438\\u043C \\u0438\\u0437 \\u043D\\u0430\\u0437\\u0432\\u0430\\u043D\\u043D\\u044B\\u0445 \\u0437\\u043D\\u0430\\u043A\\u043E\\u0432) \\u2014 \\u00AB\\u0421\\u043A\\u043E\\u043B\\u044C\\u043A\\u043E \\u0436\\u0438\\u0442\\u044C \\u0435\\u0449\\u0451 \\u043D\\u0430 \\u0441\\u0432\\u0435\\u0442\\u0435?..\\u00BB, \\u00AB\\u0410 \\u043A\\u0430\\u043A \\u0432\\u044B \\u0432\\u0447\\u0435\\u0440\\u0430 \\u0438\\u0433\\u0440\\u0430\\u043B\\u0438!..\\u00BB\", url: \"https://gramota.ru/biblioteka/spravochniki/pravila-russkoj-orfografii-i-punktuacii/mnogotochie\", note: \"\\u0422\\u043E \\u0436\\u0435 \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u043E \\u043F\\u0440\\u0438\\u0432\\u043E\\u0434\\u0438\\u0442 \\u0414. \\u042D. \\u0420\\u043E\\u0437\\u0435\\u043D\\u0442\\u0430\\u043B\\u044C, \\u00AB\\u0421\\u043F\\u0440\\u0430\\u0432\\u043E\\u0447\\u043D\\u0438\\u043A \\u043F\\u043E \\u0440\\u0443\\u0441\\u0441\\u043A\\u043E\\u043C\\u0443 \\u044F\\u0437\\u044B\\u043A\\u0443. \\u041F\\u0443\\u043D\\u043A\\u0442\\u0443\\u0430\\u0446\\u0438\\u044F\\u00BB, \\u0440\\u0430\\u0437\\u0434\\u0435\\u043B \\u00AB\\u0421\\u043E\\u0447\\u0435\\u0442\\u0430\\u043D\\u0438\\u0435 \\u0437\\u043D\\u0430\\u043A\\u043E\\u0432 \\u043F\\u0440\\u0435\\u043F\\u0438\\u043D\\u0430\\u043D\\u0438\\u044F\\u00BB.\" }, { rule: \"dashes\", cite: \"\\u041C\\u0438\\u043B\\u044C\\u0447\\u0438\\u043D \\u0410. \\u042D., \\u0427\\u0435\\u043B\\u044C\\u0446\\u043E\\u0432\\u0430 \\u041B. \\u041A. \\u00AB\\u0421\\u043F\\u0440\\u0430\\u0432\\u043E\\u0447\\u043D\\u0438\\u043A \\u0438\\u0437\\u0434\\u0430\\u0442\\u0435\\u043B\\u044F \\u0438 \\u0430\\u0432\\u0442\\u043E\\u0440\\u0430\\u00BB \\u0438 \\u0414. \\u042D. \\u0420\\u043E\\u0437\\u0435\\u043D\\u0442\\u0430\\u043B\\u044C, \\u00AB\\u0421\\u043F\\u0440\\u0430\\u0432\\u043E\\u0447\\u043D\\u0438\\u043A \\u043F\\u043E \\u0440\\u0443\\u0441\\u0441\\u043A\\u043E\\u043C\\u0443 \\u044F\\u0437\\u044B\\u043A\\u0443\\u00BB: \\u0435\\u0441\\u043B\\u0438 \\u0438\\u043D\\u0442\\u0435\\u0440\\u0432\\u0430\\u043B \\u043F\\u0435\\u0440\\u0435\\u0434\\u0430\\u0451\\u0442\\u0441\\u044F \\u0446\\u0438\\u0444\\u0440\\u0430\\u043C\\u0438, \\u043C\\u0435\\u0436\\u0434\\u0443 \\u0447\\u0438\\u0441\\u043B\\u0430\\u043C\\u0438 \\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u0441\\u044F \\u0442\\u0438\\u0440\\u0435 \\u0431\\u0435\\u0437 \\u043E\\u0442\\u0431\\u0438\\u0432\\u043A\\u0438 \\u2014 \\u00AB5\\u20146 \\u043B\\u0435\\u0442\\u00BB, \\u00AB\\u0432 XV\\u2014XVII \\u0432\\u0435\\u043A\\u0430\\u0445\\u00BB, \\u00AB1941\\u20141945 \\u0433\\u0433.\\u00BB; \\u0442\\u0438\\u0440\\u0435 \\u0432 \\u043F\\u0440\\u0435\\u0434\\u043B\\u043E\\u0436\\u0435\\u043D\\u0438\\u0438 \\u043E\\u0442\\u0431\\u0438\\u0432\\u0430\\u0435\\u0442\\u0441\\u044F \\u043F\\u0440\\u043E\\u0431\\u0435\\u043B\\u0430\\u043C\\u0438 \\u0441 \\u043E\\u0431\\u0435\\u0438\\u0445 \\u0441\\u0442\\u043E\\u0440\\u043E\\u043D\", url: \"https://gramota.ru/journal/stati/pravila-i-normy/defis-i-tire-kak-vybrat-i-postavit-pravilnyy-znak-v-tekste\", note: \"\\u0412 \\u0440\\u0443\\u0441\\u0441\\u043A\\u043E\\u0439 \\u0442\\u0438\\u043F\\u043E\\u0433\\u0440\\u0430\\u0444\\u0438\\u043A\\u0435 \\u0438\\u043D\\u0442\\u0435\\u0440\\u0432\\u0430\\u043B \\u043D\\u0430\\u0431\\u0438\\u0440\\u0430\\u0435\\u0442\\u0441\\u044F \\u0434\\u043B\\u0438\\u043D\\u043D\\u044B\\u043C \\u0442\\u0438\\u0440\\u0435 (U+2014) \\u0431\\u0435\\u0437 \\u043E\\u0442\\u0431\\u0438\\u0432\\u043A\\u0438; \\u043A\\u043E\\u0440\\u043E\\u0442\\u043A\\u043E\\u0435 \\u0442\\u0438\\u0440\\u0435 (U+2013) \\u0432 \\u044D\\u0442\\u043E\\u0439 \\u0440\\u043E\\u043B\\u0438 \\u043D\\u0435 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0435\\u0442\\u0441\\u044F. \\u041F\\u0435\\u0440\\u0435\\u0447\\u0438\\u0441\\u043B\\u0435\\u043D\\u0438\\u0435 schema.dash.range \\u0438\\u0437\\u043D\\u0430\\u0447\\u0430\\u043B\\u044C\\u043D\\u043E \\u0434\\u043E\\u043F\\u0443\\u0441\\u043A\\u0430\\u043B\\u043E \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E en-*, \\u0447\\u0442\\u043E \\u043D\\u0435 \\u043F\\u043E\\u0437\\u0432\\u043E\\u043B\\u044F\\u043B\\u043E \\u0432\\u044B\\u0440\\u0430\\u0437\\u0438\\u0442\\u044C \\u043D\\u043E\\u0440\\u043C\\u0443; \\u043F\\u0435\\u0440\\u0435\\u0447\\u0438\\u0441\\u043B\\u0435\\u043D\\u0438\\u0435 \\u0440\\u0430\\u0441\\u0448\\u0438\\u0440\\u0435\\u043D\\u043E \\u0437\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0435\\u043C em-tight, \\u0438 \\u043E\\u043D\\u043E \\u0437\\u0434\\u0435\\u0441\\u044C \\u0438 \\u0441\\u0442\\u043E\\u0438\\u0442.\" }, { rule: \"nbsp\", cite: \"\\u041C\\u0438\\u043B\\u044C\\u0447\\u0438\\u043D \\u0410. \\u042D., \\u0427\\u0435\\u043B\\u044C\\u0446\\u043E\\u0432\\u0430 \\u041B. \\u041A. \\u00AB\\u0421\\u043F\\u0440\\u0430\\u0432\\u043E\\u0447\\u043D\\u0438\\u043A \\u0438\\u0437\\u0434\\u0430\\u0442\\u0435\\u043B\\u044F \\u0438 \\u0430\\u0432\\u0442\\u043E\\u0440\\u0430\\u00BB: \\u043D\\u0435\\u0440\\u0430\\u0437\\u0440\\u044B\\u0432\\u043D\\u044B\\u0439 \\u043F\\u0440\\u043E\\u0431\\u0435\\u043B \\u0441\\u0442\\u0430\\u0432\\u0438\\u0442\\u0441\\u044F \\u043C\\u0435\\u0436\\u0434\\u0443 \\u0438\\u043D\\u0438\\u0446\\u0438\\u0430\\u043B\\u0430\\u043C\\u0438 \\u0438 \\u043C\\u0435\\u0436\\u0434\\u0443 \\u0438\\u043D\\u0438\\u0446\\u0438\\u0430\\u043B\\u0430\\u043C\\u0438 \\u0438 \\u0444\\u0430\\u043C\\u0438\\u043B\\u0438\\u0435\\u0439 (\\u00AB\\u0410. \\u0421. \\u041F\\u0443\\u0448\\u043A\\u0438\\u043D\\u00BB), \\u043F\\u043E\\u0441\\u043B\\u0435 \\u043E\\u0434\\u043D\\u043E\\u0431\\u0443\\u043A\\u0432\\u0435\\u043D\\u043D\\u044B\\u0445 \\u043F\\u0440\\u0435\\u0434\\u043B\\u043E\\u0433\\u043E\\u0432 \\u0438 \\u0441\\u043E\\u044E\\u0437\\u043E\\u0432, \\u043C\\u0435\\u0436\\u0434\\u0443 \\u0437\\u043D\\u0430\\u043A\\u0430\\u043C\\u0438 \\u2116 \\u0438 \\u00A7 \\u0438 \\u043E\\u0442\\u043D\\u043E\\u0441\\u044F\\u0449\\u0438\\u043C\\u0438\\u0441\\u044F \\u043A \\u043D\\u0438\\u043C \\u0447\\u0438\\u0441\\u043B\\u0430\\u043C\\u0438, \\u043C\\u0435\\u0436\\u0434\\u0443 \\u0447\\u0438\\u0441\\u043B\\u043E\\u043C \\u0438 \\u043E\\u0442\\u043D\\u043E\\u0441\\u044F\\u0449\\u0435\\u0439\\u0441\\u044F \\u043A \\u043D\\u0435\\u043C\\u0443 \\u0435\\u0434\\u0438\\u043D\\u0438\\u0446\\u0435\\u0439 \\u0438\\u0437\\u043C\\u0435\\u0440\\u0435\\u043D\\u0438\\u044F \\u0438\\u043B\\u0438 \\u0441\\u0447\\u0451\\u0442\\u043D\\u044B\\u043C \\u0441\\u043B\\u043E\\u0432\\u043E\\u043C (\\u00AB1981 \\u0433.\\u00BB, \\u00AB5 \\u043C\\u043B\\u043D\\u00BB), \\u0430 \\u0442\\u0430\\u043A\\u0436\\u0435 \\u0432\\u043D\\u0443\\u0442\\u0440\\u0438 \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u0439 \\u00AB\\u0438 \\u0442. \\u0434.\\u00BB, \\u00AB\\u0438 \\u0442. \\u043F.\\u00BB, \\u00AB\\u0442. \\u0435.\\u00BB\", url: \"https://orfogrammka.ru/%D1%82%D0%B8%D0%BF%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D0%BA%D0%B0/%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB_%D0%B8_%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D1%8B/\", note: \"\\u0421\\u043F\\u0438\\u0441\\u043E\\u043A afterShortWords \\u0441\\u043E\\u0437\\u043D\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E \\u043E\\u0433\\u0440\\u0430\\u043D\\u0438\\u0447\\u0435\\u043D \\u043E\\u0434\\u043D\\u043E\\u0431\\u0443\\u043A\\u0432\\u0435\\u043D\\u043D\\u044B\\u043C\\u0438 \\u043F\\u0440\\u0435\\u0434\\u043B\\u043E\\u0433\\u0430\\u043C\\u0438 \\u0438 \\u0441\\u043E\\u044E\\u0437\\u0430\\u043C\\u0438 (\\u0430, \\u0432, \\u0438, \\u043A, \\u043E, \\u0441, \\u0443) \\u0438 \\u043E\\u0434\\u043D\\u043E\\u0437\\u043D\\u0430\\u0447\\u043D\\u044B\\u043C\\u0438 \\u0434\\u0432\\u0443\\u0445\\u0431\\u0443\\u043A\\u0432\\u0435\\u043D\\u043D\\u044B\\u043C\\u0438 \\u043F\\u0440\\u0435\\u0434\\u043B\\u043E\\u0433\\u0430\\u043C\\u0438 (\\u0432\\u043E, \\u0434\\u043E, \\u0437\\u0430, \\u0438\\u0437, \\u043A\\u043E, \\u043D\\u0430, \\u043E\\u0431, \\u043E\\u0442, \\u043F\\u043E, \\u0441\\u043E). \\u0427\\u0430\\u0441\\u0442\\u0438\\u0446\\u044B \\u0438 \\u0441\\u043E\\u044E\\u0437\\u044B \\u00AB\\u043D\\u0435\\u00BB, \\u00AB\\u043D\\u0438\\u00BB, \\u00AB\\u043D\\u043E\\u00BB, \\u00AB\\u0436\\u0435\\u00BB, \\u00AB\\u043B\\u0438\\u00BB, \\u00AB\\u0431\\u044B\\u00BB \\u043D\\u0435 \\u0432\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u044B: \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u043E \\u0434\\u043B\\u044F \\u043D\\u0438\\u0445 \\u2014 \\u0440\\u0435\\u043A\\u043E\\u043C\\u0435\\u043D\\u0434\\u0430\\u0446\\u0438\\u044F \\u0432\\u0451\\u0440\\u0441\\u0442\\u043A\\u0438, \\u0430 \\u043D\\u0435 \\u043D\\u043E\\u0440\\u043C\\u0430, \\u0438 \\u0441\\u0432\\u044F\\u0437\\u044B\\u0432\\u0430\\u043D\\u0438\\u0435 \\u0438\\u0445 \\u0434\\u0430\\u0451\\u0442 \\u0437\\u0430\\u043C\\u0435\\u0442\\u043D\\u044B\\u0439 \\u0440\\u0438\\u0441\\u043A \\u043B\\u043E\\u0436\\u043D\\u044B\\u0445 \\u0441\\u0440\\u0430\\u0431\\u0430\\u0442\\u044B\\u0432\\u0430\\u043D\\u0438\\u0439. \\u041F\\u0440\\u0435\\u0444\\u0438\\u043A\\u0441\\u043D\\u044B\\u0435 \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u044F \\u0438\\u0437 \\u0441\\u0442\\u0440\\u043E\\u043A\\u0438 \\u00ABru\\u00BB \\u0432 docs/PLAN.md \\u00A77 (\\u00AB\\u0433.\\u00BB, \\u00AB\\u0443\\u043B.\\u00BB) \\u0441 \\u043F\\u043E\\u044F\\u0432\\u043B\\u0435\\u043D\\u0438\\u0435\\u043C beforeWord \\u0438 N10 \\u0441\\u0442\\u0430\\u043B\\u0438 \\u0432\\u044B\\u0440\\u0430\\u0437\\u0438\\u043C\\u044B: \\u00AB\\u0443\\u043B.\\u00BB \\u0438 \\u00AB\\u043F\\u043B.\\u00BB \\u043F\\u0435\\u0440\\u0435\\u0447\\u0438\\u0441\\u043B\\u0435\\u043D\\u044B \\u0442\\u0430\\u043C, \\u043E\\u0431\\u043E\\u0441\\u043D\\u043E\\u0432\\u0430\\u043D\\u0438\\u0435 \\u2014 \\u0432 \\u0441\\u043B\\u0435\\u0434\\u0443\\u044E\\u0449\\u0435\\u0439 \\u0437\\u0430\\u043F\\u0438\\u0441\\u0438. \\u00AB\\u0433.\\u00BB \\u043E\\u0441\\u0442\\u0430\\u0451\\u0442\\u0441\\u044F \\u043D\\u0435\\u0432\\u044B\\u0440\\u0430\\u0437\\u0438\\u043C\\u044B\\u043C, \\u043D\\u043E \\u043D\\u0435 \\u0438\\u0437-\\u0437\\u0430 \\u0444\\u043E\\u0440\\u043C\\u044B \\u043F\\u043E\\u043B\\u044F: \\u0437\\u0434\\u0435\\u0441\\u044C \\u043E\\u043D\\u043E \\u043F\\u043E\\u043C\\u0435\\u0449\\u0435\\u043D\\u043E \\u0432 beforeUnits \\u0432 \\u0437\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0438 \\u00AB\\u0433\\u043E\\u0434\\u00BB \\u043F\\u043E\\u0441\\u043B\\u0435 \\u0447\\u0438\\u0441\\u043B\\u0430 (\\u00AB2020 \\u0433.\\u00BB), \\u0430 \\u0432 \\u0437\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0438 \\u00AB\\u0433\\u043E\\u0440\\u043E\\u0434\\u00BB \\u0441\\u0432\\u044F\\u0437\\u044B\\u0432\\u0430\\u0435\\u0442\\u0441\\u044F \\u0432\\u043F\\u0440\\u0430\\u0432\\u043E, \\u0438 \\u043B\\u0438\\u0442\\u0435\\u0440\\u0430\\u043B\\u044C\\u043D\\u044B\\u0439 \\u0441\\u043F\\u0438\\u0441\\u043E\\u043A \\u044D\\u0442\\u0438 \\u0434\\u0432\\u0430 \\u0441\\u043C\\u044B\\u0441\\u043B\\u0430 \\u043D\\u0435 \\u0440\\u0430\\u0437\\u043B\\u0438\\u0447\\u0430\\u0435\\u0442.\" }, { rule: \"nbsp\", cite: \"\\u00AB\\u0422\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438\\u0435 \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u0430 \\u043D\\u0430\\u0431\\u043E\\u0440\\u0430\\u00BB, \\u0440\\u0430\\u0437\\u0434\\u0435\\u043B \\u00AB\\u041E\\u0431\\u0449\\u0438\\u0435 \\u0442\\u0440\\u0435\\u0431\\u043E\\u0432\\u0430\\u043D\\u0438\\u044F \\u043A \\u043D\\u0430\\u0431\\u043E\\u0440\\u0443\\u00BB, \\u043F. 5: \\u00AB\\u041E\\u0442\\u0431\\u0438\\u0432\\u0430\\u044E\\u0442\\u0441\\u044F \\u0441\\u043B\\u043E\\u0432\\u0430 \\u043E\\u0442 \\u0438\\u043C\\u0435\\u043D \\u0441\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0445, \\u043A \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u043C \\u043E\\u043D\\u0438 \\u043E\\u0442\\u043D\\u043E\\u0441\\u044F\\u0442\\u0441\\u044F (\\u0443\\u043B. \\u0421\\u043E\\u0432\\u0435\\u0442\\u0441\\u043A\\u0430\\u044F)\\u00BB; \\u0440\\u0430\\u0437\\u0434\\u0435\\u043B \\u00AB\\u041F\\u0435\\u0440\\u0435\\u043D\\u043E\\u0441\\u044B\\u00BB, \\u043F. 4: \\u00AB\\u041D\\u0435 \\u0434\\u043E\\u043B\\u0436\\u043D\\u044B \\u0431\\u044B\\u0442\\u044C \\u043E\\u0442\\u0434\\u0435\\u043B\\u0435\\u043D\\u044B \\u043F\\u0440\\u0438 \\u043F\\u0435\\u0440\\u0435\\u043D\\u043E\\u0441\\u0435 \\u0438\\u0437 \\u043E\\u0434\\u043D\\u043E\\u0439 \\u0441\\u0442\\u0440\\u043E\\u043A\\u0438 \\u0432 \\u0434\\u0440\\u0443\\u0433\\u0443\\u044E: \\u0430) \\u0444\\u0430\\u043C\\u0438\\u043B\\u0438\\u0438 \\u043E\\u0442 \\u0438\\u043D\\u0438\\u0446\\u0438\\u0430\\u043B\\u043E\\u0432 \\u0438\\u043B\\u0438 \\u043E\\u0434\\u0438\\u043D \\u0438\\u043D\\u0438\\u0446\\u0438\\u0430\\u043B \\u043E\\u0442 \\u0434\\u0440\\u0443\\u0433\\u043E\\u0433\\u043E; \\u0431) \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u043D\\u044B\\u0435 \\u0441\\u043B\\u043E\\u0432\\u0430 \\u0438\\u043C\\u0435\\u043D \\u0441\\u043E\\u0431\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u044B\\u0445, \\u043A \\u043A\\u043E\\u0442\\u043E\\u0440\\u044B\\u043C \\u043E\\u043D\\u0438 \\u043E\\u0442\\u043D\\u043E\\u0441\\u044F\\u0442\\u0441\\u044F, \\u043D\\u0430\\u043F\\u0440\\u0438\\u043C\\u0435\\u0440: \\u0442\\u043E\\u0432. \\u0421\\u0435\\u0440\\u0433\\u0435\\u0435\\u0432\\u0430, \\u0433. \\u0413\\u043E\\u043C\\u0435\\u043B\\u044C, \\u043F\\u043B. \\u041B\\u0435\\u043D\\u0438\\u043D\\u0430; \\u2026 \\u0433) \\u0430\\u0440\\u0430\\u0431\\u0441\\u043A\\u0438\\u0435 \\u0438\\u043B\\u0438 \\u0440\\u0438\\u043C\\u0441\\u043A\\u0438\\u0435 \\u0446\\u0438\\u0444\\u0440\\u044B \\u043E\\u0442 \\u0438\\u0445 \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u043D\\u044B\\u0445 \\u0438\\u043B\\u0438 \\u043F\\u043E\\u043B\\u043D\\u044B\\u0445 \\u043D\\u0430\\u0438\\u043C\\u0435\\u043D\\u043E\\u0432\\u0430\\u043D\\u0438\\u0439, \\u043D\\u0430\\u043F\\u0440\\u0438\\u043C\\u0435\\u0440: 2010 \\u0433., 800 \\u0440\\u0443\\u0431., 50 \\u043A\\u0443\\u0431. \\u0441\\u043C, XX \\u0432\\u0435\\u043A; \\u0434) \\u0437\\u043D\\u0430\\u043A\\u0438 \\u0438 \\u043E\\u0431\\u043E\\u0437\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u044F (\\u2116, \\u00A7, % \\u0438 \\u0442. \\u043F.) \\u043E\\u0442 \\u0441\\u043B\\u0435\\u0434\\u0443\\u044E\\u0449\\u0438\\u0445 \\u0437\\u0430 \\u043D\\u0438\\u043C\\u0438 \\u0446\\u0438\\u0444\\u0440\\u00BB\", url: \"https://old.gsu.by/pages/izdat/2023/tehnicheskie_pravila_nabora.pdf\", note: \"\\u0422\\u0435\\u043A\\u0441\\u0442 \\u0441\\u0432\\u0435\\u0440\\u0435\\u043D \\u043F\\u043E \\u0441\\u0430\\u043C\\u043E\\u043C\\u0443 PDF; \\u044D\\u0442\\u043E \\u0438\\u0437\\u0434\\u0430\\u0442\\u0435\\u043B\\u044C\\u0441\\u043A\\u0438\\u0439 \\u0441\\u0432\\u043E\\u0434 \\u0442\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438\\u0445 \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B \\u043D\\u0430\\u0431\\u043E\\u0440\\u0430 (\\u0413\\u043E\\u043C\\u0435\\u043B\\u044C\\u0441\\u043A\\u0438\\u0439 \\u0433\\u043E\\u0441\\u0443\\u043D\\u0438\\u0432\\u0435\\u0440\\u0441\\u0438\\u0442\\u0435\\u0442), \\u0442\\u043E \\u0435\\u0441\\u0442\\u044C \\u043E\\u043F\\u0443\\u0431\\u043B\\u0438\\u043A\\u043E\\u0432\\u0430\\u043D\\u043D\\u043E\\u0435 \\u0438\\u0437\\u043B\\u043E\\u0436\\u0435\\u043D\\u0438\\u0435 \\u043E\\u0442\\u0440\\u0430\\u0441\\u043B\\u0435\\u0432\\u044B\\u0445 \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B (\\u041C\\u0438\\u043B\\u044C\\u0447\\u0438\\u043D, \\u041E\\u0421\\u0422 29.115-88), \\u0430 \\u043D\\u0435 \\u043F\\u0435\\u0440\\u0432\\u043E\\u0438\\u0441\\u0442\\u043E\\u0447\\u043D\\u0438\\u043A: \\u0433\\u043B\\u0430\\u0432\\u0443 \\u00AB\\u0422\\u0435\\u0445\\u043D\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438\\u0435 \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u0430 \\u043D\\u0430\\u0431\\u043E\\u0440\\u0430 \\u0438 \\u0432\\u0451\\u0440\\u0441\\u0442\\u043A\\u0438\\u00BB \\u0443 \\u041C\\u0438\\u043B\\u044C\\u0447\\u0438\\u043D\\u0430 \\u043F\\u0440\\u043E\\u0432\\u0435\\u0440\\u0438\\u0442\\u044C \\u043E\\u043D\\u043B\\u0430\\u0439\\u043D \\u043D\\u0435 \\u0443\\u0434\\u0430\\u043B\\u043E\\u0441\\u044C (\\u0434\\u043E\\u0441\\u0442\\u0443\\u043F\\u043D\\u043E\\u0435 \\u0438\\u0437\\u0434\\u0430\\u043D\\u0438\\u0435 1998 \\u0433. \\u0441\\u043E\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E \\u0447\\u0430\\u0441\\u0442\\u0438 1\\u20143 \\u0431\\u0435\\u0437 \\u044D\\u0442\\u043E\\u0439 \\u0433\\u043B\\u0430\\u0432\\u044B). \\u041F\\u0443\\u043D\\u043A\\u0442 4\\u0431 \\u2014 \\u0435\\u0434\\u0438\\u043D\\u0441\\u0442\\u0432\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043D\\u0430\\u0439\\u0434\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043D\\u043E\\u0440\\u043C\\u0430\\u0442\\u0438\\u0432\\u043D\\u043E\\u0435 \\u043E\\u0441\\u043D\\u043E\\u0432\\u0430\\u043D\\u0438\\u0435 \\u0434\\u043B\\u044F beforeWord. \\u00AB\\u0433.\\u00BB \\u0432 \\u044D\\u0442\\u043E\\u0442 \\u0441\\u043F\\u0438\\u0441\\u043E\\u043A \\u0441\\u043E\\u0437\\u043D\\u0430\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E \\u041D\\u0415 \\u0432\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u043E: \\u00AB\\u0433.\\u00BB \\u043D\\u043E\\u0440\\u043C\\u0430\\u0442\\u0438\\u0432\\u043D\\u043E \\u0441\\u0432\\u044F\\u0437\\u044B\\u0432\\u0430\\u0435\\u0442\\u0441\\u044F \\u0438 \\u0432\\u043B\\u0435\\u0432\\u043E \\u043A\\u0430\\u043A \\u00AB\\u0433\\u043E\\u0434\\u00BB (\\u043F. 4\\u0433, \\u00AB2010 \\u0433.\\u00BB, \\u0443\\u0436\\u0435 \\u043E\\u0442\\u0440\\u0430\\u0436\\u0435\\u043D\\u043E \\u0432 beforeUnits), \\u0438 \\u0432\\u043F\\u0440\\u0430\\u0432\\u043E \\u043A\\u0430\\u043A \\u00AB\\u0433\\u043E\\u0440\\u043E\\u0434\\u00BB (\\u043F. 4\\u0431, \\u00AB\\u0433. \\u0413\\u043E\\u043C\\u0435\\u043B\\u044C\\u00BB), \\u0430 \\u043B\\u0438\\u0442\\u0435\\u0440\\u0430\\u043B\\u044C\\u043D\\u044B\\u0439 \\u0441\\u043F\\u0438\\u0441\\u043E\\u043A \\u0431\\u0435\\u0437 \\u043A\\u043E\\u043D\\u0442\\u0435\\u043A\\u0441\\u0442\\u0430 \\u044D\\u0442\\u0438 \\u0434\\u0432\\u0430 \\u0441\\u043B\\u0443\\u0447\\u0430\\u044F \\u043D\\u0435 \\u0440\\u0430\\u0437\\u043B\\u0438\\u0447\\u0430\\u0435\\u0442 \\u2014 \\u0432\\u043E \\u0444\\u0440\\u0430\\u0437\\u0435 \\u00AB\\u0432 1147 \\u0433. \\u041C\\u043E\\u0441\\u043A\\u0432\\u0430 \\u0431\\u044B\\u043B\\u0430 \\u043E\\u0441\\u043D\\u043E\\u0432\\u0430\\u043D\\u0430\\u00BB \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u043E beforeWord \\u0441\\u043A\\u043B\\u0435\\u0438\\u043B\\u043E \\u0431\\u044B \\u00AB\\u0433.\\u00BB \\u0441 \\u00AB\\u041C\\u043E\\u0441\\u043A\\u0432\\u0430\\u00BB \\u0447\\u0435\\u0440\\u0435\\u0437 \\u0433\\u0440\\u0430\\u043D\\u0438\\u0446\\u0443 \\u043E\\u0431\\u043E\\u0440\\u043E\\u0442\\u0430. \\u0420\\u0430\\u0437\\u043B\\u0438\\u0447\\u0438\\u0442\\u044C \\u0438\\u0445 \\u043C\\u043E\\u0436\\u043D\\u043E, \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E \\u043F\\u043E\\u0441\\u043C\\u043E\\u0442\\u0440\\u0435\\u0432 \\u0432\\u043B\\u0435\\u0432\\u043E \\u043D\\u0430 \\u0446\\u0438\\u0444\\u0440\\u0443 \\u0438 \\u0432\\u043F\\u0440\\u0430\\u0432\\u043E \\u043D\\u0430 \\u0442\\u043E\\u043F\\u043E\\u043D\\u0438\\u043C, \\u0442\\u043E \\u0435\\u0441\\u0442\\u044C \\u043F\\u043E \\u043A\\u043E\\u043D\\u0442\\u0435\\u043A\\u0441\\u0442\\u0443, \\u0447\\u0435\\u0433\\u043E \\u0434\\u0435\\u043A\\u043B\\u0430\\u0440\\u0430\\u0442\\u0438\\u0432\\u043D\\u044B\\u0439 \\u0441\\u043F\\u0438\\u0441\\u043E\\u043A \\u043D\\u0435 \\u0432\\u044B\\u0440\\u0430\\u0436\\u0430\\u0435\\u0442. \\u041F\\u043E \\u0442\\u043E\\u0439 \\u0436\\u0435 \\u043F\\u0440\\u0438\\u0447\\u0438\\u043D\\u0435 \\u043D\\u0435 \\u0432\\u043A\\u043B\\u044E\\u0447\\u0435\\u043D\\u044B \\u00AB\\u0433\\u0433.\\u00BB, \\u00AB\\u0432.\\u00BB, \\u00AB\\u0432\\u0432.\\u00BB. \\u041E\\u0441\\u0442\\u0430\\u0432\\u043B\\u0435\\u043D\\u044B \\u00AB\\u0443\\u043B.\\u00BB \\u0438 \\u00AB\\u043F\\u043B.\\u00BB \\u2014 \\u043E\\u0434\\u043D\\u043E\\u0437\\u043D\\u0430\\u0447\\u043D\\u044B\\u0435 \\u0442\\u043E\\u043F\\u043E\\u043D\\u0438\\u043C\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438\\u0435 \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u044F, \\u0438 \\u043E\\u0431\\u0435 \\u0444\\u043E\\u0440\\u043C\\u044B \\u043F\\u0440\\u043E\\u0446\\u0438\\u0442\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D\\u044B \\u0434\\u043E\\u0441\\u043B\\u043E\\u0432\\u043D\\u043E: \\u00AB\\u043F\\u043B. \\u041B\\u0435\\u043D\\u0438\\u043D\\u0430\\u00BB \\u0432 \\u00AB\\u041F\\u0435\\u0440\\u0435\\u043D\\u043E\\u0441\\u0430\\u0445\\u00BB \\u043F. 4\\u0431, \\u00AB\\u0443\\u043B. \\u0421\\u043E\\u0432\\u0435\\u0442\\u0441\\u043A\\u0430\\u044F\\u00BB \\u0432 \\u00AB\\u041E\\u0431\\u0449\\u0438\\u0445 \\u0442\\u0440\\u0435\\u0431\\u043E\\u0432\\u0430\\u043D\\u0438\\u044F\\u0445 \\u043A \\u043D\\u0430\\u0431\\u043E\\u0440\\u0443\\u00BB \\u043F. 5. \\u00AB\\u0434.\\u00BB, \\u00AB\\u0441\\u0442\\u0440.\\u00BB, \\u00AB\\u043A\\u043E\\u0440\\u043F.\\u00BB, \\u00AB\\u043A\\u0432.\\u00BB \\u043E\\u0442\\u043D\\u043E\\u0441\\u044F\\u0442\\u0441\\u044F \\u043A \\u0441\\u043B\\u0435\\u0434\\u0443\\u044E\\u0449\\u0435\\u043C\\u0443 \\u0427\\u0418\\u0421\\u041B\\u0423, \\u0430 \\u043D\\u0435 \\u043A \\u0441\\u043B\\u043E\\u0432\\u0443, \\u043F\\u043E\\u044D\\u0442\\u043E\\u043C\\u0443 \\u0432 beforeWord \\u0438\\u043C \\u043D\\u0435 \\u043C\\u0435\\u0441\\u0442\\u043E. \\u0414\\u043B\\u044F \\u00AB\\u0441\\u0442\\u0440.\\u00BB \\u0435\\u0441\\u0442\\u044C \\u0438 \\u0431\\u043E\\u043B\\u0435\\u0435 \\u0441\\u0438\\u043B\\u044C\\u043D\\u043E\\u0435 \\u043E\\u0441\\u043D\\u043E\\u0432\\u0430\\u043D\\u0438\\u0435, \\u043F\\u0440\\u043E\\u0432\\u0435\\u0440\\u0435\\u043D\\u043D\\u043E\\u0435 \\u043F\\u043E \\u0438\\u0437\\u0434\\u0430\\u043D\\u0438\\u044E 1998 \\u0433. \\u043F\\u0440\\u0438 \\u0440\\u0430\\u0437\\u0431\\u043E\\u0440\\u0435 issue #30: \\u00A7 4.4.4 (\\u00AB\\u0421\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u044F \\u043F\\u0440\\u0438 \\u0432\\u043D\\u0443\\u0442\\u0440\\u0438\\u0442\\u0435\\u043A\\u0441\\u0442\\u043E\\u0432\\u044B\\u0445 \\u0441\\u0441\\u044B\\u043B\\u043A\\u0430\\u0445 \\u0438 \\u0441\\u043E\\u043F\\u043E\\u0441\\u0442\\u0430\\u0432\\u043B\\u0435\\u043D\\u0438\\u044F\\u0445\\u00BB) \\u043F\\u0438\\u0448\\u0435\\u0442 \\u0434\\u043E\\u0441\\u043B\\u043E\\u0432\\u043D\\u043E: \\u00AB\\u0420\\u0430\\u043D\\u0435\\u0435 \\u0448\\u0438\\u0440\\u043E\\u043A\\u043E \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u044F\\u0432\\u0448\\u0435\\u0435\\u0441\\u044F \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u0435 \\u0441\\u0442\\u0440. (\\u0441\\u0442\\u0440\\u0430\\u043D\\u0438\\u0446\\u0430) \\u0440\\u0435\\u043A\\u043E\\u043C\\u0435\\u043D\\u0434\\u0443\\u0435\\u0442\\u0441\\u044F \\u0437\\u0430\\u043C\\u0435\\u043D\\u044F\\u0442\\u044C \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u0435\\u043C \\u0441., \\u043F\\u043E\\u0441\\u043A\\u043E\\u043B\\u044C\\u043A\\u0443 \\u043E\\u043D\\u043E \\u0437\\u0430\\u043A\\u0440\\u0435\\u043F\\u043B\\u0435\\u043D\\u043E \\u0413\\u041E\\u0421\\u0422 7.12\\u201493, \\u0430 \\u0434\\u0432\\u0435 \\u0444\\u043E\\u0440\\u043C\\u044B \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u044F \\u043E\\u0434\\u043D\\u043E\\u0433\\u043E \\u0441\\u043B\\u043E\\u0432\\u0430 \\u043D\\u0430\\u0440\\u0443\\u0448\\u0430\\u044E\\u0442 \\u043F\\u0440\\u0438\\u043D\\u0446\\u0438\\u043F \\u0435\\u0434\\u0438\\u043D\\u043E\\u043E\\u0431\\u0440\\u0430\\u0437\\u0438\\u044F\\u00BB. \\u0422\\u043E \\u0435\\u0441\\u0442\\u044C \\u0438\\u0441\\u0442\\u043E\\u0447\\u043D\\u0438\\u043A \\u043D\\u0435 \\u043F\\u0440\\u043E\\u0441\\u0442\\u043E \\u043C\\u043E\\u043B\\u0447\\u0438\\u0442 \\u043E \\u043F\\u0440\\u043E\\u0431\\u0435\\u043B\\u0435 \\u2014 \\u043E\\u043D \\u043D\\u0435 \\u0440\\u0435\\u043A\\u043E\\u043C\\u0435\\u043D\\u0434\\u0443\\u0435\\u0442 \\u0441\\u0430\\u043C\\u0443 \\u0444\\u043E\\u0440\\u043C\\u0443. \\u0422\\u0430\\u043C \\u0436\\u0435: \\u00AB\\u0412\\u0441\\u0435 \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u044F, \\u043A\\u0440\\u043E\\u043C\\u0435 \\u0441\\u043C. \\u0438 \\u0441\\u0440., \\u0443\\u043F\\u043E\\u0442\\u0440\\u0435\\u0431\\u043B\\u044F\\u044E\\u0442\\u0441\\u044F \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E \\u0432 \\u0441\\u043E\\u0447\\u0435\\u0442\\u0430\\u043D\\u0438\\u0438 \\u0441 \\u0446\\u0438\\u0444\\u0440\\u0430\\u043C\\u0438 \\u0438\\u043B\\u0438 \\u0431\\u0443\\u043A\\u0432\\u0430\\u043C\\u0438\\u00BB, \\u0447\\u0442\\u043E \\u043F\\u043E\\u0434\\u0442\\u0432\\u0435\\u0440\\u0436\\u0434\\u0430\\u0435\\u0442 \\u0441\\u043E\\u0441\\u0442\\u0430\\u0432 \\u0441\\u043F\\u0438\\u0441\\u043A\\u0430, \\u043D\\u043E \\u043E \\u0441\\u0430\\u043C\\u043E\\u0439 \\u043E\\u0442\\u0431\\u0438\\u0432\\u043A\\u0435 \\u043F\\u043E-\\u043F\\u0440\\u0435\\u0436\\u043D\\u0435\\u043C\\u0443 \\u043D\\u0435 \\u0433\\u043E\\u0432\\u043E\\u0440\\u0438\\u0442. beforeNumber \\u043F\\u0443\\u0441\\u0442, \\u0438 \\u044D\\u0442\\u043E \\u043F\\u043E\\u0434\\u0442\\u0432\\u0435\\u0440\\u0436\\u0434\\u0451\\u043D\\u043D\\u043E\\u0435 \\u043E\\u0442\\u0441\\u0443\\u0442\\u0441\\u0442\\u0432\\u0438\\u0435 \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u0430, \\u0430 \\u043D\\u0435 \\u043D\\u0435\\u043D\\u0430\\u0439\\u0434\\u0435\\u043D\\u043D\\u0430\\u044F \\u0446\\u0438\\u0442\\u0430\\u0442\\u0430: \\u043F\\u0435\\u0440\\u0435\\u0447\\u0435\\u043D\\u044C \\u00AB\\u041F\\u0435\\u0440\\u0435\\u043D\\u043E\\u0441\\u043E\\u0432\\u00BB \\u043F. 4 \\u0437\\u0430\\u043A\\u0440\\u044B\\u0442\\u044B\\u0439 \\u0438 \\u0438\\u0441\\u0447\\u0435\\u0440\\u043F\\u044B\\u0432\\u0430\\u044E\\u0449\\u0438\\u0439, \\u043E\\u043D \\u0441\\u043E\\u0434\\u0435\\u0440\\u0436\\u0438\\u0442 \\u043E\\u0431\\u0440\\u0430\\u0442\\u043D\\u043E\\u0435 \\u043D\\u0430\\u043F\\u0440\\u0430\\u0432\\u043B\\u0435\\u043D\\u0438\\u0435 (\\u043F. 4\\u0433, \\u00AB2010 \\u0433.\\u00BB) \\u0438 \\u0437\\u043D\\u0430\\u043A\\u0438 (\\u043F. 4\\u0434, \\u00AB\\u2116 75\\u00BB), \\u043D\\u043E \\u043A\\u043E\\u043D\\u0441\\u0442\\u0440\\u0443\\u043A\\u0446\\u0438\\u0438 \\u00AB\\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u0435 + \\u0441\\u043B\\u0435\\u0434\\u0443\\u044E\\u0449\\u0435\\u0435 \\u0447\\u0438\\u0441\\u043B\\u043E\\u00BB \\u0432 \\u043D\\u0451\\u043C \\u043D\\u0435\\u0442. \\u041C\\u0438\\u043B\\u044C\\u0447\\u0438\\u043D, \\u00AB\\u0421\\u043F\\u0440\\u0430\\u0432\\u043E\\u0447\\u043D\\u0438\\u043A \\u0438\\u0437\\u0434\\u0430\\u0442\\u0435\\u043B\\u044F \\u0438 \\u0430\\u0432\\u0442\\u043E\\u0440\\u0430\\u00BB, \\u00A7 9.1.1 (\\u00AB\\u0423\\u043F\\u043E\\u0442\\u0440\\u0435\\u0431\\u043B\\u0435\\u043D\\u0438\\u0435 \\u0432 \\u0441\\u0441\\u044B\\u043B\\u043A\\u0430\\u0445 \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u0439 \\u0441\\u043B\\u043E\\u0432 \\u0438 \\u0443\\u0441\\u043B\\u043E\\u0432\\u043D\\u044B\\u0445 \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u0439\\u00BB: \\u00AB\\u041A\\u043D\\u0438\\u0433\\u043E\\u0432\\u0435\\u0434\\u0447\\u0435\\u0441\\u043A\\u0438\\u0435 \\u0442\\u0435\\u0440\\u043C\\u0438\\u043D\\u044B \\u043F\\u0440\\u0438 \\u0446\\u0438\\u0444\\u0440\\u043E\\u0432\\u044B\\u0445 \\u043D\\u043E\\u043C\\u0435\\u0440\\u0430\\u0445 \\u0438\\u043B\\u0438 \\u043B\\u0438\\u0442\\u0435\\u0440\\u0430\\u0445 \\u0440\\u0435\\u043A\\u043E\\u043C\\u0435\\u043D\\u0434\\u0443\\u0435\\u0442\\u0441\\u044F \\u0434\\u043B\\u044F \\u044D\\u043A\\u043E\\u043D\\u043E\\u043C\\u0438\\u0438 \\u043C\\u0435\\u0441\\u0442\\u0430 \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0430\\u0442\\u044C\\u00BB) \\u043D\\u043E\\u0440\\u043C\\u0438\\u0440\\u0443\\u0435\\u0442, \\u041A\\u0410\\u041A\\u041E\\u0415 \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u0435 \\u043F\\u0438\\u0441\\u0430\\u0442\\u044C \\u043F\\u0435\\u0440\\u0435\\u0434 \\u0447\\u0438\\u0441\\u043B\\u043E\\u043C, \\u043D\\u043E \\u043E \\u043F\\u0440\\u043E\\u0431\\u0435\\u043B\\u0435 \\u043D\\u0435 \\u0433\\u043E\\u0432\\u043E\\u0440\\u0438\\u0442 \\u043D\\u0438\\u0447\\u0435\\u0433\\u043E. \\u0421\\u0442\\u0440\\u0430\\u043D\\u0438\\u0446\\u0430 \\u00AB\\u041E\\u0440\\u0444\\u043E\\u0433\\u0440\\u0430\\u043C\\u043C\\u043A\\u0438\\u00BB \\u0441 \\u043F\\u0440\\u0438\\u043C\\u0435\\u0440\\u043E\\u043C \\u00AB\\u0433\\u043B. IV\\u00BB \\u043E\\u0442\\u0432\\u0435\\u0440\\u0433\\u043D\\u0443\\u0442\\u0430: \\u043E\\u043D\\u0430 \\u0441\\u0441\\u044B\\u043B\\u0430\\u0435\\u0442\\u0441\\u044F \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E \\u043D\\u0430 \\u0412\\u0438\\u043A\\u0438\\u043F\\u0435\\u0434\\u0438\\u044E \\u0438 \\u0425\\u0430\\u0431\\u0440.\" }, { rule: \"hyphen\", cite: \"\\u041F\\u0440\\u0430\\u0432\\u0438\\u043B\\u0430 \\u0440\\u0443\\u0441\\u0441\\u043A\\u043E\\u0439 \\u043E\\u0440\\u0444\\u043E\\u0433\\u0440\\u0430\\u0444\\u0438\\u0438 \\u0438 \\u043F\\u0443\\u043D\\u043A\\u0442\\u0443\\u0430\\u0446\\u0438\\u0438. \\u041F\\u043E\\u043B\\u043D\\u044B\\u0439 \\u0430\\u043A\\u0430\\u0434\\u0435\\u043C\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438\\u0439 \\u0441\\u043F\\u0440\\u0430\\u0432\\u043E\\u0447\\u043D\\u0438\\u043A / \\u043F\\u043E\\u0434 \\u0440\\u0435\\u0434. \\u0412. \\u0412. \\u041B\\u043E\\u043F\\u0430\\u0442\\u0438\\u043D\\u0430. \\u041C., 2006: \\u00A7 135 \\u2014 \\u043F\\u0438\\u0448\\u0443\\u0442\\u0441\\u044F \\u0447\\u0435\\u0440\\u0435\\u0437 \\u0434\\u0435\\u0444\\u0438\\u0441 \\u043C\\u0435\\u0441\\u0442\\u043E\\u0438\\u043C\\u0435\\u043D\\u043D\\u044B\\u0435 \\u0441\\u043B\\u043E\\u0432\\u0430 \\u0441 \\u043D\\u0430\\u0447\\u0430\\u043B\\u044C\\u043D\\u043E\\u0439 \\u0447\\u0430\\u0441\\u0442\\u044C\\u044E (\\u043F\\u0440\\u0438\\u0441\\u0442\\u0430\\u0432\\u043A\\u043E\\u0439) \\u043A\\u043E\\u0435- (\\u043A\\u043E\\u0439-) \\u0438 \\u0441 \\u043A\\u043E\\u043D\\u0435\\u0447\\u043D\\u044B\\u043C\\u0438 \\u0447\\u0430\\u0441\\u0442\\u044F\\u043C\\u0438 (\\u043F\\u043E\\u0441\\u0442\\u0444\\u0438\\u043A\\u0441\\u0430\\u043C\\u0438) -\\u043B\\u0438\\u0431\\u043E, -\\u043D\\u0438\\u0431\\u0443\\u0434\\u044C, -\\u0442\\u043E; \\u00A7 141 \\u043F. 2 \\u2014 \\u0441\\u043B\\u043E\\u0436\\u043D\\u044B\\u0435 \\u043F\\u0440\\u0435\\u0434\\u043B\\u043E\\u0433\\u0438 \\u0438\\u0437-\\u0437\\u0430, \\u0438\\u0437-\\u043F\\u043E\\u0434 (\\u0430 \\u0442\\u0430\\u043A\\u0436\\u0435 \\u0434\\u0438\\u0430\\u043B\\u0435\\u043A\\u0442\\u043D\\u044B\\u0435 \\u043F\\u043E-\\u0437\\u0430, \\u043F\\u043E-\\u043D\\u0430\\u0434); \\u00A7 141 \\u043F. 3 \\u0438 \\u00A7 143 \\u2014 \\u0447\\u0430\\u0441\\u0442\\u0438\\u0446\\u044B -\\u0434\\u0435, -\\u043A\\u0430, -\\u0442\\u0435, -\\u0442\\u043E, -\\u0441 \\u0438 -\\u0442\\u0430\\u043A\\u0438 (\\u0432\\u0441\\u0451-\\u0442\\u0430\\u043A\\u0438, \\u043E\\u043F\\u044F\\u0442\\u044C-\\u0442\\u0430\\u043A\\u0438, \\u043F\\u0440\\u044F\\u043C\\u043E-\\u0442\\u0430\\u043A\\u0438, \\u0442\\u0430\\u043A-\\u0442\\u0430\\u043A\\u0438)\", url: \"https://orthographia.ru/orf.php?paragraph=pp135.php\", note: \"\\u0422\\u0435\\u043A\\u0441\\u0442\\u044B \\u00A7\\u00A7 135, 141, 143 \\u0438 219 \\u043F\\u0440\\u043E\\u0447\\u0438\\u0442\\u0430\\u043D\\u044B \\u043F\\u043E \\u043E\\u043D\\u043B\\u0430\\u0439\\u043D-\\u0438\\u0437\\u0434\\u0430\\u043D\\u0438\\u044E \\u0441\\u043F\\u0440\\u0430\\u0432\\u043E\\u0447\\u043D\\u0438\\u043A\\u0430. \\u042D\\u0442\\u0438 \\u043F\\u0430\\u0440\\u0430\\u0433\\u0440\\u0430\\u0444\\u044B \\u043D\\u043E\\u0440\\u043C\\u0430\\u0442\\u0438\\u0432\\u043D\\u044B \\u0434\\u043B\\u044F \\u0421\\u041E\\u0421\\u0422\\u0410\\u0412\\u0410 \\u0444\\u043E\\u0440\\u043C, \\u043D\\u043E \\u043D\\u0435 \\u0434\\u043B\\u044F \\u0437\\u0430\\u043F\\u0440\\u0435\\u0442\\u0430 \\u043F\\u0435\\u0440\\u0435\\u043D\\u043E\\u0441\\u0430, \\u0438 \\u044D\\u0442\\u043E \\u0432\\u0430\\u0436\\u043D\\u043E \\u043D\\u0435 \\u0441\\u043C\\u0435\\u0448\\u0438\\u0432\\u0430\\u0442\\u044C: \\u00A7 219 (\\u00AB\\u043D\\u0435 \\u043F\\u043E\\u0434\\u043B\\u0435\\u0436\\u0430\\u0442 \\u043F\\u0435\\u0440\\u0435\\u043D\\u043E\\u0441\\u0443\\u00BB) \\u043D\\u0430\\u0437\\u044B\\u0432\\u0430\\u0435\\u0442 \\u0442\\u043E\\u043B\\u044C\\u043A\\u043E \\u0430\\u0431\\u0431\\u0440\\u0435\\u0432\\u0438\\u0430\\u0442\\u0443\\u0440\\u044B \\u0438\\u0437 \\u043F\\u0440\\u043E\\u043F\\u0438\\u0441\\u043D\\u044B\\u0445 \\u0431\\u0443\\u043A\\u0432, \\u0433\\u0440\\u0430\\u0444\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438\\u0435 \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u044F (\\u0431-\\u043A\\u0430, \\u0436.-\\u0434.) \\u0438 \\u043D\\u0430\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u044F (20-\\u0439); \\u0441\\u043B\\u043E\\u0432 \\u0441 \\u0434\\u0435\\u0444\\u0438\\u0441\\u043E\\u043C \\u0442\\u0430\\u043C \\u043D\\u0435\\u0442, \\u0430 \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u043E \\u043F\\u043E\\u0432\\u0442\\u043E\\u0440\\u044F\\u0442\\u044C \\u0434\\u0435\\u0444\\u0438\\u0441 \\u0432 \\u043D\\u0430\\u0447\\u0430\\u043B\\u0435 \\u043F\\u0435\\u0440\\u0435\\u043D\\u0435\\u0441\\u0451\\u043D\\u043D\\u043E\\u0439 \\u0447\\u0430\\u0441\\u0442\\u0438 (\\u0432\\u043E\\u0435\\u043D\\u043D\\u043E-/-\\u043C\\u043E\\u0440\\u0441\\u043A\\u043E\\u0439) \\u0441\\u043F\\u0440\\u0430\\u0432\\u043E\\u0447\\u043D\\u0438\\u043A \\u0434\\u0430\\u0451\\u0442 \\u043A\\u0430\\u043A \\u0444\\u0430\\u043A\\u0443\\u043B\\u044C\\u0442\\u0430\\u0442\\u0438\\u0432\\u043D\\u043E\\u0435. \\u0417\\u043D\\u0430\\u0447\\u0438\\u0442, \\u0441\\u0432\\u044F\\u0437\\u044B\\u0432\\u0430\\u043D\\u0438\\u0435 \\u0434\\u0435\\u0444\\u0438\\u0441\\u0430 \\u043D\\u0435\\u0440\\u0430\\u0437\\u0440\\u044B\\u0432\\u043D\\u044B\\u043C U+2011 \\u2014 \\u0440\\u0435\\u0448\\u0435\\u043D\\u0438\\u0435 \\u043F\\u0440\\u043E\\u0435\\u043A\\u0442\\u0430 (docs/PLAN.md \\u00A73.3), \\u0430 \\u043D\\u0435 \\u043E\\u0440\\u0444\\u043E\\u0433\\u0440\\u0430\\u0444\\u0438\\u0447\\u0435\\u0441\\u043A\\u0430\\u044F \\u043D\\u043E\\u0440\\u043C\\u0430; \\u0435\\u0433\\u043E \\u043F\\u0440\\u0430\\u043A\\u0442\\u0438\\u0447\\u0435\\u0441\\u043A\\u043E\\u0435 \\u043E\\u0431\\u043E\\u0441\\u043D\\u043E\\u0432\\u0430\\u043D\\u0438\\u0435 \\u0442\\u043E \\u0436\\u0435, \\u0447\\u0442\\u043E \\u0443 \\u0444\\u0430\\u043A\\u0443\\u043B\\u044C\\u0442\\u0430\\u0442\\u0438\\u0432\\u043D\\u043E\\u0433\\u043E \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u0430: \\u043F\\u0440\\u0438 \\u043F\\u0435\\u0440\\u0435\\u043D\\u043E\\u0441\\u0435 \\u043F\\u043E \\u0434\\u0435\\u0444\\u0438\\u0441\\u0443 \\u0442\\u0435\\u0440\\u044F\\u0435\\u0442\\u0441\\u044F \\u0440\\u0430\\u0437\\u043B\\u0438\\u0447\\u0438\\u0435 \\u0441\\u043B\\u0438\\u0442\\u043D\\u043E\\u0433\\u043E \\u0438 \\u0434\\u0435\\u0444\\u0438\\u0441\\u043D\\u043E\\u0433\\u043E \\u043D\\u0430\\u043F\\u0438\\u0441\\u0430\\u043D\\u0438\\u044F. \\u0414\\u0438\\u0430\\u043B\\u0435\\u043A\\u0442\\u043D\\u044B\\u0435 \\u0438 \\u043F\\u0440\\u043E\\u0441\\u0442\\u043E\\u0440\\u0435\\u0447\\u043D\\u044B\\u0435 \\u043F\\u043E-\\u0437\\u0430, \\u043F\\u043E-\\u043D\\u0430\\u0434, \\u0434\\u043B\\u044F-\\u0440\\u0430\\u0434\\u0438, \\u0437\\u0430-\\u0440\\u0430\\u0434\\u0438 \\u043D\\u0435 \\u0432\\u043D\\u0435\\u0441\\u0435\\u043D\\u044B \\u043A\\u0430\\u043A \\u043D\\u0435\\u043F\\u0440\\u043E\\u0434\\u0443\\u043A\\u0442\\u0438\\u0432\\u043D\\u044B\\u0435. \\u041A\\u043B\\u0430\\u0441\\u0441 \\u0433\\u0440\\u0430\\u0444\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438\\u0445 \\u0441\\u043E\\u043A\\u0440\\u0430\\u0449\\u0435\\u043D\\u0438\\u0439 \\u0438\\u0437 \\u00A7 219 (\\u0431-\\u043A\\u0430, \\u0436.-\\u0434., \\u0440/\\u0441\\u0447) \\u043D\\u043E\\u0440\\u043C\\u0430\\u0442\\u0438\\u0432\\u043D\\u043E \\u043D\\u0435\\u0440\\u0430\\u0437\\u0440\\u044B\\u0432\\u0435\\u043D, \\u043D\\u043E \\u043F\\u0435\\u0440\\u0435\\u0447\\u0438\\u0441\\u043B\\u0438\\u0442\\u044C \\u0435\\u0433\\u043E \\u043B\\u0438\\u0442\\u0435\\u0440\\u0430\\u043B\\u044C\\u043D\\u044B\\u043C \\u0441\\u043F\\u0438\\u0441\\u043A\\u043E\\u043C \\u043D\\u0435\\u043B\\u044C\\u0437\\u044F, \\u043F\\u043E\\u044D\\u0442\\u043E\\u043C\\u0443 \\u043E\\u043D \\u0437\\u0434\\u0435\\u0441\\u044C \\u043D\\u0435 \\u043E\\u0442\\u0440\\u0430\\u0436\\u0451\\u043D. \\u0418\\u0437 \\u00A7 143 \\u0432\\u0437\\u044F\\u0442\\u0430 \\u0442\\u0430\\u043A\\u0436\\u0435 \\u0447\\u0430\\u0441\\u0442\\u0438\\u0446\\u0430 -\\u043A\\u0430; -\\u0434\\u0435, -\\u0441, -\\u0442\\u0435 \\u043E\\u043F\\u0443\\u0449\\u0435\\u043D\\u044B \\u043A\\u0430\\u043A \\u0430\\u0440\\u0445\\u0430\\u0438\\u0447\\u043D\\u044B\\u0435 \\u0438 \\u0440\\u0435\\u0434\\u043A\\u0438\\u0435.\" }] },\n sv: { locale: \"sv\", name: \"Swedish\", quotes: { primary: { open: \"\\u201D\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2019\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [\"%\", \"\\u2030\", \"kr\", \"\\u20AC\", \"kg\", \"g\", \"mg\", \"km\", \"m\", \"cm\", \"mm\", \"l\", \"dl\", \"cl\", \"ml\", \"kW\", \"kWh\", \"min\", \"sek\", \"tim\", \"h\", \"\\u00B0C\"], beforeNumber: [], beforeWord: [], afterSymbols: [\"\\u00A7\"], initialBinding: \"none\" }, sources: [{ rule: \"quotes\", cite: \"Spr\\u00E5kr\\u00E5det (Institutet f\\u00F6r spr\\u00E5k och folkminnen), Snabba skrivregler \\u2013 i skolan och p\\u00E5 jobbet, red. Ola Karlsson, \\u00A71.13 \\u201CCitattecken (\\u201D)\\u201D\", url: \"https://www.diva-portal.org/smash/get/diva2:1829117/FULLTEXT04.pdf\", note: \"Verbatim: \\u201CNormala svenska citattecken ser ut som tv\\u00E5 sm\\u00E5 upph\\u00F6jda nior och har samma form i b\\u00F6rjan och slutet, allts\\u00E5 \\u201Dord\\u201D. Men citattecken kan ha olika utseende i olika typsnitt och i olika spr\\u00E5k, som i \\u201Cengelska\\u201D, \\u201Etyska\\u201C och \\u00ABnorska\\u00BB. Anv\\u00E4nd svenska citattecken i svensk text, \\u00E4ven om det du citerar \\u00E4r p\\u00E5 ett annat spr\\u00E5k.\\u201D This settles the \\u2753 in PLAN.md \\u00A77: \\u00BB\\u2026\\u00BB is attested in Swedish book typography and older practice, but Spr\\u00E5kr\\u00E5det\\u2019s current recommendation is \\u201D\\u2026\\u201D (U+201D on both sides), so that is what this file encodes.\" }, { rule: \"quotes\", cite: \"Spr\\u00E5kr\\u00E5det, Snabba skrivregler, \\u00A71.14 \\u201CApostrof (\\u2019)\\u201D\", url: \"https://www.diva-portal.org/smash/get/diva2:1829117/FULLTEXT04.pdf\", note: \"Verbatim: \\u201CEn apostrof ser ut som en liten upph\\u00F6jd nia (\\u2019). \\u2026 Apostrof anv\\u00E4nds \\u00E4ven vid citat inuti ett citat, se \\u25B6 6.1.1.\\u201D Hence the secondary pair is U+2019 on both sides. Isof\\u2019s Fr\\u00E5gel\\u00E5dan phrases the same rule as \\u201Cenkla citattecken \\u2026 n\\u00E4r du har ett citat i ett citat\\u201D.\" }, { rule: \"dashes\", cite: \"Spr\\u00E5kr\\u00E5det, Snabba skrivregler, \\u00A71.10 \\u201CTankstreck (\\u2013)\\u201D\", url: \"https://www.diva-portal.org/smash/get/diva2:1829117/FULLTEXT04.pdf\", note: \"Range, verbatim: \\u201CDet anv\\u00E4nds framf\\u00F6r allt mellan siffror och mellan ortnamn f\\u00F6r att visa till exempel tidsperioder, avst\\u00E5nd och intervall. Du har d\\u00E5 inget mellanslag f\\u00F6re eller efter tankstrecket.\\u201D (\\u00F6ppet 9\\u201318, \\u00E5ren 2026\\u20132028, s. 3\\u20135). Parenthetical, verbatim: \\u201CTankstreck kan ibland anv\\u00E4ndas f\\u00F6re paus eller till\\u00E4gg. P\\u00E5 samma s\\u00E4tt anv\\u00E4nds det vid mer sj\\u00E4lvst\\u00E4ndiga inskott \\u2026 D\\u00E5 har du mellanslag f\\u00F6re och efter tankstrecket.\\u201D Swedish uses the en dash (tankstreck) in both roles; there is no em dash in the recommendation.\" }, { rule: \"ellipsis\", cite: \"Spr\\u00E5kr\\u00E5det, Snabba skrivregler, kap. 1 \\u201CSkiljetecken och skrivtecken\\u201D (tre punkter)\", url: \"https://www.diva-portal.org/smash/get/diva2:1829117/FULLTEXT04.pdf\", note: \"`abbreviatedAfterTerminal` is false. The guide treats \\u201Ctre punkter\\u201D as an ordinary mark alongside utropstecken and fr\\u00E5getecken; no two-dot form after `!`/`?` exists in Swedish. That form is Russian-only.\" }, { rule: \"nbsp\", cite: \"Spr\\u00E5kr\\u00E5det, Snabba skrivregler, \\u00A71.16 \\u201CTecken och mellanslag\\u201D\", url: \"https://www.diva-portal.org/smash/get/diva2:1829117/FULLTEXT04.pdf\", note: \"Verbatim: \\u201CTecken som ers\\u00E4tter ord, som & f\\u00F6r och, + f\\u00F6r plus och % f\\u00F6r procent, skrivs helst med mellanslag f\\u00F6re och efter, precis som n\\u00E4r du skriver ut orden: 5 % eftersom du skriver fem procent.\\u201D Examples given: \\u201CEk & Lund (Ek och Lund), 3 \\u20AC (tre euro), \\u00A7 7 (paragraf sju), 2 + 3 (tv\\u00E5 plus tre)\\u201D. And: \\u201CF\\u00F6r att de tecken och siffror som h\\u00F6r ihop ska hamna p\\u00E5 samma rad och inte p\\u00E5 olika rader, kan du anv\\u00E4nda s\\u00E5 kallat fast mellanslag.\\u201D This is the authority for `%`, `\\u20AC` and `\\u00A7`. Note the direction: Spr\\u00E5kr\\u00E5det\\u2019s own example is \\u201C\\u00A7 7\\u201D, the sign before the number, so `\\u00A7` is in `afterSymbols`, the opposite of Finnish. Swedish legal citation also writes \\u201C5 \\u00A7\\u201D; that order is not covered by the cited example and is deliberately not encoded. `&` and `+` are omitted because they take a space on both sides and do not fit this schema\\u2019s bind-to-a-number model.\" }, { rule: \"nbsp\", cite: \"Spr\\u00E5kr\\u00E5det, Snabba skrivregler, \\u00A74.3.4 \\u201CF\\u00F6rkortningar f\\u00F6r m\\u00E5ttenheter\\u201D; BIPM, The International System of Units (SI), 9th ed. (2019), concise summary\", url: \"https://www.bipm.org/documents/20126/41483022/SI-Brochure-9-concise-EN.pdf\", note: \"Spr\\u00E5kr\\u00E5det verbatim: \\u201CInternationella f\\u00F6rkortningar f\\u00F6r m\\u00E5ttenheter g\\u00E5r alltid bra att skriva som f\\u00F6rkortningar, som cm (centimeter), kg (kilo), kWh (kilowattimme) och ml (milliliter). Dessa skriver du alltid utan punkt. S\\u00E5 skriver du ocks\\u00E5 svenska f\\u00F6rkortningar som liknar m\\u00E5ttenheter, som kr (kronor), min (minut), sek (sekund) och tim (timme).\\u201D BIPM verbatim: \\u201CA single space is always left between the number and the unit.\\u201D The unit list is restricted to forms named by one of these two sources.\" }, { rule: \"nbsp\", cite: \"Spr\\u00E5kr\\u00E5det, Snabba skrivregler, \\u00A74.3.1 and \\u00A74.5 \\u201CVanliga f\\u00F6rkortningar\\u201D\", url: \"https://www.diva-portal.org/smash/get/diva2:1829117/FULLTEXT04.pdf\", note: \"`abbreviations` is empty because Swedish multi-word abbreviations are written closed up, with no internal space: the guide\\u2019s own list gives bl.a., dvs., e.d., fr.o.m., f.d., f.\\u00F6., m.a.o., m.fl., m.m., obs., osv., p.g.a., s.k., t.ex., t.o.m. There is therefore no internal space to make non-breaking. (Older typographic practice spaced these \\u2014 \\u201Ct. ex.\\u201D \\u2014 but that is not the current recommendation.)\" }, { rule: \"nbsp\", cite: \"No Spr\\u00E5kr\\u00E5det guidance found for short-word binding or for initials; values deliberately conservative\", note: \"`afterShortWords`, `beforePunctuation` and `narrowBeforePunctuation` are empty by design. \\u00A71.16 states the general rule plainly \\u2014 \\u201CN\\u00E4r du anv\\u00E4nder vanliga skiljetecken s\\u00E4tter du inget mellanslag f\\u00F6re tecknet, men efter tecknet ska du ha mellanslag\\u201D \\u2014 which rules out any before-punctuation space, and Swedish has no rule against short words at line end. `initialBinding` is \\\"none\\\" (spec 0.6.0: the field used to be the boolean bindInitials, false): \\u00A71.16 recommends fast mellanslag only for \\u201Cde tecken och siffror som h\\u00F6r ihop\\u201D, i.e. signs and digits, not personal initials.\" }, { rule: \"nbsp\", cite: \"Spr\\u00E5kr\\u00E5det, Snabba skrivregler, \\u00A71.16 \\u201CTecken och mellanslag\\u201D and \\u00A74.5 \\u201CVanliga f\\u00F6rkortningar\\u201D\", url: \"https://www.diva-portal.org/smash/get/diva2:1829117/FULLTEXT04.pdf\", note: \"`beforeNumber` and `beforeWord` are empty, and this was the closest call in this file. Spr\\u00E5kr\\u00E5det does write kl. 8\\u201316, nr 3 and s. 3\\u20135, and \\u00A71.16 recommends fast mellanslag so that \\u201Cde tecken och siffror som h\\u00F6r ihop ska hamna p\\u00E5 samma rad\\u201D. But that sentence is scoped to tecken \\u2014 the sign-and-digit pairs of \\u00A71.16 (%, \\u20AC, \\u00A7, &, +) \\u2014 and the guide nowhere extends it to abbreviations such as kl., nr or s. Encoding them would convert a plausible reading into a normative claim the source does not make, so the lists stay empty. `beforeWord` likewise: no Swedish authority consulted requires binding a title (dr, prof.) to a following name.\" }, { rule: \"hyphen\", cite: \"Spr\\u00E5kr\\u00E5det, Snabba skrivregler, \\u00A74.4 (sammans\\u00E4ttningar med f\\u00F6rkortningar) and kap. 7 (avstavning)\", url: \"https://www.diva-portal.org/smash/get/diva2:1829117/FULLTEXT04.pdf\", note: \"`prefixes`, `suffixes` and `compounds` are empty. The guide\\u2019s hyphen material states when to insert a bindestreck in compounds (e-post, EU-l\\u00E4nderna, FN-arbete, satellit-tv-program, lan-spel) and treats avstavning as a separate topic; it never forbids a line break at an existing hyphen. Swedish compounding is productive, so there is no closed inventory to list \\u2014 the field exists for the Russian \\u043A\\u043E\\u0435- / -\\u0442\\u0430\\u043A\\u0438 / \\u0438\\u0437-\\u043F\\u043E\\u0434 case. No U+2011 requirement found in any Spr\\u00E5kr\\u00E5det material consulted.\" }] },\n uk: { locale: \"uk\", name: \"Ukrainian\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"em-tight\" }, ellipsis: { abbreviatedAfterTerminal: true }, hyphen: { prefixes: [\"\\u0431\\u0443\\u0434\\u044C-\", \"\\u043A\\u0430\\u0437\\u043D\\u0430-\", \"\\u0445\\u0442\\u043E\\u0437\\u043D\\u0430-\", \"\\u0431\\u043E\\u0437\\u043D\\u0430-\"], suffixes: [\"-\\u0431\\u043E\", \"-\\u043D\\u043E\", \"-\\u043E\\u0442\", \"-\\u0442\\u043E\", \"-\\u0442\\u0430\\u043A\\u0438\", \"-\\u0431\\u0443\\u0434\\u044C\", \"-\\u043D\\u0435\\u0431\\u0443\\u0434\\u044C\"], compounds: [\"\\u0432\\u0438\\u0434-\\u0432\\u043E\", \"\\u0433\\u0440-\\u043D\", \"\\u0456\\u043D-\\u0442\", \"\\u0440-\\u043D\", \"\\u0443\\u043D-\\u0442\", \"\\u0444-\\u043A\\u0430\", \"\\u0442-\\u0432\\u043E\", \"\\u0437-\\u0437\\u0430\", \"\\u0456\\u0437-\\u0437\\u0430\", \"\\u0437-\\u043D\\u0430\\u0434\", \"\\u0437-\\u043F\\u0435\\u0440\\u0435\\u0434\", \"\\u0437-\\u043F\\u0456\\u0434\", \"\\u0456\\u0437-\\u043F\\u0456\\u0434\", \"\\u0437-\\u043F\\u043E\\u0437\\u0430\", \"\\u0437-\\u043F\\u043E\\u043C\\u0456\\u0436\", \"\\u0437-\\u043F\\u043E\\u043D\\u0430\\u0434\", \"\\u0437-\\u043F\\u043E\\u043F\\u0456\\u0434\", \"\\u0437-\\u043F\\u043E\\u0441\\u0435\\u0440\\u0435\\u0434\", \"\\u0437-\\u043F\\u0440\\u043E\\u043C\\u0456\\u0436\"] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"\\u0456 \\u0442. \\u0434.\", \"\\u0456 \\u0442. \\u0456\\u043D.\", \"\\u0442\\u0430 \\u0456\\u043D.\", \"\\u043A\\u0443\\u0431. \\u0441\\u043C\"], beforeUnits: [\"%\", \"\\u0433\\u0430\", \"\\u0433\\u043E\\u0434\", \"\\u0434\\u043C\", \"\\u043A\\u0411\", \"\\u043A\\u0412\\u0442\", \"\\u043A\\u0433\", \"\\u043A\\u043C\", \"\\u043C\\u043C\", \"\\u0441\\u043C\", \"\\u0445\\u0432\", \"\\u0412\\u0442\", \"\\u043A\\u043C/\\u0433\\u043E\\u0434\", \"\\u043C/\\u0441\", \"\\u043C\\u043B\\u043D\", \"\\u043C\\u043B\\u0440\\u0434\", \"\\u0442\\u0440\\u043B\\u043D\", \"\\u0433\\u0440\\u043D\", \"\\u0440.\"], beforeNumber: [], beforeWord: [\"\\u0430\\u043A\\u0430\\u0434.\", \"\\u0434\\u043E\\u0446.\", \"\\u043F\\u0440\\u043E\\u0444.\"], afterSymbols: [], initialBinding: \"chain\" }, sources: [{ rule: \"quotes\", cite: \"\\u0423\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u0438\\u0439 \\u043F\\u0440\\u0430\\u0432\\u043E\\u043F\\u0438\\u0441 (2019), \\u0441\\u0445\\u0432\\u0430\\u043B\\u0435\\u043D\\u0438\\u0439 \\u041A\\u0430\\u0431\\u0456\\u043D\\u0435\\u0442\\u043E\\u043C \\u041C\\u0456\\u043D\\u0456\\u0441\\u0442\\u0440\\u0456\\u0432 \\u0423\\u043A\\u0440\\u0430\\u0457\\u043D\\u0438 (\\u041F\\u043E\\u0441\\u0442\\u0430\\u043D\\u043E\\u0432\\u0430 \\u2116 437 \\u0432\\u0456\\u0434 22.05.2019), \\u00A7 164 \\u00AB\\u041B\\u0410\\u041F\\u041A\\u0418 (\\u00AB \\u00BB, \\u201C \\u201D, \\u201E \\u201C, \\u0440\\u0456\\u0434\\u0448\\u0435 \\u201E \\u201D)\\u00BB, \\u043F. 3: \\u00AB\\u0423 \\u0444\\u0443\\u043D\\u043A\\u0446\\u0456\\u0457 \\u043F\\u0435\\u0440\\u0448\\u0438\\u0445 \\u0440\\u0435\\u043A\\u043E\\u043C\\u0435\\u043D\\u0434\\u043E\\u0432\\u0430\\u043D\\u043E \\u0432\\u0436\\u0438\\u0432\\u0430\\u0442\\u0438 \\u043A\\u0443\\u0442\\u043E\\u0432\\u0456 \\u043B\\u0430\\u043F\\u043A\\u0438, \\u0430\\u0431\\u043E \\u00AB\\u043B\\u0430\\u043F\\u043A\\u0438-\\u044F\\u043B\\u0438\\u043D\\u043A\\u0438\\u00BB (\\u00AB\\u2026\\u00BB), \\u0443 \\u0444\\u0443\\u043D\\u043A\\u0446\\u0456\\u0457 \\u0432\\u043D\\u0443\\u0442\\u0440\\u0456\\u0448\\u043D\\u0456\\u0445 \\u2014 \\u00AB\\u043B\\u0430\\u043F\\u043A\\u0438-\\u043B\\u0430\\u043F\\u043A\\u0438\\u00BB (\\u201C\\u2026\\u201D \\u0442\\u0430 \\u0456\\u043D.): \\u00AB\\u0426\\u0435 \\u043C\\u0456\\u0439 \\u201C\\u041A\\u043E\\u0431\\u0437\\u0430\\u0440\\u201D\\u00BB, \\u2014 \\u0441\\u043A\\u0430\\u0437\\u0430\\u0432 \\u0432\\u0456\\u043D\\u00BB; \\u0442\\u0430\\u043C \\u0441\\u0430\\u043C\\u043E: \\u00AB\\u041D\\u0430 \\u043F\\u0438\\u0441\\u044C\\u043C\\u0456 (\\u0443 \\u0440\\u0443\\u043A\\u043E\\u043F\\u0438\\u0441\\u043D\\u0438\\u0445 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0430\\u0445) \\u00AB\\u043B\\u0430\\u043F\\u043A\\u0438-\\u043B\\u0430\\u043F\\u043A\\u0438\\u00BB \\u0442\\u0440\\u0430\\u0434\\u0438\\u0446\\u0456\\u0439\\u043D\\u043E \\u0432\\u0438\\u043A\\u043E\\u0440\\u0438\\u0441\\u0442\\u043E\\u0432\\u0443\\u044E\\u0442\\u044C \\u0443 \\u0444\\u043E\\u0440\\u043C\\u0456 \\u201E\\u2026\\u201C\\u00BB\", url: \"https://www.ulif.org.ua/system/files/pravopus-new.pdf\", note: \"\\u0417\\u043E\\u0432\\u043D\\u0456\\u0448\\u043D\\u0456 \\u043B\\u0430\\u043F\\u043A\\u0438 \\u2014 U+00AB \\u0456 U+00BB, \\u0432\\u043D\\u0443\\u0442\\u0440\\u0456\\u0448\\u043D\\u0456 \\u2014 U+201C \\u0456 U+201D. \\u041A\\u043E\\u0434 \\u043A\\u043E\\u0436\\u043D\\u043E\\u0433\\u043E \\u0437\\u043D\\u0430\\u043A\\u0430 \\u0432\\u0441\\u0442\\u0430\\u043D\\u043E\\u0432\\u043B\\u0435\\u043D\\u043E \\u0437\\u0430 \\u0434\\u0440\\u0443\\u043A\\u043E\\u0432\\u0430\\u043D\\u0438\\u043C \\u0437\\u043E\\u0431\\u0440\\u0430\\u0436\\u0435\\u043D\\u043D\\u044F\\u043C \\u0441. 247 \\u043E\\u0444\\u0456\\u0446\\u0456\\u0439\\u043D\\u043E\\u0433\\u043E \\u0432\\u0438\\u0434\\u0430\\u043D\\u043D\\u044F, \\u0430 \\u043D\\u0435 \\u0437\\u0430 \\u0442\\u0435\\u043A\\u0441\\u0442\\u043E\\u0432\\u043E\\u044E \\u043A\\u043E\\u043D\\u0432\\u0435\\u0440\\u0441\\u0456\\u0454\\u044E: \\u0443 \\u043F\\u0440\\u0438\\u043A\\u043B\\u0430\\u0434\\u0456 \\u00A7 164 \\u043F. 3 \\u043E\\u0431\\u0438\\u0434\\u0432\\u0430 \\u0432\\u043D\\u0443\\u0442\\u0440\\u0456\\u0448\\u043D\\u0456 \\u0437\\u043D\\u0430\\u043A\\u0438 \\u043F\\u0456\\u0434\\u043D\\u044F\\u0442\\u0456 \\u0434\\u043E \\u0432\\u0435\\u0440\\u0445\\u0443 \\u0440\\u044F\\u0434\\u043A\\u0430, \\u0432\\u0456\\u0434\\u043A\\u0440\\u0438\\u0432\\u0430\\u043B\\u044C\\u043D\\u0438\\u0439 \\u043C\\u0430\\u0454 \\u0444\\u043E\\u0440\\u043C\\u0443 6, \\u0437\\u0430\\u043A\\u0440\\u0438\\u0432\\u0430\\u043B\\u044C\\u043D\\u0438\\u0439 \\u2014 \\u0444\\u043E\\u0440\\u043C\\u0443 9. \\u0426\\u0415 \\u0421\\u041F\\u0420\\u041E\\u0421\\u0422\\u041E\\u0412\\u0423\\u0404 \\u043F\\u043E\\u0448\\u0438\\u0440\\u0435\\u043D\\u0435 \\u043F\\u0440\\u0438\\u043F\\u0443\\u0449\\u0435\\u043D\\u043D\\u044F, \\u0449\\u043E \\u0443\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u0430 \\u0431\\u0435\\u0440\\u0435 \\u0432\\u0441\\u0435\\u0440\\u0435\\u0434\\u0438\\u043D\\u0443 \\u201E\\u2026\\u201C: \\u0437\\u0430\\u0433\\u043E\\u043B\\u043E\\u0432\\u043E\\u043A \\u00A7 164 \\u0441\\u043F\\u0440\\u0430\\u0432\\u0434\\u0456 \\u0434\\u043E\\u0437\\u0432\\u043E\\u043B\\u044F\\u0454 \\u0447\\u043E\\u0442\\u0438\\u0440\\u0438 \\u043F\\u0430\\u0440\\u0438, \\u0430\\u043B\\u0435 \\u0441\\u0430\\u043C\\u0435 \\u043F. 3 \\u0432\\u0456\\u0434\\u043D\\u043E\\u0441\\u0438\\u0442\\u044C \\u201E\\u2026\\u201C \\u0434\\u043E \\u0420\\u0423\\u041A\\u041E\\u041F\\u0418\\u0421\\u041D\\u0418\\u0425 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0456\\u0432, \\u0430 \\u0434\\u043B\\u044F \\u0434\\u0440\\u0443\\u043A\\u043E\\u0432\\u0430\\u043D\\u043E\\u0433\\u043E \\u0440\\u0435\\u043A\\u043E\\u043C\\u0435\\u043D\\u0434\\u0443\\u0454 \\u201C\\u2026\\u201D. innerSpace = \\u00ABnone\\u00BB: \\u0436\\u043E\\u0434\\u043D\\u0435 \\u0434\\u0436\\u0435\\u0440\\u0435\\u043B\\u043E \\u043D\\u0435 \\u0432\\u0438\\u043C\\u0430\\u0433\\u0430\\u0454 \\u0432\\u0456\\u0434\\u0441\\u0442\\u0443\\u043F\\u0443 \\u0432\\u0441\\u0435\\u0440\\u0435\\u0434\\u0438\\u043D\\u0456 \\u043B\\u0430\\u043F\\u043E\\u043A. \\u0422\\u0440\\u0435\\u0442\\u0456\\u0439 \\u0440\\u0456\\u0432\\u0435\\u043D\\u044C \\u0432\\u043A\\u043B\\u0430\\u0434\\u0435\\u043D\\u043D\\u044F \\u0432 locale.schema.json \\u043D\\u0435\\u0432\\u0438\\u0440\\u0430\\u0437\\u043D\\u0438\\u0439. \\u0417\\u0432\\u0456\\u0440\\u0435\\u043D\\u043E 18.09.2026.\" }, { rule: \"dashes\", cite: \"\\u0423\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u0438\\u0439 \\u043F\\u0440\\u0430\\u0432\\u043E\\u043F\\u0438\\u0441 (2019), \\u00A7 161 \\u00AB\\u0422\\u0418\\u0420\\u0415 (\\u2014)\\u00BB, I, \\u043F. 10\\u201411 \\u0456 \\u041F\\u0440\\u0438\\u043C\\u0456\\u0442\\u043A\\u0430 2: \\u0442\\u0438\\u0440\\u0435 \\u0441\\u0442\\u0430\\u0432\\u0438\\u043C\\u043E \\u043F\\u0435\\u0440\\u0435\\u0434 \\u0432\\u0456\\u0434\\u043E\\u043A\\u0440\\u0435\\u043C\\u043B\\u0435\\u043D\\u0438\\u043C \\u0437\\u0432\\u043E\\u0440\\u043E\\u0442\\u043E\\u043C \\u0430\\u0431\\u043E \\u0432\\u0441\\u0442\\u0430\\u0432\\u043B\\u0435\\u043D\\u043E\\u044E \\u043A\\u043E\\u043D\\u0441\\u0442\\u0440\\u0443\\u043A\\u0446\\u0456\\u0454\\u044E \\u2014 \\u00AB\\u0422\\u043E\\u043F\\u043E\\u043B\\u044C\\u0441\\u044C\\u043A\\u0438\\u0439 \\u2014 \\u043C\\u043E\\u043B\\u043E\\u0434\\u0438\\u0439 \\u0447\\u043E\\u043B\\u043E\\u0432\\u0456\\u043A, \\u0430\\u043B\\u0435 \\u2014 \\u043D\\u0430 \\u0434\\u0443\\u043C\\u043A\\u0443 \\u043F\\u0430\\u043D\\u0430 \\u043F\\u043E\\u0441\\u043B\\u0430 \\u2014 \\u043D\\u0435\\u0437\\u0432\\u0438\\u0447\\u0430\\u0439\\u043D\\u043E \\u0442\\u0430\\u043B\\u0430\\u043D\\u043E\\u0432\\u0438\\u0442\\u0438\\u0439 \\u0456 \\u0441\\u043E\\u043B\\u0456\\u0434\\u043D\\u0438\\u0439\\u00BB (\\u041E. \\u041C\\u0430\\u043A\\u043E\\u0432\\u0435\\u0439)\", url: \"https://www.ulif.org.ua/system/files/pravopus-new.pdf\", note: \"\\u041E\\u0431\\u0491\\u0440\\u0443\\u043D\\u0442\\u043E\\u0432\\u0443\\u0454 dash.parenthetical = \\u00ABem-spaced\\u00BB. \\u0414\\u041E\\u0412\\u0416\\u0418\\u041D\\u0410 \\u0432\\u0441\\u0442\\u0430\\u043D\\u043E\\u0432\\u043B\\u0435\\u043D\\u0430 \\u043F\\u0440\\u044F\\u043C\\u043E: \\u0437\\u0430\\u0433\\u043E\\u043B\\u043E\\u0432\\u043E\\u043A \\u043F\\u0430\\u0440\\u0430\\u0433\\u0440\\u0430\\u0444\\u0430 \\u2014 \\u00AB\\u0422\\u0418\\u0420\\u0415 (\\u2014)\\u00BB, \\u0442\\u043E\\u0431\\u0442\\u043E U+2014, \\u0456 \\u0446\\u0435\\u0439 \\u0441\\u0430\\u043C\\u0438\\u0439 \\u0437\\u043D\\u0430\\u043A \\u0441\\u0442\\u043E\\u0457\\u0442\\u044C \\u0443 \\u043A\\u043E\\u0436\\u043D\\u043E\\u043C\\u0443 \\u043F\\u0440\\u0438\\u043A\\u043B\\u0430\\u0434\\u0456 \\u00A7\\u00A7 161, 166, 167. \\u0412\\u0406\\u0414\\u0411\\u0418\\u0412\\u041A\\u0410 \\u0432\\u0441\\u0442\\u0430\\u043D\\u043E\\u0432\\u043B\\u0435\\u043D\\u0430 \\u043F\\u0440\\u043E\\u0442\\u0438\\u0441\\u0442\\u0430\\u0432\\u043B\\u0435\\u043D\\u043D\\u044F\\u043C, \\u0430 \\u043D\\u0435 \\u043F\\u0440\\u043E\\u0437\\u043E\\u0432\\u0438\\u043C \\u0444\\u043E\\u0440\\u043C\\u0443\\u043B\\u044E\\u0432\\u0430\\u043D\\u043D\\u044F\\u043C: \\u043F\\u0440\\u0430\\u0432\\u043E\\u043F\\u0438\\u0441 \\u043D\\u0456\\u0434\\u0435 \\u043D\\u0435 \\u043F\\u0438\\u0448\\u0435 \\u00AB\\u0442\\u0438\\u0440\\u0435 \\u0432\\u0456\\u0434\\u0431\\u0438\\u0432\\u0430\\u0454\\u0442\\u044C\\u0441\\u044F \\u043F\\u0440\\u043E\\u0431\\u0456\\u043B\\u0430\\u043C\\u0438\\u00BB, \\u0430\\u043B\\u0435 \\u041F\\u0440\\u0438\\u043C\\u0456\\u0442\\u043A\\u0430 \\u0434\\u043E \\u043F. 14 \\u043A\\u0430\\u0436\\u0435 \\u00AB\\u0442\\u0438\\u0440\\u0435 \\u0441\\u0442\\u0430\\u0432\\u0438\\u043C\\u043E \\u0431\\u0435\\u0437 \\u0432\\u0456\\u0434\\u0441\\u0442\\u0443\\u043F\\u0456\\u0432 \\u043C\\u0456\\u0436 \\u0437\\u043D\\u0430\\u043A\\u0430\\u043C\\u0438\\u00BB \\u0441\\u0430\\u043C\\u0435 \\u0434\\u043B\\u044F \\u0432\\u0438\\u043F\\u0430\\u0434\\u043A\\u0443 \\u043C\\u0456\\u0436 \\u0446\\u0438\\u0444\\u0440\\u0430\\u043C\\u0438, \\u0430 \\u00AB\\u0431\\u0435\\u0437 \\u0432\\u0456\\u0434\\u0441\\u0442\\u0443\\u043F\\u0456\\u0432\\u00BB \\u043C\\u0430\\u0454 \\u0441\\u0435\\u043D\\u0441 \\u043B\\u0438\\u0448\\u0435 \\u044F\\u043A \\u0432\\u0456\\u0434\\u0445\\u0438\\u043B\\u0435\\u043D\\u043D\\u044F \\u0432\\u0456\\u0434 \\u0432\\u0456\\u0434\\u0431\\u0438\\u0442\\u043E\\u0433\\u043E \\u0437\\u0430 \\u0437\\u0430\\u043C\\u043E\\u0432\\u0447\\u0443\\u0432\\u0430\\u043D\\u043D\\u044F\\u043C. \\u0426\\u0435 \\u0454\\u0434\\u0438\\u043D\\u0438\\u0439 \\u0437\\u0430\\u043F\\u0438\\u0441 \\u0446\\u044C\\u043E\\u0433\\u043E \\u0444\\u0430\\u0439\\u043B\\u0443, \\u0449\\u043E \\u0441\\u043F\\u0438\\u0440\\u0430\\u0454\\u0442\\u044C\\u0441\\u044F \\u043D\\u0430 \\u0432\\u0438\\u0441\\u043D\\u043E\\u0432\\u043E\\u043A \\u0456\\u0437 \\u0442\\u0435\\u043A\\u0441\\u0442\\u0443 \\u0434\\u0436\\u0435\\u0440\\u0435\\u043B\\u0430, \\u0456 \\u0432\\u0456\\u043D \\u043F\\u043E\\u0437\\u043D\\u0430\\u0447\\u0435\\u043D\\u0438\\u0439 \\u044F\\u043A \\u0442\\u0430\\u043A\\u0438\\u0439 \\u0441\\u0432\\u0456\\u0434\\u043E\\u043C\\u043E. \\u0417\\u0432\\u0456\\u0440\\u0435\\u043D\\u043E 18.09.2026.\" }, { rule: \"ranges\", cite: \"\\u0423\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u0438\\u0439 \\u043F\\u0440\\u0430\\u0432\\u043E\\u043F\\u0438\\u0441 (2019), \\u00A7 161 \\u00AB\\u0422\\u0418\\u0420\\u0415 (\\u2014)\\u00BB, I, \\u043F. 14, \\u041F\\u0440\\u0438\\u043C\\u0456\\u0442\\u043A\\u0430: \\u00AB\\u041C\\u0456\\u0436 \\u0446\\u0438\\u0444\\u0440\\u0430\\u043C\\u0438 \\u0432 \\u0442\\u0430\\u043A\\u0438\\u0445 \\u0432\\u0438\\u043F\\u0430\\u0434\\u043A\\u0430\\u0445 \\u0442\\u0438\\u0440\\u0435 \\u0441\\u0442\\u0430\\u0432\\u0438\\u043C\\u043E \\u0431\\u0435\\u0437 \\u0432\\u0456\\u0434\\u0441\\u0442\\u0443\\u043F\\u0456\\u0432 \\u043C\\u0456\\u0436 \\u0437\\u043D\\u0430\\u043A\\u0430\\u043C\\u0438: \\u0443 2010\\u20142018 \\u0440\\u043E\\u043A\\u0430\\u0445; \\u043F\\u0430\\u043C'\\u044F\\u0442\\u043A\\u0438 \\u0443\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u043E\\u0457 \\u043C\\u043E\\u0432\\u0438 XVI\\u2014XVIII \\u0441\\u0442.; \\u043D\\u0430 \\u0441\\u0442\\u043E\\u0440\\u0456\\u043D\\u043A\\u0430\\u0445 1\\u201410; \\u0443 1\\u20144 \\u0442\\u043E\\u043C\\u0430\\u0445, \\u0430\\u043B\\u0435, \\u043D\\u0430\\u043F\\u0440.: \\u043D\\u0430\\u043F\\u0440\\u0438\\u043A\\u0456\\u043D\\u0446\\u0456 XX \\u2014 \\u043D\\u0430 \\u043F\\u043E\\u0447\\u0430\\u0442\\u043A\\u0443 XXI \\u0441\\u0442.\\u00BB\", url: \"https://www.ulif.org.ua/system/files/pravopus-new.pdf\", note: \"\\u041E\\u0431\\u0491\\u0440\\u0443\\u043D\\u0442\\u043E\\u0432\\u0443\\u0454 dash.range = \\u00ABem-tight\\u00BB: \\u0434\\u043E\\u0432\\u0433\\u0435 \\u0442\\u0438\\u0440\\u0435 U+2014 \\u0431\\u0435\\u0437 \\u0432\\u0456\\u0434\\u0431\\u0438\\u0432\\u043A\\u0438. \\u041F\\u0440\\u043E\\u0442\\u0438\\u0441\\u0442\\u0430\\u0432\\u043B\\u0435\\u043D\\u043D\\u044F \\u0432 \\u0441\\u0430\\u043C\\u0456\\u0439 \\u041F\\u0440\\u0438\\u043C\\u0456\\u0442\\u0446\\u0456 (\\u00AB\\u043D\\u0430 \\u0441\\u0442\\u043E\\u0440\\u0456\\u043D\\u043A\\u0430\\u0445 1\\u201410\\u00BB \\u0431\\u0435\\u0437 \\u0432\\u0456\\u0434\\u0441\\u0442\\u0443\\u043F\\u0456\\u0432, \\u0430\\u043B\\u0435 \\u00AB\\u043D\\u0430\\u043F\\u0440\\u0438\\u043A\\u0456\\u043D\\u0446\\u0456 XX \\u2014 \\u043D\\u0430 \\u043F\\u043E\\u0447\\u0430\\u0442\\u043A\\u0443 XXI \\u0441\\u0442.\\u00BB \\u0437 \\u0432\\u0456\\u0434\\u0441\\u0442\\u0443\\u043F\\u0430\\u043C\\u0438) \\u043F\\u043E\\u043A\\u0430\\u0437\\u0443\\u0454, \\u0449\\u043E \\u0431\\u0435\\u0437\\u0432\\u0456\\u0434\\u0441\\u0442\\u0443\\u043F\\u043D\\u0430 \\u0444\\u043E\\u0440\\u043C\\u0430 \\u0441\\u0442\\u043E\\u0441\\u0443\\u0454\\u0442\\u044C\\u0441\\u044F \\u0440\\u0456\\u0432\\u043D\\u043E \\u0442\\u043E\\u0433\\u043E, \\u0449\\u043E \\u0440\\u043E\\u0431\\u0438\\u0442\\u044C \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u043E ranges. \\u041F\\u0440\\u0430\\u0432\\u0438\\u043B\\u043E \\u0432\\u0438\\u043C\\u043A\\u043D\\u0435\\u043D\\u0435 \\u0437\\u0430 \\u0437\\u0430\\u043C\\u043E\\u0432\\u0447\\u0443\\u0432\\u0430\\u043D\\u043D\\u044F\\u043C (spec 0.5.0). \\u0417\\u0432\\u0456\\u0440\\u0435\\u043D\\u043E 18.09.2026.\" }, { rule: \"ellipsis\", cite: \"\\u0423\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u0438\\u0439 \\u043F\\u0440\\u0430\\u0432\\u043E\\u043F\\u0438\\u0441 (2019), \\u00A7 162 \\u00AB\\u0422\\u0420\\u0418 \\u041A\\u0420\\u0410\\u041F\\u041A\\u0418, \\u0410\\u0411\\u041E \\u041A\\u0420\\u0410\\u041F\\u041A\\u0418 (\\u2026)\\u00BB, \\u041F\\u0440\\u0438\\u043C\\u0456\\u0442\\u043A\\u0430: \\u00AB\\u0443 \\u043F\\u043E\\u0441\\u0442\\u043F\\u043E\\u0437\\u0438\\u0446\\u0456\\u0457 \\u2014 \\u043F\\u0456\\u0441\\u043B\\u044F \\u0437\\u043D\\u0430\\u043A\\u0430 \\u043F\\u0438\\u0442\\u0430\\u043D\\u043D\\u044F \\u0456 \\u0437\\u043D\\u0430\\u043A\\u0430 \\u043E\\u043A\\u043B\\u0438\\u043A\\u0443 \\u2014 \\u0441\\u0442\\u0430\\u0432\\u0438\\u043C\\u043E \\u0434\\u0432\\u0456 \\u043A\\u0440\\u0430\\u043F\\u043A\\u0438: \\u0421\\u0442\\u0440\\u0430\\u0436\\u043D\\u0438\\u043A\\u0438 \\u043D\\u0430 \\u043B\\u044E\\u0434\\u0435\\u0439 \\u0441\\u0442\\u0440\\u0456\\u043B\\u044F\\u043B\\u0438, \\u0446\\u0435 \\u0432\\u0456\\u0434\\u043E\\u043C\\u043E, \\u0430 \\u0449\\u043E\\u0431 \\u0441\\u0435\\u043B\\u044F\\u043D\\u0438?.. (\\u041A. \\u0413\\u043E\\u0440\\u0434\\u0456\\u0454\\u043D\\u043A\\u043E); \\u0412\\u0441\\u0442\\u0430\\u0454 \\u043D\\u0430\\u0440\\u043E\\u0434, \\u0433\\u0443\\u0434\\u0443\\u0442\\u044C \\u043C\\u043E\\u0441\\u0442\\u0438, \\u0420\\u043E\\u043A\\u043E\\u0447\\u0443\\u0442\\u044C \\u0440\\u0456\\u043A\\u0438 \\u044F\\u0441\\u043D\\u043E\\u0432\\u043E\\u0434\\u0456!.. (\\u041C. \\u0420\\u0438\\u043B\\u044C\\u0441\\u044C\\u043A\\u0438\\u0439)\\u00BB; \\u00A7 166 \\u00AB\\u041A\\u041E\\u041C\\u0411\\u0406\\u041D\\u041E\\u0412\\u0410\\u041D\\u0415 \\u0412\\u0416\\u0418\\u0412\\u0410\\u041D\\u041D\\u042F \\u0420\\u041E\\u0417\\u0414\\u0406\\u041B\\u041E\\u0412\\u0418\\u0425 \\u0417\\u041D\\u0410\\u041A\\u0406\\u0412\\u00BB, \\u043F. 2, \\u0449\\u043E \\u043F\\u0435\\u0440\\u0435\\u043B\\u0456\\u0447\\u0443\\u0454 \\u0434\\u043E\\u043F\\u0443\\u0441\\u0442\\u0438\\u043C\\u0456 \\u043F\\u043E\\u0454\\u0434\\u043D\\u0430\\u043D\\u043D\\u044F \\u044F\\u043A \\u00AB\\u2026?; \\u2026!; ?..; !..\\u00BB\", url: \"https://www.ulif.org.ua/system/files/pravopus-new.pdf\", note: \"\\u041E\\u0431\\u0491\\u0440\\u0443\\u043D\\u0442\\u043E\\u0432\\u0443\\u0454 abbreviatedAfterTerminal = true. \\u0423\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u0430 \\u2014 \\u0434\\u0440\\u0443\\u0433\\u0430 \\u043F\\u0456\\u0441\\u043B\\u044F \\u0440\\u043E\\u0441\\u0456\\u0439\\u0441\\u044C\\u043A\\u043E\\u0457 \\u043B\\u043E\\u043A\\u0430\\u043B\\u044C \\u0456\\u0437 \\u0446\\u0438\\u043C \\u0437\\u043D\\u0430\\u0447\\u0435\\u043D\\u043D\\u044F\\u043C, \\u0456 \\u0446\\u0435 \\u043F\\u0435\\u0440\\u0435\\u0432\\u0456\\u0440\\u0435\\u043D\\u043E \\u043E\\u043A\\u0440\\u0435\\u043C\\u043E \\u0437\\u0430 \\u0434\\u0432\\u043E\\u043C\\u0430 \\u043F\\u0430\\u0440\\u0430\\u0433\\u0440\\u0430\\u0444\\u0430\\u043C\\u0438, \\u0430 \\u043D\\u0435 \\u043F\\u0435\\u0440\\u0435\\u043D\\u0435\\u0441\\u0435\\u043D\\u043E \\u0437\\u0430 \\u0430\\u043D\\u0430\\u043B\\u043E\\u0433\\u0456\\u0454\\u044E \\u0437\\u0456 \\u0441\\u043F\\u043E\\u0440\\u0456\\u0434\\u043D\\u0435\\u043D\\u043E\\u0457 \\u043C\\u043E\\u0432\\u0438. \\u0417\\u0432\\u0456\\u0440\\u0435\\u043D\\u043E 18.09.2026.\" }, { rule: \"hyphen\", cite: \"\\u0423\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u0438\\u0439 \\u043F\\u0440\\u0430\\u0432\\u043E\\u043F\\u0438\\u0441 (2019), \\u00A7 64 \\u00AB\\u0422\\u0435\\u0445\\u043D\\u0456\\u0447\\u043D\\u0456 \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u0430 \\u043F\\u0435\\u0440\\u0435\\u043D\\u043E\\u0441\\u0443\\u00BB, \\u043F. 4: \\u00AB\\u041D\\u0435 \\u043C\\u043E\\u0436\\u043D\\u0430 \\u0440\\u043E\\u0437\\u0440\\u0438\\u0432\\u0430\\u0442\\u0438 \\u0443\\u043C\\u043E\\u0432\\u043D\\u0456 (\\u0433\\u0440\\u0430\\u0444\\u0456\\u0447\\u043D\\u0456) \\u0441\\u043A\\u043E\\u0440\\u043E\\u0447\\u0435\\u043D\\u043D\\u044F \\u043D\\u0430 \\u0437\\u0440\\u0430\\u0437\\u043E\\u043A \\u0432\\u0438\\u0434-\\u0432\\u043E, \\u0456 \\u0442. \\u0434., \\u0456 \\u0442. \\u0456\\u043D., \\u0442\\u0430 \\u0456\\u043D., \\u0442-\\u0432\\u043E \\u0442\\u043E\\u0449\\u043E\\u00BB; \\u00A7 62, \\u043F. 2: \\u00AB\\u0423 \\u0433\\u0440\\u0430\\u0444\\u0456\\u0447\\u043D\\u0438\\u0445 \\u0441\\u043A\\u043E\\u0440\\u043E\\u0447\\u0435\\u043D\\u043D\\u044F\\u0445 \\u043F\\u0440\\u043E\\u043F\\u0443\\u0449\\u0435\\u043D\\u0443 \\u0441\\u0435\\u0440\\u0435\\u0434\\u043D\\u044E \\u0447\\u0430\\u0441\\u0442\\u0438\\u043D\\u0443 \\u0441\\u043B\\u043E\\u0432\\u0430 \\u043F\\u043E\\u0437\\u043D\\u0430\\u0447\\u0430\\u0454\\u043C\\u043E \\u0434\\u0435\\u0444\\u0456\\u0441\\u043E\\u043C: \\u0432\\u0438\\u0434-\\u0432\\u043E (\\u0432\\u0438\\u0434\\u0430\\u0432\\u043D\\u0438\\u0446\\u0442\\u0432\\u043E), \\u0433\\u0440-\\u043D (\\u0433\\u0440\\u043E\\u043C\\u0430\\u0434\\u044F\\u043D\\u0438\\u043D), \\u0456\\u043D-\\u0442 (\\u0456\\u043D\\u0441\\u0442\\u0438\\u0442\\u0443\\u0442), \\u0440-\\u043D (\\u0440\\u0430\\u0439\\u043E\\u043D), \\u0443\\u043D-\\u0442 (\\u0443\\u043D\\u0456\\u0432\\u0435\\u0440\\u0441\\u0438\\u0442\\u0435\\u0442), \\u0444-\\u043A\\u0430 (\\u0444\\u0430\\u0431\\u0440\\u0438\\u043A\\u0430)\\u00BB\", url: \"https://www.ulif.org.ua/system/files/pravopus-new.pdf\", note: \"\\u0426\\u0435 \\u0454\\u0434\\u0438\\u043D\\u0430 \\u0447\\u0430\\u0441\\u0442\\u0438\\u043D\\u0430 hyphen \\u0434\\u043B\\u044F \\u0443\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u043E\\u0457, \\u0434\\u0435 \\u041D\\u0415\\u0420\\u041E\\u0417\\u0420\\u0418\\u0412\\u041D\\u0406\\u0421\\u0422\\u042C \\u0421\\u0410\\u041C\\u0410 \\u0404 \\u041D\\u041E\\u0420\\u041C\\u041E\\u042E, \\u0430 \\u043D\\u0435 \\u0440\\u0456\\u0448\\u0435\\u043D\\u043D\\u044F\\u043C \\u043F\\u0440\\u043E\\u0454\\u043A\\u0442\\u0443: \\u00A7 64 \\u043F. 4 \\u043F\\u0440\\u044F\\u043C\\u043E \\u0437\\u0430\\u0431\\u043E\\u0440\\u043E\\u043D\\u044F\\u0454 \\u0440\\u043E\\u0437\\u0440\\u0438\\u0432\\u0430\\u0442\\u0438 \\u0446\\u0435\\u0439 \\u043A\\u043B\\u0430\\u0441, \\u0430 \\u00A7 62 \\u043F. 2 \\u0437\\u0430\\u043A\\u0440\\u0438\\u0432\\u0430\\u0454 \\u0439\\u043E\\u0433\\u043E \\u043B\\u0456\\u0442\\u0435\\u0440\\u0430\\u043B\\u044C\\u043D\\u0438\\u043C \\u043F\\u0435\\u0440\\u0435\\u043B\\u0456\\u043A\\u043E\\u043C, \\u0431\\u043E \\u00AB\\u0442\\u043E\\u0449\\u043E\\u00BB \\u0432 \\u00A7 64 \\u0437\\u0430\\u043B\\u0438\\u0448\\u0430\\u0454 \\u043A\\u043B\\u0430\\u0441 \\u0432\\u0456\\u0434\\u043A\\u0440\\u0438\\u0442\\u0438\\u043C. \\u0423\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u0430 \\u0446\\u0438\\u043C \\u0432\\u0456\\u0434\\u0440\\u0456\\u0437\\u043D\\u044F\\u0454\\u0442\\u044C\\u0441\\u044F \\u0432\\u0456\\u0434 \\u043F\\u043E\\u043B\\u044C\\u0441\\u044C\\u043A\\u043E\\u0457, \\u0434\\u0435 PWN [196] \\u043F\\u043E\\u0434\\u0456\\u043B \\u0443 \\u043C\\u0456\\u0441\\u0446\\u0456 \\u0434\\u0435\\u0444\\u0456\\u0441\\u0430 \\u0441\\u0430\\u043C\\u0435 \\u041F\\u0420\\u0418\\u041F\\u0418\\u0421\\u0423\\u0404, \\u0447\\u0435\\u0440\\u0435\\u0437 \\u0449\\u043E pl.json \\u043C\\u0430\\u0454 \\u0442\\u0440\\u0438 \\u043F\\u043E\\u0440\\u043E\\u0436\\u043D\\u0456 \\u0441\\u043F\\u0438\\u0441\\u043A\\u0438. \\u0417\\u0432\\u0456\\u0440\\u0435\\u043D\\u043E 18.09.2026.\" }, { rule: \"hyphen\", cite: \"\\u0423\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u0438\\u0439 \\u043F\\u0440\\u0430\\u0432\\u043E\\u043F\\u0438\\u0441 (2019), \\u00A7 42 \\u00AB\\u041F\\u0440\\u0438\\u0439\\u043C\\u0435\\u043D\\u043D\\u0438\\u043A\\u0438\\u00BB, \\u043F. 2: \\u00AB\\u0417 \\u0434\\u0435\\u0444\\u0456\\u0441\\u043E\\u043C \\u043F\\u0438\\u0448\\u0435\\u043C\\u043E \\u0441\\u043A\\u043B\\u0430\\u0434\\u0435\\u043D\\u0456 \\u043F\\u0440\\u0438\\u0439\\u043C\\u0435\\u043D\\u043D\\u0438\\u043A\\u0438, \\u0443\\u0442\\u0432\\u043E\\u0440\\u0435\\u043D\\u0456 \\u0437 \\u043F\\u0440\\u043E\\u0441\\u0442\\u0438\\u0445 \\u043F\\u0440\\u0438\\u0439\\u043C\\u0435\\u043D\\u043D\\u0438\\u043A\\u0456\\u0432 \\u0437, \\u0456\\u0437 \\u0442\\u0430 \\u0456\\u043D\\u0448\\u0438\\u0445 \\u043F\\u0440\\u0438\\u0439\\u043C\\u0435\\u043D\\u043D\\u0438\\u043A\\u0456\\u0432: \\u0437-\\u0437\\u0430 (\\u0456\\u0437-\\u0437\\u0430), \\u0437-\\u043D\\u0430\\u0434, \\u0437-\\u043F\\u0435\\u0440\\u0435\\u0434, \\u0437-\\u043F\\u0456\\u0434 (\\u0456\\u0437-\\u043F\\u0456\\u0434), \\u0437-\\u043F\\u043E\\u0437\\u0430, \\u0437-\\u043F\\u043E\\u043C\\u0456\\u0436, \\u0437-\\u043F\\u043E\\u043D\\u0430\\u0434, \\u0437-\\u043F\\u043E\\u043F\\u0456\\u0434, \\u0437-\\u043F\\u043E\\u0441\\u0435\\u0440\\u0435\\u0434, \\u0437-\\u043F\\u0440\\u043E\\u043C\\u0456\\u0436\\u00BB; \\u00A7 44 \\u00AB\\u0427\\u0430\\u0441\\u0442\\u043A\\u0438\\u00BB, \\u043F. 3: \\u00AB\\u0417 \\u0434\\u0435\\u0444\\u0456\\u0441\\u043E\\u043C \\u043F\\u0438\\u0448\\u0435\\u043C\\u043E: 1) \\u0447\\u0430\\u0441\\u0442\\u043A\\u0438 -\\u0431\\u043E, -\\u043D\\u043E, -\\u043E\\u0442, -\\u0442\\u043E, -\\u0442\\u0430\\u043A\\u0438 \\u2026 2) \\u0447\\u0430\\u0441\\u0442\\u043A\\u0438 \\u0431\\u0443\\u0434\\u044C-, -\\u0431\\u0443\\u0434\\u044C, -\\u043D\\u0435\\u0431\\u0443\\u0434\\u044C, \\u043A\\u0430\\u0437\\u043D\\u0430-, \\u0445\\u0442\\u043E\\u0437\\u043D\\u0430-, \\u0431\\u043E\\u0437\\u043D\\u0430- \\u0456\\u0437 \\u0437\\u0430\\u0439\\u043C\\u0435\\u043D\\u043D\\u0438\\u043A\\u0430\\u043C\\u0438 \\u0456 \\u043F\\u0440\\u0438\\u0441\\u043B\\u0456\\u0432\\u043D\\u0438\\u043A\\u0430\\u043C\\u0438\\u00BB\", url: \"https://www.ulif.org.ua/system/files/pravopus-new.pdf\", note: \"\\u0426\\u0456 \\u043F\\u0430\\u0440\\u0430\\u0433\\u0440\\u0430\\u0444\\u0438 \\u043D\\u043E\\u0440\\u043C\\u0430\\u0442\\u0438\\u0432\\u043D\\u0456 \\u0434\\u043B\\u044F \\u0421\\u041A\\u041B\\u0410\\u0414\\u0423 \\u0444\\u043E\\u0440\\u043C, \\u0430\\u043B\\u0435 \\u043D\\u0435 \\u0434\\u043B\\u044F \\u0437\\u0430\\u0431\\u043E\\u0440\\u043E\\u043D\\u0438 \\u043F\\u0435\\u0440\\u0435\\u043D\\u043E\\u0441\\u0443, \\u0456 \\u0437\\u043C\\u0456\\u0448\\u0443\\u0432\\u0430\\u0442\\u0438 \\u0446\\u0435 \\u043D\\u0435 \\u043C\\u043E\\u0436\\u043D\\u0430 \\u2014 \\u0442\\u0430\\u043A \\u0441\\u0430\\u043C\\u043E, \\u044F\\u043A \\u0443 ru.json. \\u00A7\\u00A7 63 \\u0456 64 \\u043F\\u0440\\u043E\\u0447\\u0438\\u0442\\u0430\\u043D\\u043E \\u043F\\u043E\\u0432\\u043D\\u0456\\u0441\\u0442\\u044E: \\u00A7 63 \\u043D\\u043E\\u0440\\u043C\\u0443\\u0454 \\u043F\\u043E\\u0434\\u0456\\u043B \\u0437\\u0430 \\u0441\\u043A\\u043B\\u0430\\u0434\\u0430\\u043C\\u0438, \\u00A7 64 \\u0437\\u0430\\u0431\\u043E\\u0440\\u043E\\u043D\\u044F\\u0454 \\u0440\\u043E\\u0437\\u0440\\u0438\\u0432\\u0430\\u0442\\u0438 \\u0456\\u043D\\u0456\\u0446\\u0456\\u0430\\u043B\\u0438, \\u043D\\u0430\\u0437\\u0432\\u0438 \\u043C\\u0456\\u0440, \\u043D\\u0430\\u0440\\u043E\\u0449\\u0435\\u043D\\u043D\\u044F \\u0439 \\u0433\\u0440\\u0430\\u0444\\u0456\\u0447\\u043D\\u0456 \\u0441\\u043A\\u043E\\u0440\\u043E\\u0447\\u0435\\u043D\\u043D\\u044F, \\u0430\\u043B\\u0435 \\u043F\\u0440\\u043E \\u0434\\u0435\\u0444\\u0456\\u0441 \\u0443 \\u0444\\u043E\\u0440\\u043C\\u0430\\u0445 \\u00A7\\u00A7 42 \\u0456 44 \\u043D\\u0435 \\u043A\\u0430\\u0436\\u0435 \\u043D\\u0456\\u0447\\u043E\\u0433\\u043E. \\u041E\\u0442\\u0436\\u0435, \\u0434\\u043B\\u044F \\u0446\\u0438\\u0445 \\u043A\\u043B\\u0430\\u0441\\u0456\\u0432 \\u0437\\u0432'\\u044F\\u0437\\u0443\\u0432\\u0430\\u043D\\u043D\\u044F \\u0447\\u0435\\u0440\\u0435\\u0437 U+2011 \\u2014 \\u0440\\u0456\\u0448\\u0435\\u043D\\u043D\\u044F \\u043F\\u0440\\u043E\\u0454\\u043A\\u0442\\u0443 (docs/PLAN.md \\u00A73.3), \\u0430 \\u043D\\u0435 \\u043E\\u0440\\u0444\\u043E\\u0433\\u0440\\u0430\\u0444\\u0456\\u0447\\u043D\\u0430 \\u043D\\u043E\\u0440\\u043C\\u0430, \\u0456 \\u0446\\u0435 \\u0437\\u0430\\u043F\\u0438\\u0441\\u0430\\u043D\\u043E \\u043F\\u0440\\u044F\\u043C\\u043E. \\u041D\\u0415 \\u0412\\u041D\\u0415\\u0421\\u0415\\u041D\\u041E, \\u0441\\u0432\\u0456\\u0434\\u043E\\u043C\\u043E: \\u00A7 64 \\u043F. 3 (\\u00AB\\u0413\\u0440\\u0430\\u043C\\u0430\\u0442\\u0438\\u0447\\u043D\\u0456 \\u0437\\u0430\\u043A\\u0456\\u043D\\u0447\\u0435\\u043D\\u043D\\u044F, \\u043F\\u043E\\u0454\\u0434\\u043D\\u0430\\u043D\\u0456 \\u0456\\u0437 \\u0446\\u0438\\u0444\\u0440\\u0430\\u043C\\u0438 \\u0434\\u0435\\u0444\\u0456\\u0441\\u043E\\u043C, \\u043D\\u0435 \\u043C\\u043E\\u0436\\u043D\\u0430 \\u0432\\u0456\\u0434\\u0440\\u0438\\u0432\\u0430\\u0442\\u0438 \\u0439 \\u043F\\u0435\\u0440\\u0435\\u043D\\u043E\\u0441\\u0438\\u0442\\u0438: 2-\\u0439, 4-\\u0433\\u043E, 10-\\u043C\\u0443\\u00BB) \\u043D\\u043E\\u0440\\u043C\\u0430\\u0442\\u0438\\u0432\\u043D\\u043E \\u043D\\u0435\\u0440\\u043E\\u0437\\u0440\\u0438\\u0432\\u043D\\u0438\\u0439, \\u0430\\u043B\\u0435 \\u0446\\u0435 \\u0444\\u043E\\u0440\\u043C\\u0430 \\u00AB\\u0446\\u0438\\u0444\\u0440\\u0430-\\u0434\\u0435\\u0444\\u0456\\u0441-\\u043B\\u0456\\u0442\\u0435\\u0440\\u0430\\u00BB; \\u0447\\u0438 \\u0454 \\u0446\\u0435 \\u0447\\u043B\\u0435\\u043D\\u0441\\u0442\\u0432\\u043E\\u043C \\u0443 hyphen.suffixes, \\u0447\\u0438 \\u0432\\u0436\\u0435 \\u0430\\u043B\\u0433\\u043E\\u0440\\u0438\\u0442\\u043C\\u043E\\u043C, \\u043C\\u0430\\u0454 \\u0432\\u0438\\u0440\\u0456\\u0448\\u0438\\u0442\\u0438 spec-guardian. \\u0417\\u0432\\u0456\\u0440\\u0435\\u043D\\u043E 18.09.2026.\" }, { rule: \"nbsp\", cite: \"\\u0423\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u0438\\u0439 \\u043F\\u0440\\u0430\\u0432\\u043E\\u043F\\u0438\\u0441 (2019), \\u00A7 64 \\u00AB\\u0422\\u0435\\u0445\\u043D\\u0456\\u0447\\u043D\\u0456 \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u0430 \\u043F\\u0435\\u0440\\u0435\\u043D\\u043E\\u0441\\u0443\\u00BB, \\u043F. 1: \\u00AB\\u041D\\u0435 \\u043C\\u043E\\u0436\\u043D\\u0430 \\u043F\\u0435\\u0440\\u0435\\u043D\\u043E\\u0441\\u0438\\u0442\\u0438 \\u043F\\u0440\\u0456\\u0437\\u0432\\u0438\\u0449\\u0430, \\u0437\\u0430\\u043B\\u0438\\u0448\\u0430\\u044E\\u0447\\u0438 \\u0432 \\u043A\\u0456\\u043D\\u0446\\u0456 \\u043F\\u043E\\u043F\\u0435\\u0440\\u0435\\u0434\\u043D\\u044C\\u043E\\u0433\\u043E \\u0440\\u044F\\u0434\\u043A\\u0430 \\u0456\\u043D\\u0456\\u0446\\u0456\\u0430\\u043B\\u0438 \\u0430\\u0431\\u043E \\u0456\\u043D\\u0448\\u0456 \\u0443\\u043C\\u043E\\u0432\\u043D\\u0456 \\u0441\\u043A\\u043E\\u0440\\u043E\\u0447\\u0435\\u043D\\u043D\\u044F, \\u0449\\u043E \\u043D\\u0430\\u043B\\u0435\\u0436\\u0430\\u0442\\u044C \\u0434\\u043E \\u043D\\u0438\\u0445: \\u0422. \\u0413. \\u0428\\u0435\\u0432\\u0447\\u0435\\u043D\\u043A\\u043E (\\u043D\\u0435 \\u0422. \\u0413. // \\u0428\\u0435\\u0432\\u0447\\u0435\\u043D\\u043A\\u043E), \\u0433\\u0440. \\u0406\\u0432\\u0430\\u043D\\u0435\\u043D\\u043A\\u043E, \\u0430\\u043A\\u0430\\u0434. (\\u0434\\u043E\\u0446., \\u043F\\u0440\\u043E\\u0444.) \\u0413\\u043E\\u043D\\u0447\\u0430\\u0440\\u0435\\u043D\\u043A\\u043E, \\u043F. \\u0413\\u043D\\u0430\\u0442\\u044E\\u043A\\u00BB; \\u043F. 4: \\u00AB\\u041D\\u0435 \\u043C\\u043E\\u0436\\u043D\\u0430 \\u0440\\u043E\\u0437\\u0440\\u0438\\u0432\\u0430\\u0442\\u0438 \\u0443\\u043C\\u043E\\u0432\\u043D\\u0456 (\\u0433\\u0440\\u0430\\u0444\\u0456\\u0447\\u043D\\u0456) \\u0441\\u043A\\u043E\\u0440\\u043E\\u0447\\u0435\\u043D\\u043D\\u044F \\u043D\\u0430 \\u0437\\u0440\\u0430\\u0437\\u043E\\u043A \\u0432\\u0438\\u0434-\\u0432\\u043E, \\u0456 \\u0442. \\u0434., \\u0456 \\u0442. \\u0456\\u043D., \\u0442\\u0430 \\u0456\\u043D., \\u0442-\\u0432\\u043E \\u0442\\u043E\\u0449\\u043E\\u00BB; \\u043F. 5: \\u00AB\\u041D\\u0435 \\u043C\\u043E\\u0436\\u043D\\u0430 \\u043F\\u0435\\u0440\\u0435\\u043D\\u043E\\u0441\\u0438\\u0442\\u0438 \\u0432 \\u043D\\u0430\\u0441\\u0442\\u0443\\u043F\\u043D\\u0438\\u0439 \\u0440\\u044F\\u0434\\u043E\\u043A \\u0440\\u043E\\u0437\\u0434\\u0456\\u043B\\u043E\\u0432\\u0456 \\u0437\\u043D\\u0430\\u043A\\u0438 (\\u043A\\u0440\\u0456\\u043C \\u0442\\u0438\\u0440\\u0435), \\u0434\\u0443\\u0436\\u043A\\u0443 \\u0430\\u0431\\u043E \\u043B\\u0430\\u043F\\u043A\\u0438, \\u0449\\u043E \\u0437\\u0430\\u043A\\u0440\\u0438\\u0432\\u0430\\u044E\\u0442\\u044C \\u043F\\u043E\\u043F\\u0435\\u0440\\u0435\\u0434\\u043D\\u0456\\u0439 \\u0440\\u044F\\u0434\\u043E\\u043A\\u00BB\", url: \"https://www.ulif.org.ua/system/files/pravopus-new.pdf\", note: \"\\u00A7 64 \\u2014 \\u0417\\u0410\\u041A\\u0420\\u0418\\u0422\\u0418\\u0419 \\u043F\\u0435\\u0440\\u0435\\u043B\\u0456\\u043A \\u0456\\u0437 \\u043F'\\u044F\\u0442\\u0438 \\u043F\\u0443\\u043D\\u043A\\u0442\\u0456\\u0432, \\u0456 \\u0446\\u0435 \\u0432\\u0430\\u0436\\u043B\\u0438\\u0432\\u043E \\u043D\\u0435 \\u043B\\u0438\\u0448\\u0435 \\u0442\\u0438\\u043C, \\u0449\\u043E \\u0432\\u0456\\u043D \\u043C\\u0456\\u0441\\u0442\\u0438\\u0442\\u044C, \\u0430 \\u0439 \\u0442\\u0438\\u043C, \\u0447\\u043E\\u0433\\u043E \\u0432 \\u043D\\u044C\\u043E\\u043C\\u0443 \\u043D\\u0435\\u043C\\u0430\\u0454. (1) initialBinding = \\u00ABchain\\u00BB: \\u043F. 1 \\u043D\\u0430\\u0432\\u043E\\u0434\\u0438\\u0442\\u044C \\u043F\\u043E\\u0441\\u043B\\u0456\\u0434\\u043E\\u0432\\u043D\\u0456\\u0441\\u0442\\u044C \\u0414\\u0412\\u041E\\u0425 \\u0456\\u043D\\u0456\\u0446\\u0456\\u0430\\u043B\\u0456\\u0432 \\u0456 \\u043D\\u0435 \\u0434\\u0430\\u0454 \\u043F\\u0440\\u0438\\u043A\\u043B\\u0430\\u0434\\u0443 \\u043E\\u0434\\u043D\\u043E\\u0433\\u043E \\u0456\\u043D\\u0456\\u0446\\u0456\\u0430\\u043B\\u0430 \\u043F\\u0435\\u0440\\u0435\\u0434 \\u043F\\u0440\\u0456\\u0437\\u0432\\u0438\\u0449\\u0435\\u043C. (2) beforeWord: \\u0437 \\u043F. 1 \\u0432\\u0437\\u044F\\u0442\\u043E \\u043B\\u0438\\u0448\\u0435 \\u00AB\\u0430\\u043A\\u0430\\u0434.\\u00BB, \\u00AB\\u0434\\u043E\\u0446.\\u00BB, \\u00AB\\u043F\\u0440\\u043E\\u0444.\\u00BB. \\u00AB\\u043F.\\u00BB \\u0456 \\u00AB\\u0433\\u0440.\\u00BB \\u0441\\u0432\\u0456\\u0434\\u043E\\u043C\\u043E \\u041D\\u0415 \\u0432\\u043D\\u0435\\u0441\\u0435\\u043D\\u043E \\u0437\\u0430 \\u0442\\u0456\\u0454\\u044E \\u0441\\u0430\\u043C\\u043E\\u044E \\u0434\\u0438\\u0441\\u0446\\u0438\\u043F\\u043B\\u0456\\u043D\\u043E\\u044E, \\u0437 \\u044F\\u043A\\u043E\\u0457 ru.json \\u0432\\u0438\\u043A\\u043B\\u044E\\u0447\\u0430\\u0454 \\u00AB\\u0433.\\u00BB: \\u00AB\\u043F.\\u00BB \\u2014 \\u0446\\u0435 \\u0442\\u0430\\u043A\\u043E\\u0436 \\u00AB\\u043F\\u0443\\u043D\\u043A\\u0442\\u00BB (\\u00AB\\u043F. 3\\u00BB), \\u00AB\\u0433\\u0440.\\u00BB \\u2014 \\u0442\\u0430\\u043A\\u043E\\u0436 \\u00AB\\u0433\\u0440\\u0430\\u0434\\u0443\\u0441\\u00BB \\u0456 \\u00AB\\u0433\\u0440\\u0430\\u0444\\u0430\\u00BB, \\u0430 \\u043B\\u0456\\u0442\\u0435\\u0440\\u0430\\u043B\\u044C\\u043D\\u0438\\u0439 \\u0441\\u043F\\u0438\\u0441\\u043E\\u043A \\u0446\\u0438\\u0445 \\u043D\\u0430\\u043F\\u0440\\u044F\\u043C\\u043A\\u0456\\u0432 \\u043D\\u0435 \\u0440\\u043E\\u0437\\u0440\\u0456\\u0437\\u043D\\u044F\\u0454. (3) beforePunctuation \\u0456 narrowBeforePunctuation \\u043F\\u043E\\u0440\\u043E\\u0436\\u043D\\u0456: \\u043F. 5 \\u043F\\u0440\\u0438\\u0432'\\u044F\\u0437\\u0443\\u0454 \\u0440\\u043E\\u0437\\u0434\\u0456\\u043B\\u043E\\u0432\\u0438\\u0439 \\u0437\\u043D\\u0430\\u043A \\u0434\\u043E \\u041F\\u041E\\u041F\\u0415\\u0420\\u0415\\u0414\\u041D\\u042C\\u041E\\u0413\\u041E \\u0441\\u043B\\u043E\\u0432\\u0430 \\u2014 \\u0446\\u0435 \\u0437\\u0430\\u043F\\u0435\\u0440\\u0435\\u0447\\u0435\\u043D\\u043D\\u044F, \\u0430 \\u043D\\u0435 \\u043C\\u043E\\u0432\\u0447\\u0430\\u043D\\u043D\\u044F. (4) afterShortWords \\u041F\\u041E\\u0420\\u041E\\u0416\\u041D\\u0406\\u0419, \\u0456 \\u0446\\u0435 \\u043F\\u0456\\u0434\\u0442\\u0432\\u0435\\u0440\\u0434\\u0436\\u0435\\u043D\\u0430 \\u0432\\u0456\\u0434\\u0441\\u0443\\u0442\\u043D\\u0456\\u0441\\u0442\\u044C \\u043D\\u043E\\u0440\\u043C\\u0438: \\u043F\\u0435\\u0440\\u0435\\u043B\\u0456\\u043A \\u00A7 64 \\u0437\\u0430\\u043A\\u0440\\u0438\\u0442\\u0438\\u0439, \\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u0430 \\u043F\\u0440\\u043E \\u043E\\u0434\\u043D\\u043E\\u0431\\u0443\\u043A\\u0432\\u0435\\u043D\\u0456 \\u043F\\u0440\\u0438\\u0439\\u043C\\u0435\\u043D\\u043D\\u0438\\u043A\\u0438 \\u0432 \\u043D\\u044C\\u043E\\u043C\\u0443 \\u043D\\u0435\\u043C\\u0430\\u0454, \\u0430 \\u0432 \\u0441\\u0430\\u043C\\u043E\\u043C\\u0443 \\u043F\\u0440\\u0430\\u0432\\u043E\\u043F\\u0438\\u0441\\u0456 \\u00AB\\u0456\\u00BB, \\u00AB\\u0443\\u00BB, \\u00AB\\u0432\\u00BB, \\u00AB\\u0437\\u00BB \\u0440\\u0435\\u0433\\u0443\\u043B\\u044F\\u0440\\u043D\\u043E \\u0441\\u0442\\u043E\\u044F\\u0442\\u044C \\u0443 \\u043A\\u0456\\u043D\\u0446\\u0456 \\u0440\\u044F\\u0434\\u043A\\u0430. \\u0421\\u043F\\u0438\\u0441\\u043E\\u043A ru.json \\u0441\\u044E\\u0434\\u0438 \\u041D\\u0415 \\u043F\\u0435\\u0440\\u0435\\u043D\\u043E\\u0441\\u0438\\u0442\\u044C\\u0441\\u044F \\u0437\\u0430 \\u0430\\u043D\\u0430\\u043B\\u043E\\u0433\\u0456\\u0454\\u044E, \\u0445\\u043E\\u0447\\u0430 \\u043C\\u043E\\u0432\\u0438 \\u0441\\u043F\\u043E\\u0440\\u0456\\u0434\\u043D\\u0435\\u043D\\u0456. (5) afterSymbols \\u0456 beforeNumber \\u043F\\u043E\\u0440\\u043E\\u0436\\u043D\\u0456: \\u043A\\u043E\\u043D\\u0441\\u0442\\u0440\\u0443\\u043A\\u0446\\u0456\\u0439 \\u00AB\\u0441\\u0438\\u043C\\u0432\\u043E\\u043B + \\u0447\\u0438\\u0441\\u043B\\u043E\\u00BB \\u0456 \\u00AB\\u0441\\u043A\\u043E\\u0440\\u043E\\u0447\\u0435\\u043D\\u043D\\u044F + \\u0447\\u0438\\u0441\\u043B\\u043E\\u00BB \\u00A7 64 \\u043D\\u0435 \\u043C\\u0456\\u0441\\u0442\\u0438\\u0442\\u044C. \\u0417\\u0432\\u0456\\u0440\\u0435\\u043D\\u043E 18.09.2026.\" }, { rule: \"nbsp\", cite: \"\\u0423\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u0438\\u0439 \\u043F\\u0440\\u0430\\u0432\\u043E\\u043F\\u0438\\u0441 (2019), \\u00A7 64, \\u043F. 2: \\u00AB\\u041D\\u0435 \\u043C\\u043E\\u0436\\u043D\\u0430 \\u0432\\u0456\\u0434\\u0440\\u0438\\u0432\\u0430\\u0442\\u0438 \\u0441\\u043A\\u043E\\u0440\\u043E\\u0447\\u0435\\u043D\\u0456 \\u043D\\u0430\\u0437\\u0432\\u0438 \\u043C\\u0456\\u0440 \\u0432\\u0456\\u0434 \\u0446\\u0438\\u0444\\u0440, \\u0434\\u043E \\u044F\\u043A\\u0438\\u0445 \\u0432\\u043E\\u043D\\u0438 \\u043D\\u0430\\u043B\\u0435\\u0436\\u0430\\u0442\\u044C: 2008 \\u0440. (\\u043D\\u0435 2008 // \\u0440.), 150 \\u0433\\u0430 (\\u043D\\u0435 150 // \\u0433\\u0430), 20 \\u0441\\u043C\\u00B3 \\u0430\\u0431\\u043E 20 \\u043A\\u0443\\u0431. \\u0441\\u043C, 5 \\u0433 (\\u043D\\u0435 5 // \\u0433)\\u00BB; \\u00A7 62: \\u00AB\\u0421\\u043A\\u043E\\u0440\\u043E\\u0447\\u0435\\u043D\\u0456 \\u043D\\u0430\\u0437\\u0432\\u0438 \\u043E\\u0434\\u0438\\u043D\\u0438\\u0446\\u044C \\u0432\\u0438\\u043C\\u0456\\u0440\\u044E\\u0432\\u0430\\u043D\\u043D\\u044F \\u043F\\u0438\\u0448\\u0435\\u043C\\u043E \\u0431\\u0435\\u0437 \\u043A\\u0440\\u0430\\u043F\\u043E\\u043A: \\u0411 \\u2014 \\u0431\\u0430\\u0439\\u0442, \\u0412\\u0442 \\u2014 \\u0432\\u0430\\u0442, \\u0433 \\u2014 \\u0433\\u0440\\u0430\\u043C, \\u0433\\u0430 \\u2014 \\u0433\\u0435\\u043A\\u0442\\u0430\\u0440, \\u0433\\u043E\\u0434 \\u2014 \\u0433\\u043E\\u0434\\u0438\\u043D\\u0430, \\u0434\\u043C \\u2014 \\u0434\\u0435\\u0446\\u0438\\u043C\\u0435\\u0442\\u0440, \\u043A\\u0411 \\u2014 \\u043A\\u0456\\u043B\\u043E\\u0431\\u0430\\u0439\\u0442, \\u043A\\u0412\\u0442 \\u2014 \\u043A\\u0456\\u043B\\u043E\\u0432\\u0430\\u0442, \\u043A\\u0433 \\u2014 \\u043A\\u0456\\u043B\\u043E\\u0433\\u0440\\u0430\\u043C, \\u043A\\u043C \\u2014 \\u043A\\u0456\\u043B\\u043E\\u043C\\u0435\\u0442\\u0440, \\u043B \\u2014 \\u043B\\u0456\\u0442\\u0440, \\u043C \\u2014 \\u043C\\u0435\\u0442\\u0440, \\u043C\\u043C \\u2014 \\u043C\\u0456\\u043B\\u0456\\u043C\\u0435\\u0442\\u0440, \\u0441 \\u2014 \\u0441\\u0435\\u043A\\u0443\\u043D\\u0434\\u0430, \\u0441\\u043C \\u2014 \\u0441\\u0430\\u043D\\u0442\\u0438\\u043C\\u0435\\u0442\\u0440, \\u0442 \\u2014 \\u0442\\u043E\\u043D\\u043D\\u0430, \\u0445\\u0432 \\u2014 \\u0445\\u0432\\u0438\\u043B\\u0438\\u043D\\u0430, \\u0446 \\u2014 \\u0446\\u0435\\u043D\\u0442\\u043D\\u0435\\u0440\\u00BB; BIPM, The International System of Units (SI), 9th ed., concise summary: \\u00ABA single space is always left between the number and the unit\\u00BB\", url: \"https://www.bipm.org/documents/20126/41483022/SI-Brochure-9-concise-EN.pdf\", note: \"\\u0420\\u043E\\u0437\\u043F\\u043E\\u0434\\u0456\\u043B \\u0440\\u043E\\u043B\\u0435\\u0439 \\u0442\\u0443\\u0442 \\u0406\\u041D\\u0428\\u0418\\u0419, \\u043D\\u0456\\u0436 \\u0443 pl, fi, sv \\u0456 en-US: \\u0442\\u0430\\u043C BIPM \\u0434\\u0430\\u0454 \\u043F\\u0435\\u0440\\u0435\\u043B\\u0456\\u043A \\u0441\\u0438\\u043C\\u0432\\u043E\\u043B\\u0456\\u0432, \\u0430 \\u043D\\u0430\\u0446\\u0456\\u043E\\u043D\\u0430\\u043B\\u044C\\u043D\\u0435 \\u0434\\u0436\\u0435\\u0440\\u0435\\u043B\\u043E \\u2014 \\u043A\\u043E\\u043D\\u0432\\u0435\\u043D\\u0446\\u0456\\u044E \\u0432\\u0456\\u0434\\u0441\\u0442\\u0443\\u043F\\u0443; \\u0434\\u043B\\u044F \\u0443\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u043E\\u0457 \\u043D\\u0430\\u0446\\u0456\\u043E\\u043D\\u0430\\u043B\\u044C\\u043D\\u0435 \\u0434\\u0436\\u0435\\u0440\\u0435\\u043B\\u043E \\u0434\\u0430\\u0454 \\u0456 \\u0442\\u0435, \\u0456 \\u0442\\u0435, \\u0431\\u043E \\u00A7 64 \\u043F. 2 \\u043D\\u043E\\u0440\\u043C\\u0443\\u0454 \\u0441\\u0430\\u043C\\u0435 \\u043D\\u0435\\u0432\\u0456\\u0434\\u0440\\u0438\\u0432\\u043D\\u0456\\u0441\\u0442\\u044C. BIPM \\u043D\\u0430\\u0432\\u0435\\u0434\\u0435\\u043D\\u043E \\u044F\\u043A \\u043F\\u0456\\u0434\\u0442\\u0432\\u0435\\u0440\\u0434\\u0436\\u0435\\u043D\\u043D\\u044F \\u0437\\u0430\\u0433\\u0430\\u043B\\u044C\\u043D\\u043E\\u0433\\u043E \\u043F\\u0440\\u0438\\u043D\\u0446\\u0438\\u043F\\u0443, \\u0430 \\u043D\\u0435 \\u044F\\u043A \\u043D\\u0435\\u0441\\u0443\\u0447\\u0430 \\u0446\\u0438\\u0442\\u0430\\u0442\\u0430. \\u041E\\u0434\\u043D\\u043E\\u0431\\u0443\\u043A\\u0432\\u0435\\u043D\\u0456 \\u043F\\u043E\\u0437\\u043D\\u0430\\u0447\\u0435\\u043D\\u043D\\u044F (\\u0433, \\u043B, \\u043C, \\u0441, \\u0442, \\u0446, \\u0411) \\u0441\\u0432\\u0456\\u0434\\u043E\\u043C\\u043E \\u043F\\u0440\\u043E\\u043F\\u0443\\u0449\\u0435\\u043D\\u043E: \\u043F\\u0440\\u0430\\u0432\\u0438\\u0439 \\u043A\\u043E\\u0440\\u0434\\u043E\\u043D N5 \\u0432\\u0438\\u043C\\u0430\\u0433\\u0430\\u0454 \\u043B\\u0438\\u0448\\u0435, \\u0449\\u043E\\u0431 cp[a+k] \\u043D\\u0435 \\u043D\\u0430\\u043B\\u0435\\u0436\\u0430\\u0432 ALNUM, \\u0456 \\u043F\\u0440\\u043E\\u0431\\u0456\\u043B \\u0446\\u044E \\u0443\\u043C\\u043E\\u0432\\u0443 \\u0437\\u0430\\u0434\\u043E\\u0432\\u043E\\u043B\\u044C\\u043D\\u044F\\u0454, \\u0442\\u043E\\u0436 \\u043E\\u0434\\u043D\\u043E\\u0431\\u0443\\u043A\\u0432\\u0435\\u043D\\u0438\\u0439 \\u0437\\u0430\\u043F\\u0438\\u0441 \\u0437\\u0432'\\u044F\\u0437\\u0443\\u0432\\u0430\\u0432 \\u0431\\u0438 \\u0437\\u0432\\u0438\\u0447\\u0430\\u0439\\u043D\\u0443 \\u043F\\u0440\\u043E\\u0437\\u0443. \\u00AB\\u0440.\\u00BB \\u0432\\u043D\\u0435\\u0441\\u0435\\u043D\\u043E: \\u043D\\u0430 \\u0432\\u0456\\u0434\\u043C\\u0456\\u043D\\u0443 \\u0432\\u0456\\u0434 \\u0440\\u043E\\u0441\\u0456\\u0439\\u0441\\u044C\\u043A\\u043E\\u0433\\u043E \\u00AB\\u0433.\\u00BB, \\u0443\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u0435 \\u00AB\\u0440.\\u00BB \\u043E\\u0437\\u043D\\u0430\\u0447\\u0430\\u0454 \\u0442\\u0456\\u043B\\u044C\\u043A\\u0438 \\u00AB\\u0440\\u0456\\u043A\\u00BB \\u0456 \\u0437\\u0432'\\u044F\\u0437\\u0443\\u0454\\u0442\\u044C\\u0441\\u044F \\u0432\\u043B\\u0456\\u0432\\u043E \\u043F\\u0456\\u0441\\u043B\\u044F \\u0447\\u0438\\u0441\\u043B\\u0430. \\u00AB%\\u00BB \\u0432\\u043D\\u0435\\u0441\\u0435\\u043D\\u043E \\u042F\\u041A \\u0420\\u0406\\u0428\\u0415\\u041D\\u041D\\u042F, \\u0430 \\u043D\\u0435 \\u044F\\u043A \\u0446\\u0438\\u0442\\u0430\\u0442\\u0430: \\u0439\\u043E\\u0433\\u043E \\u043D\\u0435\\u043C\\u0430\\u0454 \\u043D\\u0456 \\u0432 \\u00A7 62, \\u043D\\u0456 \\u0432 \\u00A7 64, \\u043D\\u0456 \\u0432 \\u0441\\u043A\\u043E\\u0440\\u043E\\u0447\\u0435\\u043D\\u043E\\u043C\\u0443 \\u0432\\u0438\\u043A\\u043B\\u0430\\u0434\\u0456 \\u0431\\u0440\\u043E\\u0448\\u0443\\u0440\\u0438 BIPM (\\u043F\\u0440\\u0430\\u0432\\u0438\\u043B\\u043E \\u043F\\u0440\\u043E % \\u2014 \\u0443 \\u00A7 5.4.7 \\u043F\\u043E\\u0432\\u043D\\u043E\\u0433\\u043E \\u0432\\u0438\\u0434\\u0430\\u043D\\u043D\\u044F, \\u044F\\u043A\\u0435 \\u043D\\u0435 \\u0434\\u0456\\u0441\\u0442\\u0430\\u0432\\u0430\\u043B\\u043E\\u0441\\u044F), \\u0430\\u043B\\u0435 \\u0432\\u0456\\u0434\\u0431\\u0438\\u0432\\u043A\\u0430 \\u0432\\u0456\\u0434\\u0441\\u043E\\u0442\\u043A\\u0430 \\u0432\\u0456\\u0434 \\u0447\\u0438\\u0441\\u043B\\u0430 \\u0454 \\u0456 \\u0432 \\u0440\\u043E\\u0441\\u0456\\u0439\\u0441\\u044C\\u043A\\u0456\\u0439 \\u043B\\u043E\\u043A\\u0430\\u043B\\u0456, \\u0456 \\u0432 \\u0443\\u0441\\u0456\\u0445 \\u0456\\u043D\\u0448\\u0438\\u0445 \\u043B\\u043E\\u043A\\u0430\\u043B\\u044F\\u0445 \\u0446\\u044C\\u043E\\u0433\\u043E \\u043F\\u0440\\u043E\\u0454\\u043A\\u0442\\u0443, \\u0430 \\u0440\\u043E\\u0437\\u0431\\u0456\\u0436\\u043D\\u0456\\u0441\\u0442\\u044C \\u0442\\u0443\\u0442 \\u0434\\u0430\\u043B\\u0430 \\u0431 \\u0443\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u0456\\u0439 \\u0432\\u0443\\u0436\\u0447\\u0443 \\u043F\\u043E\\u0432\\u0435\\u0434\\u0456\\u043D\\u043A\\u0443 \\u0431\\u0435\\u0437 \\u0436\\u043E\\u0434\\u043D\\u043E\\u0457 \\u043F\\u0456\\u0434\\u0441\\u0442\\u0430\\u0432\\u0438 \\u0432 \\u0434\\u0436\\u0435\\u0440\\u0435\\u043B\\u0456. \\u0417\\u0432\\u0456\\u0440\\u0435\\u043D\\u043E 18.09.2026.\" }] },\n};\n","import { ALIASES, KNOWN_LOCALES, LOCALES } from \"../generated/locales.js\";\nimport { fromCodePoints, toCodePoints } from \"./codepoints.js\";\nimport { PolytypoError } from \"../errors.js\";\nimport type { LocaleData } from \"../types.js\";\n\nconst HYPHEN = 0x2d;\nconst UNDERSCORE = 0x5f;\nconst UPPER_A = 0x41;\nconst UPPER_Z = 0x5a;\nconst LOWER_A = 0x61;\nconst LOWER_Z = 0x7a;\nconst CASE_GAP = 0x20;\n\n/** Names the offending value without interpolating an object that may throw in `toString`. */\nfunction describe(value: unknown): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n return typeof value;\n}\n\nfunction isLowerAscii(cp: number | undefined): boolean {\n return cp !== undefined && cp >= LOWER_A && cp <= LOWER_Z;\n}\n\nfunction isUpperAscii(cp: number | undefined): boolean {\n return cp !== undefined && cp >= UPPER_A && cp <= UPPER_Z;\n}\n\n/**\n * spec/rules/locale-resolution.md 3.2. ASCII arithmetic only: no toLowerCase, no toUpperCase,\n * no ICU, no host locale, so a Turkish process resolves `EN-us` exactly as a Finnish one does\n * (ARCHITECTURE.md 4.4).\n */\nfunction canonicalize(tag: string): number[] {\n const c = toCodePoints(tag).map((cp) => (cp === UNDERSCORE ? HYPHEN : cp));\n const m = c.length;\n if (m >= 2) {\n for (const j of [0, 1]) {\n if (isUpperAscii(c[j])) c[j] = (c[j] as number) + CASE_GAP;\n }\n }\n if (m === 5 && c[2] === HYPHEN) {\n for (const j of [3, 4]) {\n if (isLowerAscii(c[j])) c[j] = (c[j] as number) - CASE_GAP;\n }\n }\n return c;\n}\n\n/**\n * spec/rules/locale-resolution.md 3.3. Exactly two accepted shapes, tested by index rather\n * than by pattern (ARCHITECTURE.md 4.1). Everything else — `eng`, `sr-Latn`, `es-419`,\n * `de-`, `en-US-POSIX`, `und` — is malformed and throws like any unknown tag.\n */\nfunction hasAcceptedShape(c: readonly number[]): boolean {\n if (c.length === 2) return isLowerAscii(c[0]) && isLowerAscii(c[1]);\n if (c.length === 5) {\n return (\n isLowerAscii(c[0]) &&\n isLowerAscii(c[1]) &&\n c[2] === HYPHEN &&\n isUpperAscii(c[3]) &&\n isUpperAscii(c[4])\n );\n }\n return false;\n}\n\n/** Alias values are concrete locales by registry invariant (locale-resolution.md 2). */\nfunction aliasTarget(tag: string): string | undefined {\n const target = Object.prototype.hasOwnProperty.call(ALIASES, tag) ? ALIASES[tag] : undefined;\n if (target === undefined) return undefined;\n if (!KNOWN_LOCALES.includes(target)) {\n throw new PolytypoError(\n \"POLYTYPO_MALFORMED_LOCALE_DATA\",\n `Registry alias \"${tag}\" points at \"${target}\", which is not a declared locale.`,\n );\n }\n return target;\n}\n\nfunction lookup(tag: string): string | undefined {\n // Exact before alias, so a registry that wrongly lists a tag in both cannot make lookup\n // order observable (locale-resolution.md 3.4).\n if (KNOWN_LOCALES.includes(tag)) return tag;\n return aliasTarget(tag);\n}\n\n/**\n * Exact match, then the registry alias table, then the language subtag alone — once, with no\n * chain. Never Intl, never a platform locale negotiator: those disagree across runtimes and\n * several of them return a best-effort match for a language they have never heard of\n * (ARCHITECTURE.md 4.7, locale-resolution.md 1).\n */\n/** `tag` is typed `unknown`: it comes straight from the caller and is validated here, at the boundary. */\nexport function resolveLocaleTag(tag: unknown): string {\n // locale-resolution.md 3.1 step 1: absent, null or empty throws the coded error like any\n // other unresolvable tag. `locale: string` is a compile-time claim; a plain-JS caller can\n // pass anything, and a native TypeError is not in the error taxonomy (ARCHITECTURE.md 4.6),\n // so a port following 3.1 would fail differently on the same input.\n // An empty string needs no branch here: it has no accepted shape and falls through below.\n if (typeof tag !== \"string\") {\n throw new PolytypoError(\n \"POLYTYPO_UNKNOWN_LOCALE\",\n `The \\`locale\\` option is required and must be a string; received ${describe(tag)}.`,\n );\n }\n const c = canonicalize(tag);\n if (hasAcceptedShape(c)) {\n const canonical = fromCodePoints(c);\n const direct = lookup(canonical);\n if (direct !== undefined) return direct;\n if (c.length === 5) {\n const base = lookup(fromCodePoints(c.slice(0, 2)));\n if (base !== undefined) return base;\n }\n }\n throw new PolytypoError(\n \"POLYTYPO_UNKNOWN_LOCALE\",\n `Unknown locale \"${tag}\". Known locales: ${KNOWN_LOCALES.join(\", \")}.`,\n );\n}\n\nexport function getLocaleData(tag: unknown): LocaleData {\n const resolved = resolveLocaleTag(tag);\n const data = Object.prototype.hasOwnProperty.call(LOCALES, resolved)\n ? LOCALES[resolved]\n : undefined;\n if (data === undefined) {\n throw new PolytypoError(\n \"POLYTYPO_MALFORMED_LOCALE_DATA\",\n `Locale \"${resolved}\" is declared in the registry but no locale data was generated. Run \\`npm run gen\\`.`,\n );\n }\n return data;\n}\n\nexport { KNOWN_LOCALES };\n","import { PolytypoError } from \"../errors.js\";\nimport type { NarrowNbsp } from \"../types.js\";\n\n/** U+202F, the narrow no-break space — nbsp.md §3.1a's default NARROW-TARGET. */\nexport const NARROW_NO_BREAK_SPACE = 0x202f;\n/** U+00A0, what `narrowNbsp: \"nbsp\"` substitutes for it. */\nexport const NO_BREAK_SPACE = 0x00a0;\n\n/**\n * nbsp.md §3.1a: resolve the `narrowNbsp` option to the code point the rule writes. Done once,\n * at the call boundary, so no rule ever sees the option's string.\n *\n * Checked immediately after `mode` and before `rules` — the two checks that read nothing but the\n * call itself come first (nbsp.md §3.1a). It runs whether or not `nbsp` is enabled, so a\n * misspelled value still raises rather than being silently ignored.\n */\nexport function resolveNarrowTarget(value: NarrowNbsp | undefined): number {\n if (value === undefined || value === \"narrow\") return NARROW_NO_BREAK_SPACE;\n if (value === \"nbsp\") return NO_BREAK_SPACE;\n throw new PolytypoError(\n \"POLYTYPO_INVALID_OPTION\",\n `Unknown narrowNbsp ${JSON.stringify(value)}. Expected \"narrow\" or \"nbsp\".`,\n );\n}\n","[\n 65, 90, 97, 122, 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740,\n 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 895, 895, 902, 902, 904, 906, 908, 908, 910,\n 929, 931, 1013, 1015, 1153, 1155, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1425, 1469, 1471,\n 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1519, 1522, 1552, 1562, 1568, 1631, 1646,\n 1747, 1749, 1756, 1759, 1768, 1770, 1775, 1786, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1994,\n 2037, 2042, 2042, 2045, 2045, 2048, 2093, 2112, 2139, 2144, 2154, 2160, 2183, 2185, 2191, 2199,\n 2273, 2275, 2403, 2417, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486,\n 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2544, 2545, 2556,\n 2556, 2558, 2558, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\n 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654,\n 2654, 2672, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741,\n 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2809, 2815, 2817, 2819, 2821,\n 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891,\n 2893, 2901, 2903, 2908, 2909, 2911, 2915, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962,\n 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014,\n 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3072, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3132,\n 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3162, 3164, 3165, 3168, 3171, 3200, 3203, 3205,\n 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\n 3286, 3292, 3294, 3296, 3299, 3313, 3315, 3328, 3340, 3342, 3344, 3346, 3396, 3398, 3400, 3402,\n 3406, 3412, 3415, 3423, 3427, 3450, 3455, 3457, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517,\n 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648,\n 3662, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3773, 3776, 3780, 3782,\n 3782, 3784, 3790, 3804, 3807, 3840, 3840, 3864, 3865, 3893, 3893, 3895, 3895, 3897, 3897, 3902,\n 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4159, 4176, 4239, 4250,\n 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\n 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802,\n 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5109, 5112,\n 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5873, 5880, 5888, 5909, 5919, 5940, 5952,\n 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6155, 6157, 6159,\n 6159, 6176, 6264, 6272, 6314, 6320, 6389, 6400, 6430, 6432, 6443, 6448, 6459, 6480, 6509, 6512,\n 6516, 6528, 6571, 6576, 6601, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6783, 6823, 6823, 6832,\n 6877, 6880, 6891, 6912, 6988, 7019, 7027, 7040, 7087, 7098, 7155, 7168, 7223, 7245, 7247, 7258,\n 7293, 7296, 7306, 7312, 7354, 7357, 7359, 7376, 7378, 7380, 7418, 7424, 7957, 7960, 7965, 7968,\n 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118,\n 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182,\n 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\n 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\n 8521, 8526, 8526, 8579, 8580, 11264, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565,\n 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704,\n 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293,\n 12294, 12330, 12335, 12337, 12341, 12347, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\n 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12735, 12784, 12799, 13312, 19903, 19968,\n 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42610, 42612, 42621, 42623,\n 42725, 42736, 42737, 42775, 42783, 42786, 42888, 42891, 42972, 42993, 43047, 43052, 43052, 43072,\n 43123, 43136, 43205, 43232, 43255, 43259, 43259, 43261, 43263, 43274, 43309, 43312, 43347, 43360,\n 43388, 43392, 43456, 43471, 43471, 43488, 43503, 43514, 43518, 43520, 43574, 43584, 43597, 43616,\n 43638, 43642, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793,\n 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43881, 43888, 44010, 44012, 44013, 44032,\n 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285,\n 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467,\n 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65071, 65136, 65140, 65142,\n 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498,\n 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664,\n 65786, 66045, 66045, 66176, 66204, 66208, 66256, 66272, 66272, 66304, 66335, 66349, 66368, 66370,\n 66377, 66384, 66426, 66432, 66461, 66464, 66499, 66504, 66511, 66560, 66717, 66736, 66771, 66776,\n 66811, 66816, 66855, 66864, 66915, 66928, 66938, 66940, 66954, 66956, 66962, 66964, 66965, 66967,\n 66977, 66979, 66993, 66995, 67001, 67003, 67004, 67008, 67059, 67072, 67382, 67392, 67413, 67424,\n 67431, 67456, 67461, 67463, 67504, 67506, 67514, 67584, 67589, 67592, 67592, 67594, 67637, 67639,\n 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840,\n 67861, 67872, 67897, 67904, 67929, 67968, 68023, 68030, 68031, 68096, 68099, 68101, 68102, 68108,\n 68115, 68117, 68119, 68121, 68149, 68152, 68154, 68159, 68159, 68192, 68220, 68224, 68252, 68288,\n 68295, 68297, 68326, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736,\n 68786, 68800, 68850, 68864, 68903, 68938, 68965, 68969, 68973, 68975, 68997, 69248, 69289, 69291,\n 69292, 69296, 69297, 69314, 69319, 69370, 69404, 69415, 69415, 69424, 69456, 69488, 69509, 69552,\n 69572, 69600, 69622, 69632, 69702, 69744, 69749, 69759, 69818, 69826, 69826, 69840, 69864, 69888,\n 69940, 69956, 69959, 69968, 70003, 70006, 70006, 70016, 70084, 70089, 70092, 70094, 70095, 70106,\n 70106, 70108, 70108, 70144, 70161, 70163, 70199, 70206, 70209, 70272, 70278, 70280, 70280, 70282,\n 70285, 70287, 70301, 70303, 70312, 70320, 70378, 70400, 70403, 70405, 70412, 70415, 70416, 70419,\n 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70459, 70468, 70471, 70472, 70475, 70477, 70480,\n 70480, 70487, 70487, 70493, 70499, 70502, 70508, 70512, 70516, 70528, 70537, 70539, 70539, 70542,\n 70542, 70544, 70581, 70583, 70592, 70594, 70594, 70597, 70597, 70599, 70602, 70604, 70611, 70625,\n 70626, 70656, 70730, 70750, 70753, 70784, 70853, 70855, 70855, 71040, 71093, 71096, 71104, 71128,\n 71133, 71168, 71232, 71236, 71236, 71296, 71352, 71424, 71450, 71453, 71467, 71488, 71494, 71680,\n 71738, 71840, 71903, 71935, 71942, 71945, 71945, 71948, 71955, 71957, 71958, 71960, 71989, 71991,\n 71992, 71995, 72003, 72096, 72103, 72106, 72151, 72154, 72161, 72163, 72164, 72192, 72254, 72263,\n 72263, 72272, 72345, 72349, 72349, 72368, 72440, 72544, 72551, 72640, 72672, 72704, 72712, 72714,\n 72758, 72760, 72768, 72818, 72847, 72850, 72871, 72873, 72886, 72960, 72966, 72968, 72969, 72971,\n 73014, 73018, 73018, 73020, 73021, 73023, 73031, 73056, 73061, 73063, 73064, 73066, 73102, 73104,\n 73105, 73107, 73112, 73136, 73179, 73440, 73462, 73472, 73488, 73490, 73530, 73534, 73538, 73562,\n 73562, 73648, 73648, 73728, 74649, 74880, 75075, 77712, 77808, 77824, 78895, 78912, 78933, 78944,\n 82938, 82944, 83526, 90368, 90415, 92160, 92728, 92736, 92766, 92784, 92862, 92880, 92909, 92912,\n 92916, 92928, 92982, 92992, 92995, 93027, 93047, 93053, 93071, 93504, 93548, 93760, 93823, 93856,\n 93880, 93883, 93907, 93952, 94026, 94031, 94087, 94095, 94111, 94176, 94177, 94179, 94180, 94192,\n 94195, 94208, 101589, 101631, 101662, 101760, 101874, 110576, 110579, 110581, 110587, 110589,\n 110590, 110592, 110882, 110898, 110898, 110928, 110930, 110933, 110933, 110948, 110951, 110960,\n 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 113821, 113822, 118528,\n 118573, 118576, 118598, 119141, 119145, 119149, 119154, 119163, 119170, 119173, 119179, 119210,\n 119213, 119362, 119364, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973,\n 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071,\n 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134,\n 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572,\n 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746,\n 120770, 120772, 120779, 121344, 121398, 121403, 121452, 121461, 121461, 121476, 121476, 121499,\n 121503, 121505, 121519, 122624, 122654, 122661, 122666, 122880, 122886, 122888, 122904, 122907,\n 122913, 122915, 122916, 122918, 122922, 122928, 122989, 123023, 123023, 123136, 123180, 123184,\n 123197, 123214, 123214, 123536, 123566, 123584, 123631, 124112, 124143, 124368, 124400, 124608,\n 124638, 124640, 124661, 124670, 124671, 124896, 124902, 124904, 124907, 124909, 124910, 124912,\n 124926, 124928, 125124, 125136, 125142, 125184, 125259, 126464, 126467, 126469, 126495, 126497,\n 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523,\n 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545,\n 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559,\n 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585,\n 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635,\n 126651, 131072, 173791, 173824, 178205, 178208, 183981, 183984, 191456, 191472, 192093, 194560,\n 195101, 196608, 201546, 201552, 210041, 917760, 917999\n]\n","// Shared Unicode general-category data for the rule engine.\n//\n// Unicode version: the table below is a DERIVED artifact, generated from the V8 UCD of the\n// machine that produced it (Node 22.23.2 / Unicode 17.0, confirmed by\n// tests/engine/unicode.test.ts, which re-checks every range boundary against the host\n// runtime). The spec does not yet pin a UCD version — spec/UNICODE does not exist and\n// spec/rules/apostrophe.md 7 and nbsp.md 7 both record the gap — so two runtimes built\n// against different UCD releases can still disagree on newly assigned code points. The test\n// turns that from a silent output change into a red build; the pin itself is a spec change.\n//\n// A table rather than `\\p{L}`: RE2 (Go) has no Unicode property parity with PCRE, so a rule\n// may not depend on the host regex engine (ARCHITECTURE.md 4.1).\n//\n// The table itself lives in ./letter-ranges.json, not inline, so that build tooling outside\n// src/ (scripts/validate-spec.mjs, scripts/gen-locales.mjs — plain .mjs, run without a TS\n// build step, so they cannot import this file directly) can read the identical data by\n// re-parsing the same JSON rather than maintaining a second copy that could drift from this\n// one. Both sides implement the same binary search independently; only the data is shared.\n\nimport letterRanges from \"./letter-ranges.json\" with { type: \"json\" };\n\n/**\n * Unicode general categories Lu, Ll, Lt, Lm, Lo, Mn, Mc and Me as inclusive code-point\n * ranges, flattened to [start, end, start, end, ...] and sorted ascending.\n */\nexport const LETTER_RANGES: readonly number[] = letterRanges;\n\n/** True for a code point in Lu, Ll, Lt, Lm, Lo, Mn, Mc or Me. Binary search over LETTER_RANGES. */\nexport function isLetter(cp: number): boolean {\n if (cp < 0) return false;\n if (cp < 0x80) return (cp >= 0x41 && cp <= 0x5a) || (cp >= 0x61 && cp <= 0x7a);\n let lo = 0;\n let hi = LETTER_RANGES.length / 2 - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const start = LETTER_RANGES[mid * 2] as number;\n const end = LETTER_RANGES[mid * 2 + 1] as number;\n if (cp < start) hi = mid - 1;\n else if (cp > end) lo = mid + 1;\n else return true;\n }\n return false;\n}\n\n/**\n * Unicode general categories Lu and Lt as inclusive code-point ranges, flattened to\n * [start, end, …] and sorted ascending — spec 3.1 `UPPER`, read by N7.\n *\n * DERIVED artifact, generated from the host UCD (Node 22 / Unicode 17.0, matching\n * src/engine/unicode.ts and spec/UNICODE); tests/rules/nbsp.test.ts re-checks every range\n * boundary against the host runtime. A table rather than `\\p{Lu}`: RE2 has no Unicode\n * property parity, so a rule may not depend on the host regex engine (ARCHITECTURE.md 4.1).\n * */\nexport const UPPER_RANGES: readonly number[] = [\n 0x41, 0x5a, 0xc0, 0xd6, 0xd8, 0xde, 0x100, 0x100, 0x102, 0x102, 0x104, 0x104, 0x106, 0x106, 0x108,\n 0x108, 0x10a, 0x10a, 0x10c, 0x10c, 0x10e, 0x10e, 0x110, 0x110, 0x112, 0x112, 0x114, 0x114, 0x116,\n 0x116, 0x118, 0x118, 0x11a, 0x11a, 0x11c, 0x11c, 0x11e, 0x11e, 0x120, 0x120, 0x122, 0x122, 0x124,\n 0x124, 0x126, 0x126, 0x128, 0x128, 0x12a, 0x12a, 0x12c, 0x12c, 0x12e, 0x12e, 0x130, 0x130, 0x132,\n 0x132, 0x134, 0x134, 0x136, 0x136, 0x139, 0x139, 0x13b, 0x13b, 0x13d, 0x13d, 0x13f, 0x13f, 0x141,\n 0x141, 0x143, 0x143, 0x145, 0x145, 0x147, 0x147, 0x14a, 0x14a, 0x14c, 0x14c, 0x14e, 0x14e, 0x150,\n 0x150, 0x152, 0x152, 0x154, 0x154, 0x156, 0x156, 0x158, 0x158, 0x15a, 0x15a, 0x15c, 0x15c, 0x15e,\n 0x15e, 0x160, 0x160, 0x162, 0x162, 0x164, 0x164, 0x166, 0x166, 0x168, 0x168, 0x16a, 0x16a, 0x16c,\n 0x16c, 0x16e, 0x16e, 0x170, 0x170, 0x172, 0x172, 0x174, 0x174, 0x176, 0x176, 0x178, 0x179, 0x17b,\n 0x17b, 0x17d, 0x17d, 0x181, 0x182, 0x184, 0x184, 0x186, 0x187, 0x189, 0x18b, 0x18e, 0x191, 0x193,\n 0x194, 0x196, 0x198, 0x19c, 0x19d, 0x19f, 0x1a0, 0x1a2, 0x1a2, 0x1a4, 0x1a4, 0x1a6, 0x1a7, 0x1a9,\n 0x1a9, 0x1ac, 0x1ac, 0x1ae, 0x1af, 0x1b1, 0x1b3, 0x1b5, 0x1b5, 0x1b7, 0x1b8, 0x1bc, 0x1bc, 0x1c4,\n 0x1c5, 0x1c7, 0x1c8, 0x1ca, 0x1cb, 0x1cd, 0x1cd, 0x1cf, 0x1cf, 0x1d1, 0x1d1, 0x1d3, 0x1d3, 0x1d5,\n 0x1d5, 0x1d7, 0x1d7, 0x1d9, 0x1d9, 0x1db, 0x1db, 0x1de, 0x1de, 0x1e0, 0x1e0, 0x1e2, 0x1e2, 0x1e4,\n 0x1e4, 0x1e6, 0x1e6, 0x1e8, 0x1e8, 0x1ea, 0x1ea, 0x1ec, 0x1ec, 0x1ee, 0x1ee, 0x1f1, 0x1f2, 0x1f4,\n 0x1f4, 0x1f6, 0x1f8, 0x1fa, 0x1fa, 0x1fc, 0x1fc, 0x1fe, 0x1fe, 0x200, 0x200, 0x202, 0x202, 0x204,\n 0x204, 0x206, 0x206, 0x208, 0x208, 0x20a, 0x20a, 0x20c, 0x20c, 0x20e, 0x20e, 0x210, 0x210, 0x212,\n 0x212, 0x214, 0x214, 0x216, 0x216, 0x218, 0x218, 0x21a, 0x21a, 0x21c, 0x21c, 0x21e, 0x21e, 0x220,\n 0x220, 0x222, 0x222, 0x224, 0x224, 0x226, 0x226, 0x228, 0x228, 0x22a, 0x22a, 0x22c, 0x22c, 0x22e,\n 0x22e, 0x230, 0x230, 0x232, 0x232, 0x23a, 0x23b, 0x23d, 0x23e, 0x241, 0x241, 0x243, 0x246, 0x248,\n 0x248, 0x24a, 0x24a, 0x24c, 0x24c, 0x24e, 0x24e, 0x370, 0x370, 0x372, 0x372, 0x376, 0x376, 0x37f,\n 0x37f, 0x386, 0x386, 0x388, 0x38a, 0x38c, 0x38c, 0x38e, 0x38f, 0x391, 0x3a1, 0x3a3, 0x3ab, 0x3cf,\n 0x3cf, 0x3d2, 0x3d4, 0x3d8, 0x3d8, 0x3da, 0x3da, 0x3dc, 0x3dc, 0x3de, 0x3de, 0x3e0, 0x3e0, 0x3e2,\n 0x3e2, 0x3e4, 0x3e4, 0x3e6, 0x3e6, 0x3e8, 0x3e8, 0x3ea, 0x3ea, 0x3ec, 0x3ec, 0x3ee, 0x3ee, 0x3f4,\n 0x3f4, 0x3f7, 0x3f7, 0x3f9, 0x3fa, 0x3fd, 0x42f, 0x460, 0x460, 0x462, 0x462, 0x464, 0x464, 0x466,\n 0x466, 0x468, 0x468, 0x46a, 0x46a, 0x46c, 0x46c, 0x46e, 0x46e, 0x470, 0x470, 0x472, 0x472, 0x474,\n 0x474, 0x476, 0x476, 0x478, 0x478, 0x47a, 0x47a, 0x47c, 0x47c, 0x47e, 0x47e, 0x480, 0x480, 0x48a,\n 0x48a, 0x48c, 0x48c, 0x48e, 0x48e, 0x490, 0x490, 0x492, 0x492, 0x494, 0x494, 0x496, 0x496, 0x498,\n 0x498, 0x49a, 0x49a, 0x49c, 0x49c, 0x49e, 0x49e, 0x4a0, 0x4a0, 0x4a2, 0x4a2, 0x4a4, 0x4a4, 0x4a6,\n 0x4a6, 0x4a8, 0x4a8, 0x4aa, 0x4aa, 0x4ac, 0x4ac, 0x4ae, 0x4ae, 0x4b0, 0x4b0, 0x4b2, 0x4b2, 0x4b4,\n 0x4b4, 0x4b6, 0x4b6, 0x4b8, 0x4b8, 0x4ba, 0x4ba, 0x4bc, 0x4bc, 0x4be, 0x4be, 0x4c0, 0x4c1, 0x4c3,\n 0x4c3, 0x4c5, 0x4c5, 0x4c7, 0x4c7, 0x4c9, 0x4c9, 0x4cb, 0x4cb, 0x4cd, 0x4cd, 0x4d0, 0x4d0, 0x4d2,\n 0x4d2, 0x4d4, 0x4d4, 0x4d6, 0x4d6, 0x4d8, 0x4d8, 0x4da, 0x4da, 0x4dc, 0x4dc, 0x4de, 0x4de, 0x4e0,\n 0x4e0, 0x4e2, 0x4e2, 0x4e4, 0x4e4, 0x4e6, 0x4e6, 0x4e8, 0x4e8, 0x4ea, 0x4ea, 0x4ec, 0x4ec, 0x4ee,\n 0x4ee, 0x4f0, 0x4f0, 0x4f2, 0x4f2, 0x4f4, 0x4f4, 0x4f6, 0x4f6, 0x4f8, 0x4f8, 0x4fa, 0x4fa, 0x4fc,\n 0x4fc, 0x4fe, 0x4fe, 0x500, 0x500, 0x502, 0x502, 0x504, 0x504, 0x506, 0x506, 0x508, 0x508, 0x50a,\n 0x50a, 0x50c, 0x50c, 0x50e, 0x50e, 0x510, 0x510, 0x512, 0x512, 0x514, 0x514, 0x516, 0x516, 0x518,\n 0x518, 0x51a, 0x51a, 0x51c, 0x51c, 0x51e, 0x51e, 0x520, 0x520, 0x522, 0x522, 0x524, 0x524, 0x526,\n 0x526, 0x528, 0x528, 0x52a, 0x52a, 0x52c, 0x52c, 0x52e, 0x52e, 0x531, 0x556, 0x10a0, 0x10c5,\n 0x10c7, 0x10c7, 0x10cd, 0x10cd, 0x13a0, 0x13f5, 0x1c89, 0x1c89, 0x1c90, 0x1cba, 0x1cbd, 0x1cbf,\n 0x1e00, 0x1e00, 0x1e02, 0x1e02, 0x1e04, 0x1e04, 0x1e06, 0x1e06, 0x1e08, 0x1e08, 0x1e0a, 0x1e0a,\n 0x1e0c, 0x1e0c, 0x1e0e, 0x1e0e, 0x1e10, 0x1e10, 0x1e12, 0x1e12, 0x1e14, 0x1e14, 0x1e16, 0x1e16,\n 0x1e18, 0x1e18, 0x1e1a, 0x1e1a, 0x1e1c, 0x1e1c, 0x1e1e, 0x1e1e, 0x1e20, 0x1e20, 0x1e22, 0x1e22,\n 0x1e24, 0x1e24, 0x1e26, 0x1e26, 0x1e28, 0x1e28, 0x1e2a, 0x1e2a, 0x1e2c, 0x1e2c, 0x1e2e, 0x1e2e,\n 0x1e30, 0x1e30, 0x1e32, 0x1e32, 0x1e34, 0x1e34, 0x1e36, 0x1e36, 0x1e38, 0x1e38, 0x1e3a, 0x1e3a,\n 0x1e3c, 0x1e3c, 0x1e3e, 0x1e3e, 0x1e40, 0x1e40, 0x1e42, 0x1e42, 0x1e44, 0x1e44, 0x1e46, 0x1e46,\n 0x1e48, 0x1e48, 0x1e4a, 0x1e4a, 0x1e4c, 0x1e4c, 0x1e4e, 0x1e4e, 0x1e50, 0x1e50, 0x1e52, 0x1e52,\n 0x1e54, 0x1e54, 0x1e56, 0x1e56, 0x1e58, 0x1e58, 0x1e5a, 0x1e5a, 0x1e5c, 0x1e5c, 0x1e5e, 0x1e5e,\n 0x1e60, 0x1e60, 0x1e62, 0x1e62, 0x1e64, 0x1e64, 0x1e66, 0x1e66, 0x1e68, 0x1e68, 0x1e6a, 0x1e6a,\n 0x1e6c, 0x1e6c, 0x1e6e, 0x1e6e, 0x1e70, 0x1e70, 0x1e72, 0x1e72, 0x1e74, 0x1e74, 0x1e76, 0x1e76,\n 0x1e78, 0x1e78, 0x1e7a, 0x1e7a, 0x1e7c, 0x1e7c, 0x1e7e, 0x1e7e, 0x1e80, 0x1e80, 0x1e82, 0x1e82,\n 0x1e84, 0x1e84, 0x1e86, 0x1e86, 0x1e88, 0x1e88, 0x1e8a, 0x1e8a, 0x1e8c, 0x1e8c, 0x1e8e, 0x1e8e,\n 0x1e90, 0x1e90, 0x1e92, 0x1e92, 0x1e94, 0x1e94, 0x1e9e, 0x1e9e, 0x1ea0, 0x1ea0, 0x1ea2, 0x1ea2,\n 0x1ea4, 0x1ea4, 0x1ea6, 0x1ea6, 0x1ea8, 0x1ea8, 0x1eaa, 0x1eaa, 0x1eac, 0x1eac, 0x1eae, 0x1eae,\n 0x1eb0, 0x1eb0, 0x1eb2, 0x1eb2, 0x1eb4, 0x1eb4, 0x1eb6, 0x1eb6, 0x1eb8, 0x1eb8, 0x1eba, 0x1eba,\n 0x1ebc, 0x1ebc, 0x1ebe, 0x1ebe, 0x1ec0, 0x1ec0, 0x1ec2, 0x1ec2, 0x1ec4, 0x1ec4, 0x1ec6, 0x1ec6,\n 0x1ec8, 0x1ec8, 0x1eca, 0x1eca, 0x1ecc, 0x1ecc, 0x1ece, 0x1ece, 0x1ed0, 0x1ed0, 0x1ed2, 0x1ed2,\n 0x1ed4, 0x1ed4, 0x1ed6, 0x1ed6, 0x1ed8, 0x1ed8, 0x1eda, 0x1eda, 0x1edc, 0x1edc, 0x1ede, 0x1ede,\n 0x1ee0, 0x1ee0, 0x1ee2, 0x1ee2, 0x1ee4, 0x1ee4, 0x1ee6, 0x1ee6, 0x1ee8, 0x1ee8, 0x1eea, 0x1eea,\n 0x1eec, 0x1eec, 0x1eee, 0x1eee, 0x1ef0, 0x1ef0, 0x1ef2, 0x1ef2, 0x1ef4, 0x1ef4, 0x1ef6, 0x1ef6,\n 0x1ef8, 0x1ef8, 0x1efa, 0x1efa, 0x1efc, 0x1efc, 0x1efe, 0x1efe, 0x1f08, 0x1f0f, 0x1f18, 0x1f1d,\n 0x1f28, 0x1f2f, 0x1f38, 0x1f3f, 0x1f48, 0x1f4d, 0x1f59, 0x1f59, 0x1f5b, 0x1f5b, 0x1f5d, 0x1f5d,\n 0x1f5f, 0x1f5f, 0x1f68, 0x1f6f, 0x1f88, 0x1f8f, 0x1f98, 0x1f9f, 0x1fa8, 0x1faf, 0x1fb8, 0x1fbc,\n 0x1fc8, 0x1fcc, 0x1fd8, 0x1fdb, 0x1fe8, 0x1fec, 0x1ff8, 0x1ffc, 0x2102, 0x2102, 0x2107, 0x2107,\n 0x210b, 0x210d, 0x2110, 0x2112, 0x2115, 0x2115, 0x2119, 0x211d, 0x2124, 0x2124, 0x2126, 0x2126,\n 0x2128, 0x2128, 0x212a, 0x212d, 0x2130, 0x2133, 0x213e, 0x213f, 0x2145, 0x2145, 0x2183, 0x2183,\n 0x2c00, 0x2c2f, 0x2c60, 0x2c60, 0x2c62, 0x2c64, 0x2c67, 0x2c67, 0x2c69, 0x2c69, 0x2c6b, 0x2c6b,\n 0x2c6d, 0x2c70, 0x2c72, 0x2c72, 0x2c75, 0x2c75, 0x2c7e, 0x2c80, 0x2c82, 0x2c82, 0x2c84, 0x2c84,\n 0x2c86, 0x2c86, 0x2c88, 0x2c88, 0x2c8a, 0x2c8a, 0x2c8c, 0x2c8c, 0x2c8e, 0x2c8e, 0x2c90, 0x2c90,\n 0x2c92, 0x2c92, 0x2c94, 0x2c94, 0x2c96, 0x2c96, 0x2c98, 0x2c98, 0x2c9a, 0x2c9a, 0x2c9c, 0x2c9c,\n 0x2c9e, 0x2c9e, 0x2ca0, 0x2ca0, 0x2ca2, 0x2ca2, 0x2ca4, 0x2ca4, 0x2ca6, 0x2ca6, 0x2ca8, 0x2ca8,\n 0x2caa, 0x2caa, 0x2cac, 0x2cac, 0x2cae, 0x2cae, 0x2cb0, 0x2cb0, 0x2cb2, 0x2cb2, 0x2cb4, 0x2cb4,\n 0x2cb6, 0x2cb6, 0x2cb8, 0x2cb8, 0x2cba, 0x2cba, 0x2cbc, 0x2cbc, 0x2cbe, 0x2cbe, 0x2cc0, 0x2cc0,\n 0x2cc2, 0x2cc2, 0x2cc4, 0x2cc4, 0x2cc6, 0x2cc6, 0x2cc8, 0x2cc8, 0x2cca, 0x2cca, 0x2ccc, 0x2ccc,\n 0x2cce, 0x2cce, 0x2cd0, 0x2cd0, 0x2cd2, 0x2cd2, 0x2cd4, 0x2cd4, 0x2cd6, 0x2cd6, 0x2cd8, 0x2cd8,\n 0x2cda, 0x2cda, 0x2cdc, 0x2cdc, 0x2cde, 0x2cde, 0x2ce0, 0x2ce0, 0x2ce2, 0x2ce2, 0x2ceb, 0x2ceb,\n 0x2ced, 0x2ced, 0x2cf2, 0x2cf2, 0xa640, 0xa640, 0xa642, 0xa642, 0xa644, 0xa644, 0xa646, 0xa646,\n 0xa648, 0xa648, 0xa64a, 0xa64a, 0xa64c, 0xa64c, 0xa64e, 0xa64e, 0xa650, 0xa650, 0xa652, 0xa652,\n 0xa654, 0xa654, 0xa656, 0xa656, 0xa658, 0xa658, 0xa65a, 0xa65a, 0xa65c, 0xa65c, 0xa65e, 0xa65e,\n 0xa660, 0xa660, 0xa662, 0xa662, 0xa664, 0xa664, 0xa666, 0xa666, 0xa668, 0xa668, 0xa66a, 0xa66a,\n 0xa66c, 0xa66c, 0xa680, 0xa680, 0xa682, 0xa682, 0xa684, 0xa684, 0xa686, 0xa686, 0xa688, 0xa688,\n 0xa68a, 0xa68a, 0xa68c, 0xa68c, 0xa68e, 0xa68e, 0xa690, 0xa690, 0xa692, 0xa692, 0xa694, 0xa694,\n 0xa696, 0xa696, 0xa698, 0xa698, 0xa69a, 0xa69a, 0xa722, 0xa722, 0xa724, 0xa724, 0xa726, 0xa726,\n 0xa728, 0xa728, 0xa72a, 0xa72a, 0xa72c, 0xa72c, 0xa72e, 0xa72e, 0xa732, 0xa732, 0xa734, 0xa734,\n 0xa736, 0xa736, 0xa738, 0xa738, 0xa73a, 0xa73a, 0xa73c, 0xa73c, 0xa73e, 0xa73e, 0xa740, 0xa740,\n 0xa742, 0xa742, 0xa744, 0xa744, 0xa746, 0xa746, 0xa748, 0xa748, 0xa74a, 0xa74a, 0xa74c, 0xa74c,\n 0xa74e, 0xa74e, 0xa750, 0xa750, 0xa752, 0xa752, 0xa754, 0xa754, 0xa756, 0xa756, 0xa758, 0xa758,\n 0xa75a, 0xa75a, 0xa75c, 0xa75c, 0xa75e, 0xa75e, 0xa760, 0xa760, 0xa762, 0xa762, 0xa764, 0xa764,\n 0xa766, 0xa766, 0xa768, 0xa768, 0xa76a, 0xa76a, 0xa76c, 0xa76c, 0xa76e, 0xa76e, 0xa779, 0xa779,\n 0xa77b, 0xa77b, 0xa77d, 0xa77e, 0xa780, 0xa780, 0xa782, 0xa782, 0xa784, 0xa784, 0xa786, 0xa786,\n 0xa78b, 0xa78b, 0xa78d, 0xa78d, 0xa790, 0xa790, 0xa792, 0xa792, 0xa796, 0xa796, 0xa798, 0xa798,\n 0xa79a, 0xa79a, 0xa79c, 0xa79c, 0xa79e, 0xa79e, 0xa7a0, 0xa7a0, 0xa7a2, 0xa7a2, 0xa7a4, 0xa7a4,\n 0xa7a6, 0xa7a6, 0xa7a8, 0xa7a8, 0xa7aa, 0xa7ae, 0xa7b0, 0xa7b4, 0xa7b6, 0xa7b6, 0xa7b8, 0xa7b8,\n 0xa7ba, 0xa7ba, 0xa7bc, 0xa7bc, 0xa7be, 0xa7be, 0xa7c0, 0xa7c0, 0xa7c2, 0xa7c2, 0xa7c4, 0xa7c7,\n 0xa7c9, 0xa7c9, 0xa7cb, 0xa7cc, 0xa7ce, 0xa7ce, 0xa7d0, 0xa7d0, 0xa7d2, 0xa7d2, 0xa7d4, 0xa7d4,\n 0xa7d6, 0xa7d6, 0xa7d8, 0xa7d8, 0xa7da, 0xa7da, 0xa7dc, 0xa7dc, 0xa7f5, 0xa7f5, 0xff21, 0xff3a,\n 0x10400, 0x10427, 0x104b0, 0x104d3, 0x10570, 0x1057a, 0x1057c, 0x1058a, 0x1058c, 0x10592, 0x10594,\n 0x10595, 0x10c80, 0x10cb2, 0x10d50, 0x10d65, 0x118a0, 0x118bf, 0x16e40, 0x16e5f, 0x16ea0, 0x16eb8,\n 0x1d400, 0x1d419, 0x1d434, 0x1d44d, 0x1d468, 0x1d481, 0x1d49c, 0x1d49c, 0x1d49e, 0x1d49f, 0x1d4a2,\n 0x1d4a2, 0x1d4a5, 0x1d4a6, 0x1d4a9, 0x1d4ac, 0x1d4ae, 0x1d4b5, 0x1d4d0, 0x1d4e9, 0x1d504, 0x1d505,\n 0x1d507, 0x1d50a, 0x1d50d, 0x1d514, 0x1d516, 0x1d51c, 0x1d538, 0x1d539, 0x1d53b, 0x1d53e, 0x1d540,\n 0x1d544, 0x1d546, 0x1d546, 0x1d54a, 0x1d550, 0x1d56c, 0x1d585, 0x1d5a0, 0x1d5b9, 0x1d5d4, 0x1d5ed,\n 0x1d608, 0x1d621, 0x1d63c, 0x1d655, 0x1d670, 0x1d689, 0x1d6a8, 0x1d6c0, 0x1d6e2, 0x1d6fa, 0x1d71c,\n 0x1d734, 0x1d756, 0x1d76e, 0x1d790, 0x1d7a8, 0x1d7ca, 0x1d7ca, 0x1e900, 0x1e921,\n];\n\n/** True for a code point in Lu or Lt. Binary search over UPPER_RANGES. */\nexport function isUpper(cp: number): boolean {\n if (cp < 0) return false;\n if (cp < 0x80) return cp >= 0x41 && cp <= 0x5a;\n let lo = 0;\n let hi = UPPER_RANGES.length / 2 - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const start = UPPER_RANGES[mid * 2] as number;\n const end = UPPER_RANGES[mid * 2 + 1] as number;\n if (cp < start) hi = mid - 1;\n else if (cp > end) lo = mid + 1;\n else return true;\n }\n return false;\n}\n\n/**\n * Unicode simple uppercase mapping, as [start, end, step, delta] quadruples flattened into\n * one array. `hyphen` 3.3 and `nbsp` 3.5 both need it, applied to the *pattern*, never to the\n * input, and never via `toUpperCase()` — that is the host-locale call ARCHITECTURE.md 4.4\n * forbids. `nbsp` and `hyphen` both read it.\n *\n * DERIVED artifact, generated from the host UCD (Node 22 / Unicode 17.0, matching\n * src/engine/unicode.ts and spec/UNICODE); tests/rules/hyphen.test.ts re-checks every entry\n * against the host runtime, so a UCD drift is a red build rather than a silent output change.\n * Entries whose full uppercase mapping expands to more than one code point (U+00DF, U+FB00,\n * …) are absent, which is exactly what the simple mapping says: they map to themselves.\n */\nexport const SIMPLE_UPPERCASE: readonly number[] = [\n 0x61, 0x7a, 1, -32, 0xb5, 0xb5, 1, 743, 0xe0, 0xf6, 1, -32, 0xf8, 0xfe, 1, -32, 0xff, 0xff, 1,\n 121, 0x101, 0x12f, 2, -1, 0x131, 0x131, 1, -232, 0x133, 0x137, 2, -1, 0x13a, 0x148, 2, -1, 0x14b,\n 0x177, 2, -1, 0x17a, 0x17e, 2, -1, 0x17f, 0x17f, 1, -300, 0x180, 0x180, 1, 195, 0x183, 0x185, 2,\n -1, 0x188, 0x188, 1, -1, 0x18c, 0x18c, 1, -1, 0x192, 0x192, 1, -1, 0x195, 0x195, 1, 97, 0x199,\n 0x199, 1, -1, 0x19a, 0x19a, 1, 163, 0x19b, 0x19b, 1, 42561, 0x19e, 0x19e, 1, 130, 0x1a1, 0x1a5, 2,\n -1, 0x1a8, 0x1a8, 1, -1, 0x1ad, 0x1ad, 1, -1, 0x1b0, 0x1b0, 1, -1, 0x1b4, 0x1b6, 2, -1, 0x1b9,\n 0x1b9, 1, -1, 0x1bd, 0x1bd, 1, -1, 0x1bf, 0x1bf, 1, 56, 0x1c5, 0x1c5, 1, -1, 0x1c6, 0x1c6, 1, -2,\n 0x1c8, 0x1c8, 1, -1, 0x1c9, 0x1c9, 1, -2, 0x1cb, 0x1cb, 1, -1, 0x1cc, 0x1cc, 1, -2, 0x1ce, 0x1dc,\n 2, -1, 0x1dd, 0x1dd, 1, -79, 0x1df, 0x1ef, 2, -1, 0x1f2, 0x1f2, 1, -1, 0x1f3, 0x1f3, 1, -2, 0x1f5,\n 0x1f5, 1, -1, 0x1f9, 0x21f, 2, -1, 0x223, 0x233, 2, -1, 0x23c, 0x23c, 1, -1, 0x23f, 0x240, 1,\n 10815, 0x242, 0x242, 1, -1, 0x247, 0x24f, 2, -1, 0x250, 0x250, 1, 10783, 0x251, 0x251, 1, 10780,\n 0x252, 0x252, 1, 10782, 0x253, 0x253, 1, -210, 0x254, 0x254, 1, -206, 0x256, 0x257, 1, -205,\n 0x259, 0x259, 1, -202, 0x25b, 0x25b, 1, -203, 0x25c, 0x25c, 1, 42319, 0x260, 0x260, 1, -205,\n 0x261, 0x261, 1, 42315, 0x263, 0x263, 1, -207, 0x264, 0x264, 1, 42343, 0x265, 0x265, 1, 42280,\n 0x266, 0x266, 1, 42308, 0x268, 0x268, 1, -209, 0x269, 0x269, 1, -211, 0x26a, 0x26a, 1, 42308,\n 0x26b, 0x26b, 1, 10743, 0x26c, 0x26c, 1, 42305, 0x26f, 0x26f, 1, -211, 0x271, 0x271, 1, 10749,\n 0x272, 0x272, 1, -213, 0x275, 0x275, 1, -214, 0x27d, 0x27d, 1, 10727, 0x280, 0x280, 1, -218,\n 0x282, 0x282, 1, 42307, 0x283, 0x283, 1, -218, 0x287, 0x287, 1, 42282, 0x288, 0x288, 1, -218,\n 0x289, 0x289, 1, -69, 0x28a, 0x28b, 1, -217, 0x28c, 0x28c, 1, -71, 0x292, 0x292, 1, -219, 0x29d,\n 0x29d, 1, 42261, 0x29e, 0x29e, 1, 42258, 0x345, 0x345, 1, 84, 0x371, 0x373, 2, -1, 0x377, 0x377,\n 1, -1, 0x37b, 0x37d, 1, 130, 0x3ac, 0x3ac, 1, -38, 0x3ad, 0x3af, 1, -37, 0x3b1, 0x3c1, 1, -32,\n 0x3c2, 0x3c2, 1, -31, 0x3c3, 0x3cb, 1, -32, 0x3cc, 0x3cc, 1, -64, 0x3cd, 0x3ce, 1, -63, 0x3d0,\n 0x3d0, 1, -62, 0x3d1, 0x3d1, 1, -57, 0x3d5, 0x3d5, 1, -47, 0x3d6, 0x3d6, 1, -54, 0x3d7, 0x3d7, 1,\n -8, 0x3d9, 0x3ef, 2, -1, 0x3f0, 0x3f0, 1, -86, 0x3f1, 0x3f1, 1, -80, 0x3f2, 0x3f2, 1, 7, 0x3f3,\n 0x3f3, 1, -116, 0x3f5, 0x3f5, 1, -96, 0x3f8, 0x3f8, 1, -1, 0x3fb, 0x3fb, 1, -1, 0x430, 0x44f, 1,\n -32, 0x450, 0x45f, 1, -80, 0x461, 0x481, 2, -1, 0x48b, 0x4bf, 2, -1, 0x4c2, 0x4ce, 2, -1, 0x4cf,\n 0x4cf, 1, -15, 0x4d1, 0x52f, 2, -1, 0x561, 0x586, 1, -48, 0x10d0, 0x10fa, 1, 3008, 0x10fd, 0x10ff,\n 1, 3008, 0x13f8, 0x13fd, 1, -8, 0x1c80, 0x1c80, 1, -6254, 0x1c81, 0x1c81, 1, -6253, 0x1c82,\n 0x1c82, 1, -6244, 0x1c83, 0x1c84, 1, -6242, 0x1c85, 0x1c85, 1, -6243, 0x1c86, 0x1c86, 1, -6236,\n 0x1c87, 0x1c87, 1, -6181, 0x1c88, 0x1c88, 1, 35266, 0x1c8a, 0x1c8a, 1, -1, 0x1d79, 0x1d79, 1,\n 35332, 0x1d7d, 0x1d7d, 1, 3814, 0x1d8e, 0x1d8e, 1, 35384, 0x1e01, 0x1e95, 2, -1, 0x1e9b, 0x1e9b,\n 1, -59, 0x1ea1, 0x1eff, 2, -1, 0x1f00, 0x1f07, 1, 8, 0x1f10, 0x1f15, 1, 8, 0x1f20, 0x1f27, 1, 8,\n 0x1f30, 0x1f37, 1, 8, 0x1f40, 0x1f45, 1, 8, 0x1f51, 0x1f57, 2, 8, 0x1f60, 0x1f67, 1, 8, 0x1f70,\n 0x1f71, 1, 74, 0x1f72, 0x1f75, 1, 86, 0x1f76, 0x1f77, 1, 100, 0x1f78, 0x1f79, 1, 128, 0x1f7a,\n 0x1f7b, 1, 112, 0x1f7c, 0x1f7d, 1, 126, 0x1fb0, 0x1fb1, 1, 8, 0x1fbe, 0x1fbe, 1, -7205, 0x1fd0,\n 0x1fd1, 1, 8, 0x1fe0, 0x1fe1, 1, 8, 0x1fe5, 0x1fe5, 1, 7, 0x214e, 0x214e, 1, -28, 0x2170, 0x217f,\n 1, -16, 0x2184, 0x2184, 1, -1, 0x24d0, 0x24e9, 1, -26, 0x2c30, 0x2c5f, 1, -48, 0x2c61, 0x2c61, 1,\n -1, 0x2c65, 0x2c65, 1, -10795, 0x2c66, 0x2c66, 1, -10792, 0x2c68, 0x2c6c, 2, -1, 0x2c73, 0x2c73,\n 1, -1, 0x2c76, 0x2c76, 1, -1, 0x2c81, 0x2ce3, 2, -1, 0x2cec, 0x2cee, 2, -1, 0x2cf3, 0x2cf3, 1, -1,\n 0x2d00, 0x2d25, 1, -7264, 0x2d27, 0x2d27, 1, -7264, 0x2d2d, 0x2d2d, 1, -7264, 0xa641, 0xa66d, 2,\n -1, 0xa681, 0xa69b, 2, -1, 0xa723, 0xa72f, 2, -1, 0xa733, 0xa76f, 2, -1, 0xa77a, 0xa77c, 2, -1,\n 0xa77f, 0xa787, 2, -1, 0xa78c, 0xa78c, 1, -1, 0xa791, 0xa793, 2, -1, 0xa794, 0xa794, 1, 48,\n 0xa797, 0xa7a9, 2, -1, 0xa7b5, 0xa7c3, 2, -1, 0xa7c8, 0xa7ca, 2, -1, 0xa7cd, 0xa7db, 2, -1,\n 0xa7f6, 0xa7f6, 1, -1, 0xab53, 0xab53, 1, -928, 0xab70, 0xabbf, 1, -38864, 0xff41, 0xff5a, 1, -32,\n 0x10428, 0x1044f, 1, -40, 0x104d8, 0x104fb, 1, -40, 0x10597, 0x105bb, 2, -39, 0x10598, 0x105a0, 2,\n -39, 0x105a4, 0x105b0, 2, -39, 0x105b4, 0x105b8, 2, -39, 0x105bc, 0x105bc, 1, -39, 0x10cc0,\n 0x10cf2, 1, -64, 0x10d70, 0x10d85, 1, -32, 0x118c0, 0x118df, 1, -32, 0x16e60, 0x16e7f, 1, -32,\n 0x16ebb, 0x16ed3, 1, -27, 0x1e922, 0x1e943, 1, -34,\n];\n\n/** Simple uppercase mapping of one code point, or the code point itself when it has none. */\nexport function simpleUppercase(cp: number): number {\n for (let i = 0; i < SIMPLE_UPPERCASE.length; i += 4) {\n const start = SIMPLE_UPPERCASE[i] as number;\n if (cp < start) return cp;\n const end = SIMPLE_UPPERCASE[i + 1] as number;\n const step = SIMPLE_UPPERCASE[i + 2] as number;\n if (cp <= end && (cp - start) % step === 0) return cp + (SIMPLE_UPPERCASE[i + 3] as number);\n }\n return cp;\n}\n","/**\n * The three non-code-point values a rule can meet in the array it scans. **They live in the\n * engine, together, and must stay pairwise disjoint.**\n *\n * Disjointness is not tidiness. Each value answers a different question, and a rule that\n * cannot tell them apart answers the wrong one:\n *\n * - `NONE` — there is nothing at that index; the array ends here.\n * - `MARKER` — a span boundary whose skipped region has no line terminator. Per modes.md 3.3\n * it is opaque content everywhere except `OPENISH`/`CLOSEISH`, where it is a member of both.\n * It is explicitly **not** `NONE` and **not** `SPACELIKE`.\n * - `LINE_MARKER` — a span boundary whose skipped region contains a line terminator. A member\n * of `BREAK` for every rule, everywhere, so a mode's output on hard-wrapped prose is\n * identical to `text` mode's on the same characters (modes.md 3.2, 7.4).\n *\n * Two of these were previously equal by accident, in two different pairings, and both cost a\n * defect: rules whose `NONE` was `-1` could not distinguish \"end of array\" from an inline\n * boundary, and `quotes`/`apostrophe` moved their `NONE` to `-2` and collided with the line\n * marker instead. The collisions were invisible only because the two verdicts happened to\n * coincide in the branches those rules had — a coincidence, not a property.\n *\n * **A new sentinel goes here and nowhere else**, takes the next free negative integer, and is\n * classified in modes.md before any rule reads it.\n *\n * These are L1 values: the rules (L1) read them, the mode adapters (L2) write them. Defining\n * them here keeps the dependency pointing downward (ARCHITECTURE.md 2).\n */\nexport const MARKER = -1;\nexport const LINE_MARKER = -2;\nexport const NONE = -3;\n\n/** True for either span boundary. `NONE` is deliberately not a marker: it is not in the array. */\nexport function isMarker(value: number): boolean {\n return value === MARKER || value === LINE_MARKER;\n}\n","import { isLetter } from \"../engine/unicode.js\";\nimport { LINE_MARKER, MARKER, NONE } from \"../engine/sentinels.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\n\n// spec/rules/apostrophe.md 3.1. The apostrophe is U+2019 in every v1 locale and the case ladder\n// below is structural, not lexical. As of spec 1.1.0 this rule reads no locale data at all and\n// skips no position: 0.5.0's preserve set (apostrophe.md 3.4) existed to stop the ladder from\n// converting the marks `quotes` (order 40) had vetoed, and conversion is now the specified\n// outcome for every position `quotes` vetoes — the ladder's own cases 4 and 3 are exactly what\n// turns `rock 'n' roll` into `rock ’n’ roll`, in every locale.\nconst SQ = 0x27;\nconst RIGHT_SINGLE = 0x2019;\n\n/**\n * Not −1: that is the span boundary marker (spec/rules/modes.md 3.2), and §3.3 forbids a\n * marker inside the array from being indistinguishable from the absence of a neighbour.\n *\n * The verdicts happen to be identical under either reading — verified exhaustively over the\n * whole two-neighbour decision space — because the only two branches the marker can reach\n * (case 3's right-test, case 4's left-test) are disjunctions that already accept `NONE`, and\n * §3.3 puts the marker in exactly the class each of those disjunctions also accepts. That\n * alignment is a coincidence of the class assignment, not a structural guarantee: a future\n * branch accepting `NONE` but not `CLOSEISH`/`OPENISH` would silently diverge. Conforming\n * here makes the agreement a property rather than luck.\n */\n\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\nconst SPACELIKE: ReadonlySet<number> = new Set([\n 0x20,\n 0x09,\n 0xa0,\n 0x202f,\n 0x2007,\n 0x2009,\n 0x200a,\n // BREAK, including the line-boundary marker: modes.md 3.2 makes it a member for every rule.\n 0x0a,\n 0x0d,\n 0x0b,\n 0x0c,\n 0x85,\n 0x2028,\n 0x2029,\n LINE_MARKER,\n]);\n\n// Unlike `quotes`, U+0027 is a member of neither class here and U+2019 is in `CLOSEISH` only;\n// spec 5 turns exactly that asymmetry into the idempotency argument. U+2011 sits beside\n// U+002D because `hyphen` (order 35) converts one to the other. `MARKER` is in both classes\n// per modes.md 3.3, whose table names this rule.\nconst OPENISH: ReadonlySet<number> = new Set([\n MARKER,\n 0x28,\n 0x5b,\n 0x7b,\n 0xab,\n 0x2018,\n 0x201a,\n 0x201b,\n 0x201c,\n 0x201e,\n 0x201f,\n 0x2039,\n 0x2d,\n 0x2011,\n 0x2013,\n 0x2014,\n]);\n\nconst CLOSEISH: ReadonlySet<number> = new Set([\n MARKER,\n 0x29,\n 0x5d,\n 0x7d,\n 0xbb,\n 0x2019,\n 0x201d,\n 0x203a,\n 0x2c,\n 0x2e,\n 0x3b,\n 0x3a,\n 0x21,\n 0x3f,\n 0x2026,\n 0x2d,\n 0x2011,\n 0x2013,\n 0x2014,\n]);\n\n// spec 1.2.0: the quotation glyphs of `OPENISH`, without its brackets and dashes, for case 3a.\n// Brackets stay out so a prime on a function name, `f'(x)`, is left alone. No `MARKER`: case 3\n// already accepts it through `CLOSEISH`.\nconst OPENQUOTE: ReadonlySet<number> = new Set([\n 0xab, 0x2018, 0x201a, 0x201b, 0x201c, 0x201e, 0x201f, 0x2039,\n]);\n\n/** Out-of-range reads yield `NONE`, the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\nfunction isAlnum(cp: number): boolean {\n return isDigit(cp) || isLetter(cp);\n}\n\n/**\n * The case ladder of spec 3.3, first match wins. Every verdict is a pure function of exactly\n * two neighbouring code points; there is no lookahead and no state between candidates.\n */\nfunction isApostrophe(left: number, right: number): boolean {\n // 1 — prime guard, first so it wins over case 3: `6' 2\"`, `55° 40' N`, `6'2\"`.\n if (isDigit(left) && !isLetter(right)) return false;\n // 2 — medial: `don't`, `l'été`, `O'Brien`, `1990's`.\n if (isAlnum(left) && isAlnum(right)) return true;\n // 3 — trailing elision or possessive: `the dogs' bowls`, `Jesus'`.\n if (isLetter(left) && (right === NONE || SPACELIKE.has(right) || CLOSEISH.has(right)))\n return true;\n // 3a — elision before a quotation (spec 1.2.0): `d'« urine »`, `l'“idea”`, and `„Hans'“`,\n // whose de-DE closing glyph U+201C is not in `CLOSEISH`.\n if (isLetter(left) && OPENQUOTE.has(right)) return true;\n // 4 — leading elision: `’90s`, `’tis`, `’em`. The replacement is U+2019, never U+2018 —\n // a leading elision is a raised comma, not an opening quotation mark, and `quotes` has\n // already had its chance to claim the mark as a quotation and declined (spec 3.2, 5).\n if ((left === NONE || SPACELIKE.has(left) || OPENISH.has(left)) && isAlnum(right)) return true;\n // 5 — nothing inferable: `a ' b`, `''`.\n return false;\n}\n\nexport const apostropheRule: Rule = {\n id: \"apostrophe\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const n = cp.length;\n const edits: Edit[] = [];\n\n for (let i = 0; i < n; i += 1) {\n if (at(cp, i) !== SQ) continue;\n const left = i > 0 ? at(cp, i - 1) : NONE;\n const right = i + 1 < n ? at(cp, i + 1) : NONE;\n if (isApostrophe(left, right)) {\n edits.push({ start: i, end: i + 1, replacement: [RIGHT_SINGLE], ruleId: \"apostrophe\" });\n }\n }\n\n return edits;\n },\n};\n","import { LINE_MARKER, NONE } from \"../engine/sentinels.js\";\nimport type { LocaleData } from \"../types.js\";\n\n/**\n * Structural primitives shared by `dashes` (spec/rules/dashes.md) and `ranges`\n * (spec/rules/ranges.md), spec 0.5.0. Both rules scan the same DASH-token shape and share the\n * same symmetry/isolation/cluster/joiner guards (dashes.md 3.2, 3.2a, 3.2b) — this module is the\n * single source of truth for that shared machinery, so the two rules cannot drift apart the way\n * two independent re-derivations could. Each rule adds only its own branch-specific guards\n * (P1/P4 for `dashes`; G1-G5 for `ranges`) and its own locale style (`dash.parenthetical` vs\n * `dash.range`) on top of what `findDashTokens` returns.\n *\n * Not a `Rule` itself and not registered in `registry.ts` — an internal engine module, exactly\n * like `spans.ts` is to the mode adapters.\n */\n\nexport const HYPHEN_MINUS = 0x2d;\nexport const HYPHEN = 0x2010;\nconst FIGURE_DASH = 0x2012;\nexport const EN_DASH = 0x2013;\nexport const EM_DASH = 0x2014;\nconst HORIZONTAL_BAR = 0x2015;\nexport const MINUS_SIGN = 0x2212;\nconst SMALL_EM_DASH = 0xfe58;\nconst SMALL_HYPHEN_MINUS = 0xfe63;\nconst FULLWIDTH_HYPHEN_MINUS = 0xff0d;\nexport const SPACE = 0x20;\nconst FULL_STOP = 0x2e;\nconst COMMA = 0x2c;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n/** dashes.md 3.1 JOINER — U+2060, emitted only around a tight range dash (ranges.md 3.3.1). */\nexport const WORD_JOINER = 0x2060;\n\n/** dashes.md 3.1 DASH. See dashes.ts's historical note; unchanged by the ranges split. */\nexport function isDash(cp: number): boolean {\n return (\n cp === HYPHEN_MINUS || cp === HYPHEN || cp === EN_DASH || cp === EM_DASH || cp === MINUS_SIGN\n );\n}\n\n/** dashes.md 3.1 INERT-DASH: never a candidate, never produced, by either rule. */\nexport function isInertDash(cp: number): boolean {\n return (\n cp === 0x00ad ||\n cp === FIGURE_DASH ||\n cp === 0x2011 ||\n cp === HORIZONTAL_BAR ||\n cp === SMALL_EM_DASH ||\n cp === SMALL_HYPHEN_MINUS ||\n cp === FULLWIDTH_HYPHEN_MINUS\n );\n}\n\n/** dashes.md 3.1 DIGIT: ASCII only, deliberately — see dashes.md 7.1. */\nexport function isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\n/** `BREAK` — including `LINE_MARKER`, a member for every rule everywhere (modes.md 3.2). */\nexport function isBreak(cp: number): boolean {\n return (\n cp === 0x0a ||\n cp === 0x0d ||\n cp === 0x0b ||\n cp === 0x0c ||\n cp === 0x85 ||\n cp === 0x2028 ||\n cp === 0x2029 ||\n cp === LINE_MARKER\n );\n}\n\nexport function isNoBreakSpace(cp: number): boolean {\n return cp === 0x00a0 || cp === 0x202f;\n}\n\nexport type DashStyle = LocaleData[\"dash\"][\"parenthetical\"];\n\nexport function dashCodePoint(style: DashStyle): number {\n return style === \"em-tight\" || style === \"em-spaced\" ? EM_DASH : EN_DASH;\n}\n\nexport function isSpaced(style: DashStyle): boolean {\n return style === \"em-spaced\" || style === \"en-spaced\";\n}\n\nexport function sameContent(\n cp: readonly number[],\n start: number,\n end: number,\n next: readonly number[],\n): boolean {\n if (end - start !== next.length) return false;\n for (let i = 0; i < next.length; i += 1) {\n if (cp[start + i] !== next[i]) return false;\n }\n return true;\n}\n\n/**\n * dashes.md 3.6: every replacement is built from U+0020 alone. `bind` is meaningful only for\n * `ranges` (dashes.md 3.6 / ranges.md 3.3.1) — `dashes`' parenthetical branch always calls this\n * with `bind = false`, since a parenthetical dash never binds (an interrupting dash is exactly\n * where a line may break).\n */\nexport function buildReplacement(style: DashStyle, bind: boolean): number[] {\n if (!isSpaced(style)) {\n return bind ? [WORD_JOINER, dashCodePoint(style), WORD_JOINER] : [dashCodePoint(style)];\n }\n return [SPACE, dashCodePoint(style), SPACE];\n}\n\n/** dashes.md 3.2 step 9 (T2) — the positions `spaces` (order 10) deletes a U+0020 from. */\nexport function isStripBeforeOrCloseBracket(cp: number): boolean {\n return (\n cp === COMMA ||\n cp === FULL_STOP ||\n cp === 0x3b ||\n cp === 0x3a ||\n cp === 0x21 ||\n cp === 0x3f ||\n cp === 0x2026 ||\n cp === 0x29 ||\n cp === 0x5d ||\n cp === 0x7d\n );\n}\n\nexport function isOpenBracket(cp: number): boolean {\n return cp === 0x28 || cp === 0x5b || cp === 0x7b;\n}\n\n/**\n * dashes.md 3.2 step 7: the cluster alphabet is DASH ∪ INERT-DASH ∪ DIGIT ∪ JOINER ∪\n * CLOSED-SYMBOL. Shared between `dashes` and `ranges` because a cluster like `2026-08-15` or\n * `known-5-10` can contain runs that belong to either rule, and the whole cluster must be inert\n * to both if it holds two or more dash runs (dashes.md 3.2 step 7).\n *\n * CLOSED-SYMBOL joined the alphabet in spec 1.3.0, when ranges.md 3.2a made a symbol adjacent to\n * a digit run part of a range token's own territory. Without it `a—$15-$20` is two clusters where\n * `a—15-20` is one, so `dashes` converts the em dash, that edit moves the range's `before` from a\n * dash to a space, and the range converts on the NEXT pass — a transform idempotency defect in\n * every locale whose parenthetical form is spaced.\n */\nfunction isClusterMember(cp: number): boolean {\n return isDash(cp) || isInertDash(cp) || isDigit(cp) || cp === WORD_JOINER;\n}\n\nexport function isDashUnion(cp: number): boolean {\n return isDash(cp) || isInertDash(cp);\n}\n\n/** dashes.md 3.2 step 7 — cluster guard. */\nfunction isClusterInert(cp: readonly number[], s: number, e: number): boolean {\n const n = cp.length;\n let start = s;\n while (start > 0 && isClusterMember(cp[start - 1] as number)) start -= 1;\n let end = e;\n while (end < n && isClusterMember(cp[end] as number)) end += 1;\n\n let runs = 0;\n let i = start;\n while (i < end) {\n if (!isDashUnion(cp[i] as number)) {\n i += 1;\n continue;\n }\n runs += 1;\n if (runs >= 2) return true;\n while (i < end && isDashUnion(cp[i] as number)) i += 1;\n }\n return false;\n}\n\n/**\n * dashes.md 3.2b — effective neighbour. Step outward across a maximal run of JOINER and return\n * the index of the first code point that is not one, or -1 if the walk leaves the array. Every\n * guard in either rule that inspects a code point outside its own token's dash run must read one\n * of these — see dashes.md 3.2b for why this is forced rather than chosen (CO-S,\n * pipeline-idempotency.md 5.1a).\n */\nexport function effectiveIndex(cp: readonly number[], from: number, step: number): number {\n let i = from;\n while (i >= 0 && i < cp.length && cp[i] === WORD_JOINER) i += step;\n return i >= 0 && i < cp.length ? i : -1;\n}\n\nexport function effectiveNeighbour(cp: readonly number[], from: number, step: number): number {\n const i = effectiveIndex(cp, from, step);\n return i < 0 ? NONE : (cp[i] as number);\n}\n\n/**\n * ranges.md 3.2a CLOSED-SYMBOL (spec 1.3.0) — the symbols conventionally written closed up to a\n * number, as a literal code-point set. Not a Unicode category test: a category makes the verdict\n * depend on which Unicode version a runtime was built against, and the five runtimes must agree\n * (the same argument ranges.md 7.1 makes for DIGIT being ASCII-only). The Currency Symbols block\n * is enumerated by its bounds, which never move.\n */\nexport function isClosedUpSymbol(cp: number): boolean {\n return (\n cp === 0x0024 || // DOLLAR SIGN\n (cp >= 0x00a2 && cp <= 0x00a5) || // CENT, POUND, CURRENCY, YEN\n (cp >= 0x20a0 && cp <= 0x20bf) || // Currency Symbols block\n cp === 0x0025 || // PERCENT SIGN\n cp === 0x2030 || // PER MILLE SIGN\n cp === 0x2031 || // PER TEN THOUSAND SIGN\n cp === 0x00b0 // DEGREE SIGN\n );\n}\n\n/** ranges.md 3.2a — a token's flanks after the closed-up-symbol walk, with the digit runs the\n * guards and the replacement then read. */\nexport interface RangeFlanks {\n /** Index of the DIGIT on each flank: `L\\u2032`/`R\\u2032` in ranges.md 3.2a. */\n readonly left: number;\n readonly right: number;\n /** First index of Lrun and last index of Rrun. */\n readonly a: number;\n readonly b: number;\n /** Index of the matched outer symbol on each side, or -1. `before`/`after` read past these\n * (ranges.md 3.2a), so that G1-G3 judge the text in front of the whole member. */\n readonly outerLeft: number;\n readonly outerRight: number;\n}\n\n/**\n * ranges.md 3.2 and 3.2a — is this token a range candidate, and where are its digit runs?\n * Returns undefined when it is not one, which is the signal that the token belongs to `dashes`.\n *\n * A side consumes a closed-up symbol only when the opposite member repeats the same code point\n * (`$15-$20`, `35%-50%`). An unmatched symbol leaves the flank a non-DIGIT, so `$15-\\u20ac20` and\n * `15-$20` are not candidates and do not change hands.\n */\nexport function rangeFlanks(\n cp: readonly number[],\n left: number,\n right: number,\n): RangeFlanks | undefined {\n const n = cp.length;\n const innerRight =\n isClosedUpSymbol(cp[right] as number) && right + 1 < n && isDigit(cp[right + 1] as number)\n ? (cp[right] as number)\n : undefined;\n const innerLeft =\n isClosedUpSymbol(cp[left] as number) && left > 0 && isDigit(cp[left - 1] as number)\n ? (cp[left] as number)\n : undefined;\n\n const l = innerLeft === undefined ? left : left - 1;\n const r = innerRight === undefined ? right : right + 1;\n if (!isDigit(cp[l] as number) || !isDigit(cp[r] as number)) return undefined;\n\n let a = l;\n while (a > 0 && isDigit(cp[a - 1] as number)) a -= 1;\n let b = r;\n while (b + 1 < n && isDigit(cp[b + 1] as number)) b += 1;\n\n let outerLeft = -1;\n if (innerRight !== undefined) {\n outerLeft = effectiveIndex(cp, a - 1, -1);\n if (outerLeft < 0 || cp[outerLeft] !== innerRight) return undefined;\n }\n let outerRight = -1;\n if (innerLeft !== undefined) {\n outerRight = effectiveIndex(cp, b + 1, 1);\n if (outerRight < 0 || cp[outerRight] !== innerLeft) return undefined;\n }\n\n return { left: l, right: r, a, b, outerLeft, outerRight };\n}\n\n/**\n * dashes.md 3.2 step 8 (T1) — spacing-transition guard. Shared because a `dashes` token\n * becoming spaced can insert a space next to a `ranges` token's digit run (or vice versa is\n * structurally impossible, since `ranges` styles are never `-spaced` in any v1 locale, but the\n * guard is implemented for both regardless of what the current locale data happens to contain —\n * dashes.md 7.11 item 7 notes `dash.range` carries the same five-value enum as\n * `dash.parenthetical`).\n */\n/**\n * T1's reach is transparent to one CLOSED-SYMBOL on either end of a digit run (spec 1.3.0). The\n * digit run this guard protects may be a range member carrying an outer symbol — `$1 - $1--a`,\n * `a--15% - 20%` — and reading the symbol as the neighbour would stop the walk one code point\n * short of the dash it exists to find.\n */\nfunction skipClosedUpSymbol(cp: readonly number[], from: number, step: number): number {\n const i = effectiveIndex(cp, from, step);\n if (i < 0 || !isClosedUpSymbol(cp[i] as number)) return from;\n return i + step;\n}\n\nexport function isSpacingTransitionBlocked(\n cp: readonly number[],\n left: number,\n right: number,\n): boolean {\n const n = cp.length;\n\n // Spec 1.3.0: the reach steps over a CLOSED-SYMBOL that sits between the token and a digit\n // run, because ranges.md 3.2a made that shape a range token — the digit run whose verdict this\n // guard protects is one code point further out than it used to be.\n const l =\n isClosedUpSymbol(cp[left] as number) && left > 0 && isDigit(cp[left - 1] as number)\n ? left - 1\n : left;\n const r =\n isClosedUpSymbol(cp[right] as number) && right + 1 < n && isDigit(cp[right + 1] as number)\n ? right + 1\n : right;\n\n if (isDigit(cp[l] as number)) {\n let d = l;\n while (d > 0 && isDigit(cp[d - 1] as number)) d -= 1;\n const i1 = effectiveIndex(cp, skipClosedUpSymbol(cp, d - 1, -1), -1);\n const one = i1 < 0 ? NONE : (cp[i1] as number);\n const two = i1 < 0 ? NONE : effectiveNeighbour(cp, i1 - 1, -1);\n if (isDashUnion(one)) return true;\n if ((one === SPACE || isNoBreakSpace(one)) && isDashUnion(two)) return true;\n }\n\n if (isDigit(cp[r] as number)) {\n let d = r;\n while (d + 1 < n && isDigit(cp[d + 1] as number)) d += 1;\n const i1 = effectiveIndex(cp, skipClosedUpSymbol(cp, d + 1, 1), 1);\n const one = i1 < 0 ? NONE : (cp[i1] as number);\n const two = i1 < 0 ? NONE : effectiveNeighbour(cp, i1 + 1, 1);\n if (isDashUnion(one)) return true;\n if ((one === SPACE || isNoBreakSpace(one)) && isDashUnion(two)) return true;\n }\n\n return false;\n}\n\nexport interface DashToken {\n /** Start/end (exclusive) of the DASH run itself, in input-array indices. */\n readonly s: number;\n readonly e: number;\n readonly lsp: 0 | 1;\n readonly rsp: 0 | 1;\n /** Index of the code point immediately left/right of the token's content, after walking\n * across any adjacent JOINER run (dashes.md 3.2a). */\n readonly left: number;\n readonly right: number;\n readonly leftCp: number;\n readonly rightCp: number;\n /** Start/end of the full edit span, including outer spacing and any joiner this token is\n * re-entering across (dashes.md 3.2a) — meaningful only when `crossedJoiner` is true, which\n * for a non-digit-flanked token always means \"decline\" (see `findDashTokens`'s own doc). */\n readonly spanStart: number;\n readonly spanEnd: number;\n readonly crossedJoiner: boolean;\n}\n\n/**\n * dashes.md 3.2 steps 1-7 and 3.2a, exactly as they read before the `ranges` split — the common\n * prefix every DASH-run token must pass before either rule's own branch-specific guards run.\n * Returns every token that survives symmetry, content, joiner-crossing, isolation and cluster\n * guards; each rule then filters to the tokens it owns:\n *\n * - `ranges` only ever processes a token whose `leftCp`/`rightCp` are both DIGIT.\n * - `dashes` must decline every such token unconditionally (operator decision, spec 0.5.0) —\n * never reinterpreting a digit-flanked stroke as a parenthetical dash, regardless of whether\n * `ranges` is enabled.\n *\n * A token with `crossedJoiner = true` and non-digit flanks is **not** returned at all (declined\n * inline, exactly as dashes.md 3.2a specifies: \"if a joiner was crossed in any other\n * configuration, emit nothing\") — a joiner is `ranges`' own emission alphabet, and an author who\n * types one next to a dash meant it, exactly as with INERT-DASH.\n */\nexport function findDashTokens(cp: readonly number[]): DashToken[] {\n const n = cp.length;\n const tokens: DashToken[] = [];\n let i = 0;\n\n while (i < n) {\n if (!isDash(cp[i] as number)) {\n i += 1;\n continue;\n }\n\n const s = i;\n let e = s;\n while (e < n && isDash(cp[e] as number)) e += 1;\n i = e;\n\n // dashes.md 3.2 step 2 — a run longer than three is decoration, not a dash.\n if (e - s > 3) continue;\n\n const lsp = s > 0 && cp[s - 1] === SPACE ? 1 : 0;\n const rsp = e < n && cp[e] === SPACE ? 1 : 0;\n\n // dashes.md 3.2 step 4 — symmetry guard.\n if (lsp !== rsp) continue;\n\n // dashes.md 3.2 step 5 — content on both sides, on the same line.\n let left = s - 1 - lsp;\n let right = e + rsp;\n if (left < 0 || right >= n) continue;\n\n // dashes.md 3.2a — joiner neighbours.\n let joinStart = left + 1;\n let joinEnd = right;\n while (left >= 0 && cp[left] === WORD_JOINER) left -= 1;\n while (right < n && cp[right] === WORD_JOINER) right += 1;\n if (left < 0 || right >= n) continue;\n const crossedJoiner = left + 1 !== joinStart || right !== joinEnd;\n joinStart = left + 1;\n joinEnd = right;\n\n const leftCp = cp[left] as number;\n const rightCp = cp[right] as number;\n // dashes.md 3.2a — re-entry across a joiner is only ever a bound range `ranges` produced on\n // an earlier pass. As of spec 1.3.0 that shape includes a matched closed-up symbol on a\n // flank (ranges.md 3.2a), so `$15<J>-<J>$20` re-enters the same way `1914<J>-<J>1918` does;\n // without this a second pass would add a second joiner.\n if (crossedJoiner && rangeFlanks(cp, left, right) === undefined) continue;\n if (isBreak(leftCp) || isBreak(rightCp)) continue;\n\n // dashes.md 3.2 step 6 — isolation guard.\n if (isInertDash(leftCp) || isInertDash(rightCp)) continue;\n if (isDash(leftCp) || isDash(rightCp)) continue;\n if (leftCp === SPACE || isNoBreakSpace(leftCp)) continue;\n if (rightCp === SPACE || isNoBreakSpace(rightCp)) continue;\n\n // dashes.md 3.2 step 7 — cluster guard.\n if (isClusterInert(cp, s, e)) continue;\n\n const spanStart = Math.min(s - lsp, joinStart);\n const spanEnd = Math.max(e + rsp, joinEnd);\n\n tokens.push({\n s,\n e,\n lsp: lsp as 0 | 1,\n rsp: rsp as 0 | 1,\n left,\n right,\n leftCp,\n rightCp,\n spanStart,\n spanEnd,\n crossedJoiner,\n });\n }\n\n return tokens;\n}\n","import { isLetter } from \"../engine/unicode.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\nimport {\n HYPHEN_MINUS,\n HYPHEN,\n MINUS_SIGN,\n EN_DASH,\n buildReplacement,\n isOpenBracket,\n isSpaced,\n isSpacingTransitionBlocked,\n isStripBeforeOrCloseBracket,\n findDashTokens,\n rangeFlanks,\n sameContent,\n type DashStyle,\n} from \"./dash-shared.js\";\n\n/**\n * `dashes` — spec/rules/dashes.md (spec 0.5.0), order 30. Parenthetical-dash processing only,\n * as of spec 0.5.0: numeric/date-range recognition moved to the `ranges` rule (order 25,\n * off by default), which owns `dash.range` and shares this rule's token-scanning and guard\n * machinery via `dash-shared.js`. See dashes.md 1 and 7.11, and ranges.md 1, for why the split\n * happened and why range detection is opt-in rather than fixed structurally.\n *\n * A range candidate is declined here **unconditionally** — never reinterpreted as a\n * parenthetical dash — regardless of whether `ranges` is enabled (operator decision, spec\n * 0.5.0). That was already true of every prior spec version: the range/parenthetical branches\n * have always been mutually exclusive per token, on the same test that now decides which rule a\n * token belongs to rather than which branch of one rule it takes. Spec 1.3.0 widened that test\n * from \"both flanks DIGIT\" to `rangeFlanks` (ranges.md 3.2a), so a token whose members repeat a\n * closed-up symbol — `$15 - $20` — moved from this rule to `ranges`, and therefore from\n * converting by default to converting only when the caller enables `ranges`.\n *\n * Explicit index-based scanning only: no regex anywhere, and every index addresses the\n * code-point array, never a native string (ARCHITECTURE.md 4.1, 4.2).\n */\n\n/** dashes.md 3.1 ROMAN: the seven uppercase Roman-numeral letters only. Lower-case is not a member. */\nfunction isRoman(cp: number): boolean {\n return (\n cp === 0x49 || // I\n cp === 0x56 || // V\n cp === 0x58 || // X\n cp === 0x4c || // L\n cp === 0x43 || // C\n cp === 0x44 || // D\n cp === 0x4d // M\n );\n}\n\n/**\n * dashes.md 3.4 P4 — Roman-numeral veto. A tight dash between two word-bounded ROMAN runs is a\n * range already in its correct Russian form (`в XV—XVII веках`); `ranges` cannot see it, because\n * ranges.md 3.3 needs a DIGIT on each side, so without this the parenthetical branch would space\n * out input that was already right.\n *\n * A veto only: it never converts. Admitting ROMAN runs as range candidates would also fix\n * `XV-XVII`, but it fires on all-caps words built from the same letters (`MIX`, `CIVIL`), and\n * converting is the direction that damages. The miss is recorded in dashes.md 7.10.\n */\nfunction isRomanFlanked(cp: readonly number[], left: number, right: number): boolean {\n const n = cp.length;\n\n if (!isRoman(cp[left] as number) || !isRoman(cp[right] as number)) return false;\n\n let a = left;\n while (a > 0 && isRoman(cp[a - 1] as number)) a -= 1;\n if (a > 0 && isLetter(cp[a - 1] as number)) return false;\n\n let b = right;\n while (b + 1 < n && isRoman(cp[b + 1] as number)) b += 1;\n if (b + 1 < n && isLetter(cp[b + 1] as number)) return false;\n\n return true;\n}\n\nfunction scan(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const edits: Edit[] = [];\n const style: DashStyle = ctx.locale.dash.parenthetical;\n\n for (const token of findDashTokens(cp)) {\n const { s, e, leftCp, rightCp, left, right, lsp, rsp } = token;\n\n // A range candidate is `ranges`' territory, never `dashes`' — declined unconditionally,\n // whether or not `ranges` is enabled (operator decision, spec 0.5.0). Since spec 1.3.0 a\n // candidate may carry a matched closed-up symbol on a flank (ranges.md 3.2a), which is why\n // this is `rangeFlanks` rather than a digit test on both flanks.\n if (rangeFlanks(cp, left, right) !== undefined) continue;\n\n // dashes.md 3.4 P5 — authored en-dash mark-identity veto (spec 0.6.0). A run consisting of\n // exactly one U+2013 is declined unconditionally: every locale, tight or spaced, regardless\n // of `dash.parenthetical`'s target glyph. Unlike P1/P4 this is not conditioned on the\n // replacement that would be chosen — an en-spaced locale's own tight-authored en-dash is\n // just as protected as an em-target locale's, because the failure this guards against\n // (an authored en-dash silently re-spaced into ordinary parenthetical punctuation) can\n // corrupt a range or joint-name reading in an en-spaced locale exactly as it can in an\n // em-target one; only the glyph substitution differs, not the risk. See §8.8 for the\n // fresh-evidence argument this guard rests on and why it does not reopen the pre-0.2.0\n // guards §8.1 retired.\n if (e - s === 1 && cp[s] === EN_DASH) continue;\n\n // dashes.md 3.4 P1 — a bare hyphen-shaped stroke must be spaced (the compound-word guard).\n if (\n e - s === 1 &&\n (cp[s] === HYPHEN_MINUS || cp[s] === HYPHEN || cp[s] === MINUS_SIGN) &&\n lsp === 0\n ) {\n continue;\n }\n // dashes.md 3.4 P4 — Roman-numeral veto.\n if (lsp === 0 && rsp === 0 && isRomanFlanked(cp, left, right)) continue;\n\n // `\"none\"`: the locale has no verified convention, so nothing is substituted.\n if (style === \"none\") continue;\n\n if (isSpaced(style)) {\n // T1: a tight token may not become spaced across a digit run that has a far dash.\n if (lsp === 0 && rsp === 0 && isSpacingTransitionBlocked(cp, left, right)) continue;\n // T2: the emitted U+0020 must not land where `spaces` (order 10) would delete it.\n if (isStripBeforeOrCloseBracket(rightCp)) continue;\n if (isOpenBracket(leftCp)) continue;\n }\n\n // `dashes` never binds: an interrupting dash is exactly where a line may break\n // (dashes.md 3.3.1's binding is `ranges`-only).\n const replacement = buildReplacement(style, false);\n const spanStart = s - lsp;\n const spanEnd = e + rsp;\n if (sameContent(cp, spanStart, spanEnd, replacement)) continue;\n\n edits.push({ start: spanStart, end: spanEnd, replacement, ruleId: \"dashes\" });\n }\n\n return edits;\n}\n\nexport const dashesRule: Rule = {\n id: \"dashes\",\n apply: scan,\n};\n","import type { Edit, Rule, RuleContext } from \"../types.js\";\nimport { NONE } from \"../engine/sentinels.js\";\n\n// spec/rules/ellipsis.md 3.1.\nconst DOT = 0x2e;\nconst ELL = 0x2026;\nconst EXCLAMATION = 0x21;\nconst QUESTION = 0x3f;\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDotlike(cp: number): boolean {\n return cp === DOT || cp === ELL;\n}\n\nfunction isTerminal(cp: number): boolean {\n return cp === EXCLAMATION || cp === QUESTION;\n}\n\nfunction isSameRun(\n cp: readonly number[],\n s: number,\n e: number,\n target: readonly number[],\n): boolean {\n if (e - s !== target.length) return false;\n for (let j = 0; j < target.length; j += 1) {\n if (at(cp, s + j) !== target[j]) return false;\n }\n return true;\n}\n\nexport const ellipsisRule: Rule = {\n id: \"ellipsis\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const n = cp.length;\n const abbreviated = ctx.locale.ellipsis.abbreviatedAfterTerminal;\n const edits: Edit[] = [];\n let i = 0;\n\n while (i < n) {\n if (!isDotlike(at(cp, i))) {\n i += 1;\n continue;\n }\n\n const s = i;\n let e = s;\n let q = 0;\n while (e < n && isDotlike(at(cp, e))) {\n if (at(cp, e) === ELL) q += 1;\n e += 1;\n }\n const k = e - s;\n const left = at(cp, s - 1);\n\n // One decision per run, one edit per run (spec/rules/ellipsis.md 3.3 step 6).\n const target = runTarget(k, q, left, abbreviated);\n if (target !== null && !isSameRun(cp, s, e, target)) {\n edits.push({ start: s, end: e, replacement: target, ruleId: \"ellipsis\" });\n }\n i = e;\n }\n\n return edits;\n },\n};\n\n/** `null` means \"emit nothing\"; otherwise the final form of the whole run. */\nfunction runTarget(\n k: number,\n q: number,\n left: number,\n abbreviated: boolean,\n): readonly number[] | null {\n if (k === 2 && q === 0) {\n // The two-dot run is unconditionally inert where `?..` is the correct output form; that\n // is what stops `?..` ⇄ `?…` from oscillating (spec/rules/ellipsis.md 5).\n if (abbreviated) return null;\n if (isTerminal(left)) return [ELL];\n return null;\n }\n if (k === 1 && q === 0) return null;\n // k = 1 with an existing U+2026, or any run of 2+ containing one: normalise, then decide\n // the abbreviated form on the same span.\n if (abbreviated && isTerminal(left)) return [DOT, DOT];\n return [ELL];\n}\n","import { toCodePoints } from \"../engine/codepoints.js\";\nimport { isLetter, simpleUppercase } from \"../engine/unicode.js\";\nimport { PolytypoError } from \"../errors.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\nimport { NONE } from \"../engine/sentinels.js\";\n\n/**\n * `hyphen` — spec/rules/hyphen.md (spec 0.1.0), order 35.\n *\n * Replaces U+002D with U+2011 inside listed morphological forms. Explicit index-based\n * scanning over the code-point array only: no regex, no native-string indexing\n * (ARCHITECTURE.md 4.1, 4.2).\n */\n\nconst HYPHEN_MINUS = 0x2d;\nconst NON_BREAKING_HYPHEN = 0x2011;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\n/** Not a code point: stands for \"index out of range\" (spec 3.1 `NONE`). */\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\n/** 3.1 `HYPHENISH`. U+2010, U+00AD, U+2012, U+2013, U+2014 are deliberately absent. */\nfunction isHyphenish(cp: number): boolean {\n return cp === HYPHEN_MINUS || cp === NON_BREAKING_HYPHEN;\n}\n\n/**\n * 3.1 `WORDISH` = ALNUM ∪ HYPHENISH. U+2011 is a member on purpose: without it a converted\n * hyphen would flip a neighbouring form's boundary verdict between runs (5).\n */\nfunction isWordish(cp: number): boolean {\n return isDigit(cp) || isLetter(cp) || isHyphenish(cp);\n}\n\n/** 3.4: the three lists, in the order that breaks a length tie. */\ntype ListKind = 0 | 1 | 2;\nconst COMPOUND: ListKind = 0;\nconst PREFIX: ListKind = 1;\nconst SUFFIX: ListKind = 2;\n\ninterface Pattern {\n readonly cps: readonly number[];\n readonly kind: ListKind;\n}\n\nfunction preparePatterns(\n entries: readonly string[],\n field: string,\n kind: ListKind,\n out: Pattern[],\n): void {\n for (const entry of entries) {\n const cps = toCodePoints(entry);\n let hasHyphen = false;\n for (const cp of cps) {\n if (cp === HYPHEN_MINUS) hasHyphen = true;\n }\n if (!hasHyphen) {\n throw new PolytypoError(\n \"POLYTYPO_MALFORMED_LOCALE_DATA\",\n `hyphen.${field} entry \"${entry}\" contains no U+002D; there is nothing for the rule to convert (spec/rules/hyphen.md §2).`,\n );\n }\n out.push({ cps, kind });\n }\n}\n\n/**\n * 3.3 — hyphen-lenient, first-character-lenient literal matching. The hyphen leniency covers\n * `j = 0` too, because a suffix entry begins with its own hyphen and must keep matching after\n * it has been converted.\n */\nfunction matchesAt(cp: readonly number[], a: number, w: readonly number[]): boolean {\n if (a + w.length > cp.length) return false;\n for (let j = 0; j < w.length; j += 1) {\n const p = w[j] as number;\n const c = cp[a + j] as number;\n if (p === HYPHEN_MINUS) {\n if (!isHyphenish(c)) return false;\n continue;\n }\n if (c === p) continue;\n if (j === 0 && isLetter(p) && c === simpleUppercase(p)) continue;\n return false;\n }\n return true;\n}\n\nfunction bind(index: number): Edit {\n return { start: index, end: index + 1, replacement: [NON_BREAKING_HYPHEN], ruleId: \"hyphen\" };\n}\n\n/** 3.4 C — a compound is a whole word. */\nfunction guardCompound(cp: readonly number[], a: number, k: number): boolean {\n const before = at(cp, a - 1);\n if (before !== NONE && isWordish(before)) return false;\n const after = at(cp, a + k);\n return after === NONE || !isWordish(after);\n}\n\n/** 3.4 P — a prefix starts a word and must actually prefix something. */\nfunction guardPrefix(cp: readonly number[], a: number, k: number): boolean {\n const before = at(cp, a - 1);\n if (before !== NONE && isWordish(before)) return false;\n return isLetter(at(cp, a + k));\n}\n\n/** 3.4 S — a suffix must actually suffix something and must end the word. */\nfunction guardSuffix(cp: readonly number[], a: number, k: number): boolean {\n if (!isLetter(at(cp, a - 1))) return false;\n const after = at(cp, a + k);\n return after === NONE || !isWordish(after);\n}\n\nfunction scan(ctx: RuleContext): Edit[] {\n const { hyphen } = ctx.locale;\n // 2: with all three lists empty the rule emits nothing for any input.\n if (\n hyphen.prefixes.length === 0 &&\n hyphen.suffixes.length === 0 &&\n hyphen.compounds.length === 0\n ) {\n return [];\n }\n\n // 3.4: one candidate per index — the longest entry that matches, ties broken compounds,\n // prefixes, suffixes. Sorting once makes the selection a first-hit linear search.\n const patterns: Pattern[] = [];\n preparePatterns(hyphen.compounds, \"compounds\", COMPOUND, patterns);\n preparePatterns(hyphen.prefixes, \"prefixes\", PREFIX, patterns);\n preparePatterns(hyphen.suffixes, \"suffixes\", SUFFIX, patterns);\n patterns.sort((a, b) => b.cps.length - a.cps.length || a.kind - b.kind);\n\n const cp = ctx.cp;\n const n = cp.length;\n const edits: Edit[] = [];\n let a = 0;\n while (a < n) {\n let selected: Pattern | undefined;\n for (const pattern of patterns) {\n if (matchesAt(cp, a, pattern.cps)) {\n selected = pattern;\n break;\n }\n }\n if (selected === undefined) {\n a += 1;\n continue;\n }\n\n // 3.4: matching and guarding are separate steps, and there is no backtracking. A guard\n // failure ends the position; no shorter entry is tried at `a`.\n const w = selected.cps;\n const k = w.length;\n if (selected.kind === COMPOUND) {\n if (!guardCompound(cp, a, k)) {\n a += 1;\n continue;\n }\n for (let j = 0; j < k; j += 1) {\n if (w[j] === HYPHEN_MINUS && cp[a + j] === HYPHEN_MINUS) edits.push(bind(a + j));\n }\n } else if (selected.kind === PREFIX) {\n if (!guardPrefix(cp, a, k)) {\n a += 1;\n continue;\n }\n // The entry's own last code point is the hyphen.\n if (w[k - 1] === HYPHEN_MINUS && cp[a + k - 1] === HYPHEN_MINUS) edits.push(bind(a + k - 1));\n } else {\n if (!guardSuffix(cp, a, k)) {\n a += 1;\n continue;\n }\n // A suffix is matched at its own hyphen.\n if (w[0] === HYPHEN_MINUS && cp[a] === HYPHEN_MINUS) edits.push(bind(a));\n }\n a += k;\n }\n return edits;\n}\n\nexport const hyphenRule: Rule = {\n id: \"hyphen\",\n apply: scan,\n};\n","import { toCodePoints } from \"../engine/codepoints.js\";\nimport { isLetter, isUpper, simpleUppercase } from \"../engine/unicode.js\";\nimport { PolytypoError } from \"../errors.js\";\nimport type { Edit, InitialBinding, LocaleData, Rule, RuleContext } from \"../types.js\";\nimport { LINE_MARKER, MARKER, NONE } from \"../engine/sentinels.js\";\n\n/**\n * `nbsp` — spec/rules/nbsp.md (spec 0.1.0), order 70 (last).\n *\n * Ten sub-rules, N1…N10, evaluated in that fixed order; each claims indices, and the first\n * claim at an index wins (spec 3.2). The claim table is a positional array, never a map:\n * a map-iteration implementation would resolve conflicts differently in Go\n * (ARCHITECTURE.md 4.5). No regex, no native-string indexing (ARCHITECTURE.md 4.1, 4.2).\n */\n\nconst SPACE = 0x20;\nconst TAB = 0x09;\nconst NBSP = 0xa0;\nconst NNBSP = 0x202f;\nconst FULL_STOP = 0x2e;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\nconst PAREN_OPEN = 0x28;\nconst SQUARE_OPEN = 0x5b;\nconst BRACE_OPEN = 0x7b;\nconst PAREN_CLOSE = 0x29;\nconst SQUARE_CLOSE = 0x5d;\nconst BRACE_CLOSE = 0x7d;\n\nconst SEMICOLON = 0x3b;\nconst AMPERSAND = 0x26;\nconst HASH = 0x23;\n/** The longest HTML named reference is 31 code points (`CounterClockwiseContourIntegral`). */\nconst MAX_CHARACTER_REFERENCE_NAME = 32;\n\nconst EN_DASH = 0x2013;\nconst EM_DASH = 0x2014;\nconst ELLIPSIS = 0x2026;\n\n/** Not a code point: stands for \"index out of range\" (spec 3.1 `NONE`). */\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nexport function at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\nfunction isAlnum(cp: number): boolean {\n return isDigit(cp) || isLetter(cp);\n}\n\n/** 3.1 `BREAK`. */\n/** `BREAK` — including `LINE_MARKER`, a member for every rule everywhere (modes.md 3.2). */\nfunction isBreak(cp: number): boolean {\n return (\n cp === 0x0a ||\n cp === 0x0d ||\n cp === 0x0b ||\n cp === 0x0c ||\n cp === 0x85 ||\n cp === 0x2028 ||\n cp === 0x2029 ||\n cp === LINE_MARKER\n );\n}\n\nfunction isNoBreak(cp: number): boolean {\n return cp === NBSP || cp === NNBSP;\n}\n\n/**\n * 3.1 `OTHER-SPACE`: the fixed-width spaces. In `SPACELIKE`, so they read as a boundary, but\n * never converted and never an \"already correct\" state — §4 promises a thin or figure space\n * the author placed is left exactly where it is.\n */\nfunction isOtherSpace(cp: number): boolean {\n return (cp >= 0x2000 && cp <= 0x200a) || cp === 0x205f || cp === 0x3000;\n}\n\n/**\n * 3.1 `SPACELIKE` — and `NOBREAK ⊂ SPACELIKE`. Every boundary test in this rule uses this\n * predicate and never U+0020 alone; that single decision is what makes the rule idempotent.\n */\nexport function isSpaceLike(cp: number): boolean {\n return cp === SPACE || isNoBreak(cp) || cp === TAB || isOtherSpace(cp) || isBreak(cp);\n}\n\n/**\n * 3.1 `SENTENCE-DASH` — U+2013 and U+2014 only, the left boundary of N3, N9 and N10.\n *\n * A hyphen is deliberately excluded, U+002D and U+2011 alike: it marks an *intra-word*\n * position, so the token after it is not a free-standing word. With U+2011 accepted, `из-за\n * дождя` bound twice — `hyphen` produced `из‑за` and N3 then read the compound's tail `за` as\n * the listed preposition (3.5 step 2). An em or en dash does open a phrase, so `— в Москве`\n * still binds.\n */\nfunction isSentenceDash(cp: number): boolean {\n return cp === EN_DASH || cp === EM_DASH;\n}\n\ninterface QuoteTarget {\n readonly open: number;\n readonly close: number;\n readonly target: number;\n}\n\n/** Locale data, resolved to code points once per call. No module-level state (ARCHITECTURE.md 7). */\nexport interface Prepared {\n readonly beforePunctuation: readonly number[];\n readonly narrowBeforePunctuation: readonly number[];\n readonly shortWords: readonly (readonly number[])[];\n readonly abbreviations: readonly (readonly number[])[];\n readonly units: readonly (readonly number[])[];\n readonly beforeNumber: readonly (readonly number[])[];\n readonly beforeWord: readonly (readonly number[])[];\n readonly symbols: readonly (readonly number[])[];\n readonly initialBinding: InitialBinding;\n readonly opens: readonly number[];\n readonly closes: readonly number[];\n readonly quotePairs: readonly QuoteTarget[];\n /** nbsp.md §3.1a NARROW-TARGET: what N2 writes, and what N8 writes for a `narrow-nbsp` pair. */\n readonly narrowTarget: number;\n}\n\nfunction malformed(message: string): never {\n throw new PolytypoError(\"POLYTYPO_MALFORMED_LOCALE_DATA\", message);\n}\n\nfunction singleCodePoint(entry: string, field: string): number {\n const cps = toCodePoints(entry);\n const first = cps[0];\n if (cps.length !== 1 || first === undefined) {\n malformed(`nbsp.${field} entry \"${entry}\" is not exactly one code point.`);\n }\n return first;\n}\n\nfunction contains(list: readonly number[], cp: number): boolean {\n for (const value of list) {\n if (value === cp) return true;\n }\n return false;\n}\n\n/** Longest first, so each sub-rule's \"longest match wins at a given `a`\" is a linear search. */\nfunction prepareList(entries: readonly string[]): (readonly number[])[] {\n const out = entries.map((entry) => toCodePoints(entry));\n out.sort((a, b) => b.length - a.length);\n return out;\n}\n\n/**\n * nbsp.md §3.1a: `narrowTarget` is NARROW-TARGET, already resolved by the caller — U+202F by\n * default, U+00A0 when `narrowNbsp: \"nbsp\"`. It is threaded into `prepare` so N2's and N8's\n * targets move together; nothing else in this rule changes, and §5's idempotency argument carries\n * over because every sub-rule's \"already correct\" branch recognises its own target.\n */\nexport function prepare(locale: LocaleData, narrowTarget: number = NNBSP): Prepared {\n const data = locale.nbsp;\n const beforePunctuation = data.beforePunctuation.map((entry) =>\n singleCodePoint(entry, \"beforePunctuation\"),\n );\n const narrowBeforePunctuation = data.narrowBeforePunctuation.map((entry) =>\n singleCodePoint(entry, \"narrowBeforePunctuation\"),\n );\n // 2: the two arrays must be disjoint. The schema does not enforce it, and picking a winner\n // silently would make N1's precedence load-bearing where the spec says it must not be.\n for (const cp of beforePunctuation) {\n if (contains(narrowBeforePunctuation, cp)) {\n malformed(\n `nbsp.beforePunctuation and nbsp.narrowBeforePunctuation both list U+${cp.toString(16).toUpperCase().padStart(4, \"0\")}; they must be disjoint (spec/rules/nbsp.md §2).`,\n );\n }\n }\n\n const primary = locale.quotes.primary;\n const secondary = locale.quotes.secondary;\n const opens = [\n PAREN_OPEN,\n SQUARE_OPEN,\n BRACE_OPEN,\n singleCodePoint(primary.open, \"quotes.primary.open\"),\n singleCodePoint(secondary.open, \"quotes.secondary.open\"),\n ];\n const closes = [\n PAREN_CLOSE,\n SQUARE_CLOSE,\n BRACE_CLOSE,\n singleCodePoint(primary.close, \"quotes.primary.close\"),\n singleCodePoint(secondary.close, \"quotes.secondary.close\"),\n ];\n\n const quotePairs: QuoteTarget[] = [];\n for (const pair of [primary, secondary]) {\n if (pair.innerSpace === \"none\") continue;\n const open = singleCodePoint(pair.open, \"quotes.open\");\n const close = singleCodePoint(pair.close, \"quotes.close\");\n // 3.10 sidedness precondition: an open glyph equal to its close glyph cannot be told\n // apart without the pairing information only `quotes` has. Documented no-op (§7.5).\n if (open === close) continue;\n quotePairs.push({ open, close, target: pair.innerSpace === \"nbsp\" ? NBSP : narrowTarget });\n }\n\n return {\n beforePunctuation,\n narrowBeforePunctuation,\n shortWords: prepareList(data.afterShortWords),\n abbreviations: prepareList(data.abbreviations),\n units: prepareList(data.beforeUnits),\n beforeNumber: prepareList(data.beforeNumber),\n beforeWord: prepareList(data.beforeWord),\n symbols: prepareList(data.afterSymbols),\n initialBinding: data.initialBinding,\n opens,\n closes,\n quotePairs,\n narrowTarget,\n };\n}\n\n/**\n * 3.1 `OPENISH` / `CLOSEISH`: the ASCII brackets plus every locale quote glyph.\n *\n * The inline span boundary `MARKER` is in `CLOSEISH` and not in `OPENISH` (spec 1.2.0, nbsp.md\n * §7 item 12, modes.md 3.3). `CLOSEISH` is read only by N1/N2's right-context guard, where the\n * marker lets the no-break space come back after `spaces` deleted the typed one in\n * `<strong>gel :</strong>`. In `OPENISH` it would make the quote-glyph guard decline\n * `<em>non</em> !`.\n */\nexport function isOpenish(prep: Prepared, cp: number): boolean {\n return contains(prep.opens, cp);\n}\n\nfunction isCloseish(prep: Prepared, cp: number): boolean {\n return cp === MARKER || contains(prep.closes, cp);\n}\n\nfunction isMark(prep: Prepared, cp: number): boolean {\n return contains(prep.beforePunctuation, cp) || contains(prep.narrowBeforePunctuation, cp);\n}\n\ntype Claims = (Edit | undefined)[];\n\n/** 3.2: the first sub-rule to claim an index wins; every later edit at that index is discarded. */\nfunction claimConversion(claims: Claims, index: number, target: number): void {\n if (claims[index] !== undefined) return;\n claims[index] = { start: index, end: index + 1, replacement: [target], ruleId: \"nbsp\" };\n}\n\nfunction claimInsertion(claims: Claims, index: number, target: number): void {\n if (claims[index] !== undefined) return;\n claims[index] = { start: index, end: index, replacement: [target], ruleId: \"nbsp\" };\n}\n\ntype Matcher = (cp: readonly number[], a: number, w: readonly number[]) => boolean;\n\nfunction matchExact(cp: readonly number[], a: number, w: readonly number[]): boolean {\n if (a + w.length > cp.length) return false;\n for (let j = 0; j < w.length; j += 1) {\n if (cp[a + j] !== w[j]) return false;\n }\n return true;\n}\n\n/** 3.5 step 1: exact except that the first code point may be its simple uppercase mapping. */\nfunction matchFirstCharLenient(cp: readonly number[], a: number, w: readonly number[]): boolean {\n if (a + w.length > cp.length) return false;\n const first = w[0];\n if (first === undefined) return false;\n const head = cp[a];\n if (head !== first && head !== simpleUppercase(first)) return false;\n for (let j = 1; j < w.length; j += 1) {\n if (cp[a + j] !== w[j]) return false;\n }\n return true;\n}\n\n/** 3.6 step 1: exact except that a pattern U+0020 also matches U+00A0 or U+202F. */\nfunction matchSpaceLenient(cp: readonly number[], a: number, w: readonly number[]): boolean {\n if (a + w.length > cp.length) return false;\n for (let j = 0; j < w.length; j += 1) {\n const p = w[j] as number;\n const c = cp[a + j] as number;\n if (c === p) continue;\n if (p === SPACE && isNoBreak(c)) continue;\n return false;\n }\n return true;\n}\n\n/**\n * 3.5, normative for N3, N4, N5, N6, N9 and N10: the longest entry that matches at `a` is\n * selected, the sub-rule's guards are applied to *that* entry, and there is no backtracking —\n * a shorter entry is never retried when the longest one fails a guard.\n */\nfunction longestMatch(\n patterns: readonly (readonly number[])[],\n cp: readonly number[],\n a: number,\n matcher: Matcher,\n): readonly number[] | undefined {\n for (const w of patterns) {\n if (matcher(cp, a, w)) return w;\n }\n return undefined;\n}\n\n/** N1 (3.3) and N2 (3.4) differ only in which no-break space is the target. */\nfunction punctuationSubRule(\n cp: readonly number[],\n prep: Prepared,\n claims: Claims,\n marks: readonly number[],\n target: number,\n other: number,\n): void {\n if (marks.length === 0) return;\n for (let i = 0; i < cp.length; i += 1) {\n if (!contains(marks, cp[i] as number)) continue;\n const left = at(cp, i - 1);\n // Step 1 — run guard: only the first mark of `?!` or `!!!` takes the space.\n if (left !== NONE && isMark(prep, left)) continue;\n // Step 2 — right-context guard: this is what protects `http://` and `12:30`.\n const after = at(cp, i + 1);\n // U+2026 is accepted: the guard exists to catch punctuation *inside a token*, and an\n // ellipsis after a question mark is not that. `Vraiment?…` must take the same space\n // `Vraiment ?` does, whether or not `ellipsis` (order 20) has already run.\n if (\n after !== NONE &&\n !isSpaceLike(after) &&\n !isCloseish(prep, after) &&\n after !== ELLIPSIS &&\n !isMark(prep, after)\n ) {\n continue;\n }\n // Step 3 — quote-glyph guard. The space beside an opening quotation glyph is\n // `quotes.innerSpace` and belongs to N8 alone. Without this, N2 and N8 want different\n // code points at one index, and \"already correct\" claims nothing, so the two alternate\n // for ever on the French input `«?` (3.2, 3.10.1).\n if (isOpenish(prep, left)) continue;\n if (left !== NONE && isSpaceLike(left) && isOpenish(prep, at(cp, i - 2))) continue;\n // Step 4 (spec 1.3.0) — character-reference guard. In text mode there is no markup concept\n // at all, so `fr`, whose narrowBeforePunctuation lists `;`, used to insert U+202F before the\n // `;` that *ends* a reference: `Bonjour : oui` and `Tom & Jerry` stopped being what\n // they were. Shape, not the named-reference table: declining on `¬aname;` costs nothing,\n // and five runtimes are not going to carry thousands of identical entries for it.\n if (cp[i] === SEMICOLON && endsCharacterReference(cp, i)) continue;\n // Step 5.\n if (left === target) continue;\n if (left === SPACE || left === other) {\n claimConversion(claims, i - 1, target);\n continue;\n }\n // A fixed-width space stays as typed, and nothing is inserted beside it.\n if (isOtherSpace(left)) continue;\n if (left === NONE || isBreak(left) || left === TAB) continue;\n claimInsertion(claims, i, target);\n }\n}\n\n/**\n * 3.3 step 4: do the code points left of this `;` have the shape of a character reference?\n * A bounded left walk over ASCII alphanumerics, optionally one `#`, then `&`. The bound is the\n * longest named reference (31) plus one, so the walk cannot run away down a long token.\n */\nfunction endsCharacterReference(cp: readonly number[], i: number): boolean {\n let j = i - 1;\n while (j >= 0 && isAsciiAlphanumeric(cp[j] as number)) j -= 1;\n const len = i - 1 - j;\n if (len < 1 || len > MAX_CHARACTER_REFERENCE_NAME) return false;\n if (j >= 0 && cp[j] === HASH) j -= 1;\n return j >= 0 && cp[j] === AMPERSAND;\n}\n\nfunction isAsciiAlphanumeric(c: number): boolean {\n return (c >= 0x30 && c <= 0x39) || (c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a);\n}\n\n/** N3 — 3.5 `afterShortWords`. */\nfunction shortWordsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n if (prep.shortWords.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(prep.shortWords, cp, a, matchFirstCharLenient);\n if (w === undefined) continue;\n const k = w.length;\n const before = at(cp, a - 1);\n if (!(\n before === NONE ||\n isSpaceLike(before) ||\n isOpenish(prep, before) ||\n isSentenceDash(before)\n )) {\n continue;\n }\n const separator = at(cp, a + k);\n if (separator === NBSP) continue;\n if (separator !== SPACE) continue;\n const next = at(cp, a + k + 1);\n if (!isAlnum(next) && !isOpenish(prep, next)) continue;\n claimConversion(claims, a + k, NBSP);\n }\n}\n\n/** N4 — 3.6 `abbreviations`. */\nfunction abbreviationsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n if (prep.abbreviations.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(prep.abbreviations, cp, a, matchSpaceLenient);\n if (w === undefined) continue;\n const k = w.length;\n if (isAlnum(at(cp, a - 1))) continue;\n if (isAlnum(at(cp, a + k))) continue;\n for (let j = 0; j < k; j += 1) {\n if (w[j] !== SPACE) continue;\n if (cp[a + j] === NBSP) continue;\n claimConversion(claims, a + j, NBSP);\n }\n }\n}\n\n/** N5 — 3.7 `beforeUnits`. Converts an existing space; never inserts one (§7.2). */\nfunction unitsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n if (prep.units.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(prep.units, cp, a, matchExact);\n if (w === undefined) continue;\n const k = w.length;\n if (isAlnum(at(cp, a + k))) continue;\n const left = at(cp, a - 1);\n if (left === NBSP) continue;\n if (left !== SPACE) continue;\n if (!isDigit(at(cp, a - 2))) continue;\n let b = a - 2;\n while (b - 1 >= 0 && isDigit(cp[b - 1] as number)) b -= 1;\n // The letter guard: `H2 O`, `A4`, `MP3` are not measurements.\n if (isLetter(at(cp, b - 1))) continue;\n claimConversion(claims, a - 1, NBSP);\n }\n}\n\n/** N6 — 3.8 `afterSymbols`. Conversion only. */\nfunction symbolsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n if (prep.symbols.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(prep.symbols, cp, a, matchExact);\n if (w === undefined) continue;\n const k = w.length;\n if (isAlnum(at(cp, a - 1))) continue;\n const separator = at(cp, a + k);\n if (separator === NBSP) continue;\n if (separator !== SPACE) continue;\n if (!isDigit(at(cp, a + k + 1))) continue;\n claimConversion(claims, a + k, NBSP);\n }\n}\n\n/** 3.9: one uppercase letter, one full stop, at a token start. */\nexport function isInitialAt(cp: readonly number[], prep: Prepared, p: number): boolean {\n if (p < 0) return false;\n if (!isUpper(at(cp, p))) return false;\n if (at(cp, p + 1) !== FULL_STOP) return false;\n const before = at(cp, p - 1);\n return before === NONE || isSpaceLike(before) || isOpenish(prep, before);\n}\n\n/**\n * 3.9 guard C1-a: an uppercase letter plus a dot that is itself preceded by a *lower-case*\n * letter plus a dot is the second token of an abbreviation, not an initial. Without it the\n * shipped `de-DE` data turns `z. B. Berlin` into `z.⍽B.⍽Berlin` — a false positive on\n * ordinary prose. `А. С. Пушкин` is unaffected: `cp[p-3]` there is uppercase.\n */\nexport function isAbbreviationTail(cp: readonly number[], p: number): boolean {\n if (!isSpaceLike(at(cp, p - 1))) return false;\n if (at(cp, p - 2) !== FULL_STOP) return false;\n const head = at(cp, p - 3);\n return isLetter(head) && !isUpper(head);\n}\n\n/**\n * 3.9 chain confirmation: is the initial whose letter sits at `p` itself immediately preceded by\n * another initial (`cp[p-1]` space-like, `cp[p-2]` a full stop, and `isInitialAt(p-3)`)? Used only\n * by `\"chain\"` mode's C1, to require Chicago's own \"two or more initials\" before the space\n * leading into a following non-initial word (a candidate surname) is bound — see nbsp.md §3.9.\n */\nexport function hasPrecedingInitial(cp: readonly number[], prep: Prepared, p: number): boolean {\n const gap = at(cp, p - 1);\n if (gap !== SPACE && gap !== NBSP) return false;\n if (at(cp, p - 2) !== FULL_STOP) return false;\n return isInitialAt(cp, prep, p - 3);\n}\n\n/** N7 — 3.9 `initialBinding`. */\nfunction initialsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n const mode: InitialBinding = prep.initialBinding;\n if (mode === \"none\") return;\n for (let q = 0; q < cp.length; q += 1) {\n const here = cp[q] as number;\n if (here !== SPACE && here !== NBSP) continue;\n // C1 — an initial on the left and an uppercase letter on the right, unless C1-a declines.\n const leftInitialP = q - 2;\n const c1Shape =\n at(cp, q - 1) === FULL_STOP &&\n isInitialAt(cp, prep, leftInitialP) &&\n isUpper(at(cp, q + 1)) &&\n !isAbbreviationTail(cp, leftInitialP);\n // `\"chain\"` mode additionally requires either that the right side is itself an initial (the\n // between-initials case, e.g. `E.|B.`, always safe) or that the left initial is itself\n // preceded by another initial (a confirmed chain of two or more, e.g. `E. B.|White`) before\n // binding to a plain following word. `\"single\"` mode keeps the unconditional shape check —\n // that is the behaviour `fr`/`fr-CA` need for `N. Bourbaki`/`M. Dupont` (nbsp.md §3.9,\n // Jacques André) and cannot structurally distinguish from a sentence-boundary collision.\n const c1 =\n c1Shape &&\n (mode === \"single\" ||\n isInitialAt(cp, prep, q + 1) ||\n hasPrecedingInitial(cp, prep, leftInitialP));\n // C2 — a word on the left and two consecutive initials on the right (`Пушкин А. С.`). Already\n // requires two initials by construction, so it is unaffected by `\"chain\"` vs `\"single\"`.\n const rightSpace = at(cp, q + 3);\n const c2 =\n isLetter(at(cp, q - 1)) &&\n isInitialAt(cp, prep, q + 1) &&\n (rightSpace === SPACE || rightSpace === NBSP) &&\n isInitialAt(cp, prep, q + 4);\n if (!c1 && !c2) continue;\n if (here === NBSP) continue;\n claimConversion(claims, q, NBSP);\n }\n}\n\n/** N8 — 3.10 `quotes.innerSpace`. The only sub-rule besides N1/N2 that may insert. */\nfunction quotesSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n for (const pair of prep.quotePairs) {\n for (let i = 0; i < cp.length; i += 1) {\n const here = cp[i] as number;\n if (here === pair.open) {\n const right = at(cp, i + 1);\n if (right === pair.target) continue;\n if (right === SPACE || isNoBreak(right)) {\n claimConversion(claims, i + 1, pair.target);\n continue;\n }\n if (right === NONE || isBreak(right)) continue;\n claimInsertion(claims, i + 1, pair.target);\n continue;\n }\n if (here !== pair.close) continue;\n const left = at(cp, i - 1);\n if (left === pair.target) continue;\n if (left === SPACE || isNoBreak(left)) {\n claimConversion(claims, i - 1, pair.target);\n continue;\n }\n if (left === NONE || isBreak(left)) continue;\n claimInsertion(claims, i, pair.target);\n }\n }\n}\n\n/**\n * N9 (3.12 `beforeNumber`) and N10 (3.13 `beforeWord`) share every guard except what must\n * follow the separator: a digit for N9, a letter for N10.\n */\nfunction forwardBindingSubRule(\n cp: readonly number[],\n prep: Prepared,\n claims: Claims,\n patterns: readonly (readonly number[])[],\n wantsDigit: boolean,\n): void {\n if (patterns.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(patterns, cp, a, matchExact);\n if (w === undefined) continue;\n const k = w.length;\n // G-D (3.13 step 5): in a locale where N7 is active, an *uppercase* letter plus a dot is\n // structurally an initial, and N7 owns that shape with better evidence. The UPPER test is\n // load-bearing: without it Russian `г.` would be inert, contradicting §6 case 13a.\n if (\n !wantsDigit &&\n prep.initialBinding !== \"none\" &&\n k === 2 &&\n isUpper(w[0] as number) &&\n w[1] === FULL_STOP\n ) {\n continue;\n }\n // G-L — stronger than \"not ALNUM\": it is what stops `S.` matching inside `Fig.S. 3`.\n const before = at(cp, a - 1);\n if (!(\n before === NONE ||\n isSpaceLike(before) ||\n isOpenish(prep, before) ||\n isSentenceDash(before)\n )) {\n continue;\n }\n // G-S — exactly one separator, and it must already be a space.\n const separator = at(cp, a + k);\n if (separator === NBSP) continue;\n if (separator !== SPACE) continue;\n const next = at(cp, a + k + 1);\n if (isSpaceLike(next)) continue;\n // G-W / \"a following number\": one code point, tested for membership. `NONE` fails both,\n // which is also the line-boundary guard G-B.\n if (wantsDigit ? !isDigit(next) : !isLetter(next)) continue;\n claimConversion(claims, a + k, NBSP);\n }\n}\n\nfunction scan(ctx: RuleContext): Edit[] {\n const prep = prepare(ctx.locale, ctx.narrowTarget);\n const cp = ctx.cp;\n const claims: Claims = new Array<Edit | undefined>(cp.length + 1);\n\n // 3.2 — N1 … N10, in this order, first claim wins. The order is positional and total, not\n // an artefact of iterating a map.\n //\n // First claim wins only settles a conflict when both sub-rules emit; an \"already correct\"\n // branch claims nothing and yields the index. So sub-rules wanting *different* code points\n // must be disjoint by construction. They are: N3…N7, N9 and N10 all target U+00A0, so any\n // yield between them is a common fixed point. The only cross-target pairs are N1 against N2\n // — kept disjoint by the §2 precondition, which fails loudly — and N1/N2 against N8, which\n // is what the quote-glyph guard above repairs.\n punctuationSubRule(cp, prep, claims, prep.beforePunctuation, NBSP, NNBSP);\n // N2's target is NARROW-TARGET (§3.1a); `other` is the NOBREAK member that is not the target,\n // which is what the sub-rule converts. With the substitution on, N2 and N1 want the same\n // character — never different ones, which is why §5's clause 0 needs no new case.\n punctuationSubRule(\n cp,\n prep,\n claims,\n prep.narrowBeforePunctuation,\n prep.narrowTarget,\n prep.narrowTarget === NBSP ? NNBSP : NBSP,\n );\n shortWordsSubRule(cp, prep, claims);\n abbreviationsSubRule(cp, prep, claims);\n unitsSubRule(cp, prep, claims);\n symbolsSubRule(cp, prep, claims);\n initialsSubRule(cp, prep, claims);\n quotesSubRule(cp, prep, claims);\n forwardBindingSubRule(cp, prep, claims, prep.beforeNumber, true);\n forwardBindingSubRule(cp, prep, claims, prep.beforeWord, false);\n\n const edits: Edit[] = [];\n for (let i = 0; i <= cp.length; i += 1) {\n const claim = claims[i];\n if (claim !== undefined) edits.push(claim);\n }\n return edits;\n}\n\nexport const nbspRule: Rule = {\n id: \"nbsp\",\n apply: scan,\n};\n","import { toCodePoints } from \"../engine/codepoints.js\";\nimport { isLetter } from \"../engine/unicode.js\";\nimport { MARKER, NONE } from \"../engine/sentinels.js\";\nimport type { ElisionClitics, ElisionIdiom } from \"../types.js\";\n\n/**\n * The structural predicates `quotes` (order 40) reads to decline a pairing — quotes.md 3.2.\n *\n * Two mechanisms, both decline-only, both with the same outcome: the marks survive pass 2\n * unmatched and `apostrophe` (order 50) converts each by its own case ladder (apostrophe.md 3.3\n * cases 4 then 3), giving `rock ’n’ roll`.\n *\n * {@link computeIdiomMatchedIndices} is the locale-cited mechanism (spec 0.4.0): an exact\n * `left`/`elided`/`right` context match against `quotes.elisionIdioms`.\n *\n * {@link computeAmbiguousShapeIndices} is the universal medial-`n` veto (spec 1.1.0): a pair of\n * `NARROW` marks enclosing exactly one code point, U+006E `n` or U+004E `N`, with at least one\n * `INLINE-SPACE` code point immediately outside each mark. It needs no citation because the\n * operator ruled the idiom international (quotes.md 3.2, 2026-09-09), and it vetoes a superset of\n * what the cited en-US entry does.\n *\n * {@link computeSpanBoundaryVetoIndices} is the span-boundary elision veto (spec 1.4.0): a\n * `NARROW` mark whose literal left or right neighbour IS modes.md 3.2's inline boundary marker,\n * with a cited `quotes.elisionClitics` fragment attaching on its other side. It exists because\n * the two mechanisms above both need a real code point on each side, so a possessive or elision\n * written flush against a span (`` `x`'s ``, `l'<em>idée</em>`) escaped both and was paired as a\n * quotation, inverting the enclosing pair (canonical issue #53).\n *\n * Only `quotes` consumes this module. Spec 0.5.0 had `apostrophe` consume it too, through a\n * preserve set that stopped its case ladder from converting marks 0.5.0 wanted preserved;\n * conversion is now the specified outcome, so that set is withdrawn (apostrophe.md 3.4) and\n * `apostrophe` reads no locale data again.\n */\n\n/** quotes.md 3.2 — the one code point this veto's span may enclose, in either case. */\nconst LOWER_N = 0x6e;\nconst UPPER_N = 0x4e;\n\n/** quotes.md 3.1 NARROW — the quote-mark glyphs an elision idiom's marks may appear as across\n * pipeline passes (straight, or already curled by an earlier pass). Canonical definition, shared\n * so `quotes` and `apostrophe` cannot define two slightly different NARROW sets. */\nexport const NARROW: ReadonlySet<number> = new Set([\n 0x27, 0x2018, 0x2019, 0x201a, 0x201b, 0x2039, 0x203a,\n]);\n\n/** quotes.md 3.1 INLINE-SPACE — deliberately excludes BREAK, so this shape never crosses a\n * line/span boundary (modes.md 3.3), matching the existing elisionIdioms anchor exactly. */\nconst INLINE_SPACE: ReadonlySet<number> = new Set([\n 0x20, 0x09, 0xa0, 0x202f, 0x2007, 0x2009, 0x200a,\n]);\n\n/** Out-of-range reads yield `NONE`, the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\n/**\n * Case-insensitive-first-code-point comparison, ASCII-only — the same convention\n * `nbsp.afterShortWords` and the existing idiom matcher use (quotes.ts's own `asciiLower`,\n * relocated here so both consumers share one definition).\n */\nfunction asciiLower(cp: number): number {\n return cp >= 0x41 && cp <= 0x5a ? cp + 0x20 : cp;\n}\n\nfunction isAlnum(cp: number): boolean {\n const DIGIT_ZERO = 0x30;\n const DIGIT_NINE = 0x39;\n return (cp >= DIGIT_ZERO && cp <= DIGIT_NINE) || isLetter(cp);\n}\n\nfunction wordEndsAt(arr: readonly number[], end: number, word: readonly number[]): boolean {\n const start = end - word.length;\n if (start < 0) return false;\n for (let k = 0; k < word.length; k += 1) {\n const c = at(arr, start + k);\n const matches = k === 0 ? asciiLower(c) === asciiLower(word[k] as number) : c === word[k];\n if (!matches) return false;\n }\n const before = start > 0 ? at(arr, start - 1) : NONE;\n return before === NONE || !isAlnum(before);\n}\n\nfunction wordStartsAt(arr: readonly number[], start: number, word: readonly number[]): boolean {\n const n = arr.length;\n for (let k = 0; k < word.length; k += 1) {\n const c = at(arr, start + k);\n const matches = k === 0 ? asciiLower(c) === asciiLower(word[k] as number) : c === word[k];\n if (!matches) return false;\n }\n const after = start + word.length < n ? at(arr, start + word.length) : NONE;\n return after === NONE || !isAlnum(after);\n}\n\ninterface CompiledIdiom {\n readonly left: readonly number[];\n readonly elided: readonly number[];\n readonly right: readonly number[];\n}\n\n/**\n * Listed elision veto (quotes.md 3.2, spec 0.4.0), locale data `quotes.elisionIdioms`. Bounded\n * literal scan for `left, NARROW, elided, NARROW, right` (`rock 'n' roll`'s `{left: \"rock\",\n * elided: \"n\", right: \"roll\"}`). Both marks of a match are returned. Matches on NARROW quote\n * marks generally (U+0027 and already-curly U+2018/U+2019), not only straight ASCII — this is\n * `quotes`' own idempotency requirement (an idiom must still veto pairing on a second pipeline\n * pass, after `apostrophe` has curled the marks) and is unchanged from spec 0.4.0/0.4.1.\n */\nexport function computeIdiomMatchedIndices(\n arr: readonly number[],\n idioms: readonly ElisionIdiom[],\n): ReadonlySet<number> {\n const vetoed = new Set<number>();\n if (idioms.length === 0) return vetoed;\n\n const n = arr.length;\n const compiled: readonly CompiledIdiom[] = idioms.map((idiom) => ({\n left: toCodePoints(idiom.left),\n elided: toCodePoints(idiom.elided),\n right: toCodePoints(idiom.right),\n }));\n\n for (let i = 0; i < n; i += 1) {\n const g = at(arr, i);\n if (!NARROW.has(g)) continue;\n\n const lLit = i > 0 ? at(arr, i - 1) : NONE;\n if (lLit === NONE || !INLINE_SPACE.has(lLit)) continue;\n\n for (const idiom of compiled) {\n const k = idiom.elided.length;\n const j = i + 1 + k;\n if (j >= n) continue;\n\n let elidedMatches = true;\n for (let w = 0; w < k; w += 1) {\n if (at(arr, i + 1 + w) !== idiom.elided[w]) {\n elidedMatches = false;\n break;\n }\n }\n if (!elidedMatches) continue;\n if (!NARROW.has(at(arr, j))) continue;\n\n const rLit = j + 1 < n ? at(arr, j + 1) : NONE;\n if (rLit === NONE || !INLINE_SPACE.has(rLit)) continue;\n\n if (!wordEndsAt(arr, i - 1, idiom.left)) continue;\n if (!wordStartsAt(arr, j + 2, idiom.right)) continue;\n\n vetoed.add(i);\n vetoed.add(j);\n }\n }\n\n return vetoed;\n}\n\n/**\n * The universal medial-`n` elision shape, locale-independent (spec 1.1.0, quotes.md 3.2): a pair\n * of `NARROW` marks enclosing exactly one code point, U+006E `n` or U+004E `N`, with **at least\n * one** `INLINE-SPACE` code point immediately outside each mark. A longer run of inline spaces\n * (`rock 'n' roll`) still matches, since only the single adjacent code point is tested; the\n * \"exactly one\" variant would let a doubled-space `rock 'n' roll` fall through to ordinary\n * quote-pairing. Both mark positions are returned for every match.\n *\n * **`NARROW`, not `SQ`, and that is an idempotency obligation rather than a preference.** This\n * veto's marks are converted to U+2019 by `apostrophe`, so a straight-ASCII-only predicate would\n * not recognise its own output and pass 2 would pair `rock ’n’ roll` as an ordinary `NARROW`\n * quotation on the next pipeline run — measured, with a straight-only predicate, as\n * `rock «n» roll` in `ru` and `rock ”n” roll` in `fi`. Spec 0.5.0's predicate was straight-only,\n * correctly for its own preserve-then-stop outcome; inverting the outcome forces the widening.\n * `apostrophe` emits U+2019 only in place of U+0027, so a span already written with real marks is\n * matched and then left exactly as the author typed it.\n *\n * A superset of {@link computeIdiomMatchedIndices}'s output for every idiom whose `elided` field\n * is a single `n`, which is every idiom shipped so far, but computed independently rather than\n * assumed — a future idiom's `elided` field is not required to be that short.\n */\nexport function computeAmbiguousShapeIndices(cp: readonly number[]): ReadonlySet<number> {\n const ambiguous = new Set<number>();\n const n = cp.length;\n\n for (let i = 0; i < n; i += 1) {\n if (!NARROW.has(at(cp, i))) continue;\n\n const lLit = i > 0 ? at(cp, i - 1) : NONE;\n if (lLit === NONE || !INLINE_SPACE.has(lLit)) continue;\n\n const enclosed = at(cp, i + 1);\n if (enclosed !== LOWER_N && enclosed !== UPPER_N) continue;\n\n const j = i + 2;\n if (!NARROW.has(at(cp, j))) continue;\n\n const rLit = j + 1 < n ? at(cp, j + 1) : NONE;\n if (rLit === NONE || !INLINE_SPACE.has(rLit)) continue;\n\n ambiguous.add(i);\n ambiguous.add(j);\n }\n\n return ambiguous;\n}\n\n/**\n * Span-boundary elision veto (quotes.md 3.2, spec 1.4.0), locale data `quotes.elisionClitics`.\n *\n * Fires only where one literal neighbour is the inline `MARKER`, which is why it is inert in\n * `text` and `yaml` modes — neither produces one. The attaching side is read as a MAXIMAL\n * `LETTER` run bounded by a non-`ALNUM` code point (or `NONE`) and compared whole: a prefix test\n * would match the entry `s` inside `sure` and eat `<em>'sure'</em>`, a genuine quotation.\n *\n * The comparison folds the run's first code point, ASCII A-Z only, and is exact thereafter —\n * the same convention the idiom matcher above uses, never a platform locale function\n * (ARCHITECTURE.md 4.4). Entries are authored lowercase, enforced at the data boundary.\n */\nexport function computeSpanBoundaryVetoIndices(\n arr: readonly number[],\n clitics: ElisionClitics | undefined,\n): ReadonlySet<number> {\n const vetoed = new Set<number>();\n const before = clitics?.before ?? [];\n const after = clitics?.after ?? [];\n if (before.length === 0 && after.length === 0) return vetoed;\n\n const compiled = {\n before: before.map(toCodePoints),\n after: after.map(toCodePoints),\n };\n\n for (let i = 0; i < arr.length; i += 1) {\n if (!NARROW.has(at(arr, i))) continue;\n if (at(arr, i - 1) === MARKER && runMatches(arr, i, 1, compiled.after)) {\n vetoed.add(i);\n continue;\n }\n if (at(arr, i + 1) === MARKER && runMatches(arr, i, -1, compiled.before)) {\n vetoed.add(i);\n }\n }\n return vetoed;\n}\n\n/**\n * The maximal `LETTER` run adjacent to the mark at `i` in direction `dir`, compared against\n * `entries`. Returns false for an empty run, for a run the caller's own `ALNUM` bound continues\n * past (a digit directly beyond the letters is still a word character, so the run is not the\n * whole fragment), and for a run no entry equals.\n */\nfunction runMatches(\n arr: readonly number[],\n i: number,\n dir: 1 | -1,\n entries: readonly (readonly number[])[],\n): boolean {\n const run: number[] = [];\n let j = i + dir;\n for (; ; j += dir) {\n const cp = at(arr, j);\n if (cp === NONE || !isLetter(cp)) break;\n run.push(cp);\n }\n if (run.length === 0) return false;\n const outer = at(arr, j);\n if (outer !== NONE && isAlnum(outer)) return false;\n if (dir === -1) run.reverse();\n\n for (const entry of entries) {\n if (entry.length !== run.length) continue;\n let same = at(entry, 0) === asciiLower(at(run, 0));\n for (let k = 1; same && k < entry.length; k += 1) same = at(entry, k) === at(run, k);\n if (same) return true;\n }\n return false;\n}\n","import { toCodePoints } from \"../engine/codepoints.js\";\nimport { isLetter } from \"../engine/unicode.js\";\nimport { LINE_MARKER, MARKER, NONE } from \"../engine/sentinels.js\";\nimport type {\n Edit,\n ElisionClitics,\n ElisionIdiom,\n LocaleData,\n QuotePair,\n Rule,\n RuleContext,\n} from \"../types.js\";\nimport {\n NARROW,\n computeAmbiguousShapeIndices,\n computeIdiomMatchedIndices,\n computeSpanBoundaryVetoIndices,\n} from \"./quote-ambiguity.js\";\n\n/**\n * `quotes` — spec/rules/quotes.md (spec 0.4.1), order 40.\n *\n * Mandate 1 (every existing quote glyph is a re-typesetting candidate) and mandate 2 (a space\n * touching a quote mark is sloppiness, not evidence) replace 0.1.0's whole architecture, whose\n * idempotency rested on never reading this rule's own curly output. Five passes plus an emit;\n * no backtracking inside a pass, no regular expression, no native-string indexing\n * (ARCHITECTURE.md 4.1, 4.2).\n */\n\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\n/**\n * spec 3.2 `V1ID` (spec 0.4.1) — a **conservative over-approximation**, not a claim that every\n * U+0027 becomes U+2019. `apostrophe` (R₆) only ever *emits* U+2019 for a U+0027 (never any\n * other code point), but its own case ladder leaves a U+0027 unedited under the prime guard\n * (case 1: `6' 2\"`) and case 5 (`a ' b`, `''`) — `apostrophe.md` §5 names both as surviving to\n * the second run unedited. `V1ID` cannot know, from inside `quotes`, which outcome a given\n * U+0027 will get without re-deriving `apostrophe`'s verdict against `quotes`' own final output\n * — circular, since that output is what this rule is computing — so it treats every U+0027 as\n * *possibly* about to become U+2019 and every U+2019 as *possibly* a U+0027 that already did.\n *\n * **What \"conservative\" bounds, and what it does not.** At this single comparison, `V1ID` can\n * only ever *add* a veto (merge two identities that raw equality would have kept apart) — it\n * never grants `canOpen`/`canClose` to a candidate that would not otherwise have had it. It does\n * **not** follow that the rule's final output only ever declines more and converts less: pass 2\n * (`pairCandidates`) and pass 4 (`certify`) are global over the whole candidate list, and removing\n * one candidate can remove a crossing pair, a nesting conflict, or a certification-gate\n * instability that was previously making a *different, unrelated* pair fail to certify. An extra\n * local veto can therefore *indirectly* let another pair certify, reassign depth/glyphs, or\n * change what `nbsp` (order 70) later inserts — the reported counterexample is exactly this: V1ID\n * declining the crossing `NARROW` pair is what lets the `WIDE` pair certify on pass 1 instead of\n * being caught in the same gate rejection. See quotes.md §5, Lemma A / Corollary A1 and the \"V1ID\n * empirical audit\" section for the bound this actually rests on — inspection of every globally\n * changed output within a reproducible sweep, not a monotonicity claim.\n */\nconst SQ = 0x27;\nconst RIGHT_SINGLE_QUOTE = 0x2019;\nfunction v1Identity(cp: number): number {\n return cp === SQ ? RIGHT_SINGLE_QUOTE : cp;\n}\n\n/** spec 3.1 `WIDE` / `NARROW`. `WIDE ∪ NARROW = QUOTEMARK`, and the two are disjoint. `NARROW`\n * is imported from `./quote-ambiguity.js`, shared with `apostrophe` (spec 0.5.0). */\nconst WIDE: ReadonlySet<number> = new Set([\n 0x22, 0xab, 0xbb, 0x201c, 0x201d, 0x201e, 0x201f, 0x301d, 0x301e, 0x301f,\n]);\n\nfunction isQuoteMark(cp: number): boolean {\n return WIDE.has(cp) || NARROW.has(cp);\n}\n\n/**\n * spec 3.1 `INLINE-SPACE` — split out of `SPACELIKE` because §3.2's skip walks read this class\n * alone. `MARKER`/`LINE_MARKER` are deliberately absent, so no skip walk ever crosses a span\n * boundary or a line terminator (modes.md 3.3).\n */\nconst INLINE_SPACE: ReadonlySet<number> = new Set([\n 0x20, 0x09, 0xa0, 0x202f, 0x2007, 0x2009, 0x200a,\n]);\n\n/** spec 3.1 `BREAK`, including the line-boundary marker (modes.md 3.2). */\nconst BREAK: ReadonlySet<number> = new Set([\n 0x0a,\n 0x0d,\n 0x0b,\n 0x0c,\n 0x85,\n 0x2028,\n 0x2029,\n LINE_MARKER,\n]);\n\nconst SPACELIKE: ReadonlySet<number> = new Set([...INLINE_SPACE, ...BREAK]);\n\n/**\n * spec 3.1 `OPENISH` / `CLOSEISH`. `QUOTEMARK` is a member of **both**, and is exempt from\n * `canOpen`'s closeish rejection — Lemma A's entire mechanism (spec 5). Do not \"simplify\" this\n * back to per-glyph lists: it is what makes a candidate's verdict independent of *which* quote\n * glyph its neighbour is.\n */\nconst OPENISH: ReadonlySet<number> = new Set([MARKER, 0x28, 0x5b, 0x7b, ...WIDE, ...NARROW]);\n\nconst CLOSEISH: ReadonlySet<number> = new Set([\n MARKER,\n 0x29,\n 0x5d,\n 0x7d,\n 0x2c,\n 0x2e,\n 0x3b,\n 0x3a,\n 0x21,\n 0x3f,\n 0x2026,\n 0x2013,\n 0x2014,\n ...WIDE,\n ...NARROW,\n]);\n\n/** spec 3.1 `DASHISH`. U+2011 because `hyphen` (order 35) converts U+002D to it. */\nconst DASHISH: ReadonlySet<number> = new Set([0x2d, 0x2011, 0x2013, 0x2014]);\n\n/** Out-of-range reads yield `NONE`, the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\nfunction isAlnum(cp: number): boolean {\n return isDigit(cp) || isLetter(cp);\n}\n\n/** spec 3.1 `DELETE-LANDING` — the largest landing class for which every earlier-ordered rule's own classes are unaffected by a quote glyph or a U+0020 (spec 3.7, composition obligation). */\nfunction isDeleteLanding(cp: number): boolean {\n return isAlnum(cp) || isQuoteMark(cp);\n}\n\n/** The straight-line walk of spec 3.2: step outward across a maximal `INLINE-SPACE` run. */\nfunction skipLeft(arr: readonly number[], i: number): number {\n let j = i - 1;\n while (j >= 0 && INLINE_SPACE.has(arr[j] as number)) j -= 1;\n return j >= 0 ? (arr[j] as number) : NONE;\n}\n\nfunction skipRight(arr: readonly number[], i: number): number {\n const n = arr.length;\n let j = i + 1;\n while (j < n && INLINE_SPACE.has(arr[j] as number)) j += 1;\n return j < n ? (arr[j] as number) : NONE;\n}\n\ninterface Candidate {\n readonly index: number;\n readonly wide: boolean;\n readonly canOpen: boolean;\n readonly canClose: boolean;\n}\n\ninterface Pair {\n readonly open: number;\n readonly close: number;\n}\n\ninterface SkipSets {\n readonly spaceRight: ReadonlySet<number>;\n readonly spaceLeft: ReadonlySet<number>;\n}\n\nfunction glyphCodePoint(s: string): number {\n return toCodePoints(s)[0] as number;\n}\n\n/**\n * spec 3.1a — locale-derived skip sets, computed once per call. These are exactly the\n * positions at which `nbsp` N8 can insert a space (nbsp.md 3.10), which is what makes Lemma B's\n * coverage exact rather than a survey.\n */\nfunction computeSkipSets(locale: LocaleData): SkipSets {\n const spaceRight = new Set<number>();\n const spaceLeft = new Set<number>();\n for (const pair of [locale.quotes.primary, locale.quotes.secondary]) {\n if (pair.innerSpace === \"none\") continue;\n const open = glyphCodePoint(pair.open);\n const close = glyphCodePoint(pair.close);\n if (open === close) continue;\n spaceRight.add(open);\n spaceLeft.add(close);\n }\n return { spaceRight, spaceLeft };\n}\n\n/**\n * Pass 1 — collect and classify candidates (spec 3.2). `canOpen` always skips right and\n * `canClose` always skips left (mandate 2's inner-side skip); the outer side skips only when\n * `nbsp` can reach it (the locale-derived `spaceRight`/`spaceLeft` sets), which is what keeps\n * every verdict inert to `nbsp` (Lemma B).\n */\nconst EMPTY_VETO: ReadonlySet<number> = new Set();\n\nfunction collectCandidates(\n arr: readonly number[],\n skip: SkipSets,\n elisionIdioms: readonly ElisionIdiom[],\n elisionClitics: ElisionClitics | undefined,\n): Candidate[] {\n const n = arr.length;\n const candidates: Candidate[] = [];\n // spec 1.1.0: the veto set is the UNION of the cited-idiom match (unchanged since 0.4.0) and\n // the universal medial-n shape (quotes.md 3.2). `quotes` declines pairing for both, and both\n // have the same intent — that `apostrophe` (order 50) convert the surviving marks by its own\n // case ladder. The union is computed rather than assumed: an idiom's `elided` field is not\n // required to be the single `n` the universal veto matches.\n // spec 1.4.0 adds a third member to the same union: the span-boundary elision veto, which\n // fires only where one literal neighbour is the inline MARKER (quotes.md 3.2).\n const sets = [\n computeIdiomMatchedIndices(arr, elisionIdioms),\n computeAmbiguousShapeIndices(arr),\n computeSpanBoundaryVetoIndices(arr, elisionClitics),\n ].filter((set) => set.size > 0);\n const elisionVetoed: ReadonlySet<number> =\n sets.length === 0\n ? EMPTY_VETO\n : sets.length === 1\n ? (sets[0] as ReadonlySet<number>)\n : new Set(sets.flatMap((set) => [...set]));\n\n for (let i = 0; i < n; i += 1) {\n const g = at(arr, i);\n if (!isQuoteMark(g)) continue;\n\n const lLit = i > 0 ? at(arr, i - 1) : NONE;\n const rLit = i + 1 < n ? at(arr, i + 1) : NONE;\n const lSkip = skipLeft(arr, i);\n const rSkip = skipRight(arr, i);\n\n const openLeft = skip.spaceLeft.has(g) ? lSkip : lLit;\n const closeRight = skip.spaceRight.has(g) ? rSkip : rLit;\n\n let canOpen =\n (openLeft === NONE ||\n SPACELIKE.has(openLeft) ||\n OPENISH.has(openLeft) ||\n DASHISH.has(openLeft)) &&\n rSkip !== NONE &&\n !SPACELIKE.has(rSkip) &&\n (!CLOSEISH.has(rSkip) || isQuoteMark(rSkip) || rSkip === MARKER);\n\n let canClose =\n lSkip !== NONE &&\n !SPACELIKE.has(lSkip) &&\n (closeRight === NONE ||\n SPACELIKE.has(closeRight) ||\n CLOSEISH.has(closeRight) ||\n DASHISH.has(closeRight));\n\n // Medial-elision veto (spec 3.2), `NARROW` marks only, literal reads: `don't`, `l'été`,\n // `O'Brien`, `1990's` — and, on a second pipeline pass, `don't` with U+2019, because\n // `apostrophe` has converted the mark and U+2019 is also `NARROW`.\n if (NARROW.has(g) && lLit !== NONE && rLit !== NONE && isAlnum(lLit) && isAlnum(rLit)) {\n canOpen = false;\n canClose = false;\n }\n\n // Listed elision veto (spec 3.2, spec 0.4.0): both capabilities of a mark found by the\n // pre-pass above are forced false, overriding every other test in this loop.\n if (elisionVetoed.has(i)) {\n canOpen = false;\n canClose = false;\n }\n\n // V1 — same-V1-identity adjacency veto (spec 3.2), both widths: `\"\"`, `''`, `««`, `””` —\n // literal adjacency under `v1Identity` (`v1Identity` is the identity function everywhere\n // except U+0027, see its definition above), **plus** the same shape separated by exactly one\n // INLINE-SPACE code point at a position `nbsp` can insert or remove. The second clause is\n // narrow on purpose:\n // it fires only when the space-or-not gap sits immediately after a `SPACE-RIGHT` glyph (on\n // the left) or immediately before a `SPACE-LEFT` glyph (on the right) — the two positions\n // Lemma B (spec 5) enumerates as `nbsp`'s entire insertion surface next to a quote mark.\n // Without it, a pairing the gate declines when the gap is absent can certify once `nbsp`\n // (a *later* rule) inserts the gap on a subsequent pipeline pass — a composition-obligation\n // violation, since `quotes` must be a no-op on its own already-settled output regardless of\n // whether `nbsp` has acted yet. A plain skip-based V1 (comparing `Lskip`/`Rskip` to `g`\n // unconditionally) was tried and rejected: it also vetoes two *genuinely distinct*\n // quotations separated by an ordinary word space (`'a' 'b'`), which is ordinary prose, not\n // an artefact — the veto must depend on the *locale's* `SPACE-RIGHT`/`SPACE-LEFT` sets, not\n // fire on every space-separated repeat of a glyph.\n // `g` is shared identically between a candidate and the same-glyph neighbour reached by a\n // skip, so it does not matter here which of the two sits on which side of the gap: nbsp\n // can insert there iff `g` plays *either* spaced role (it opens on its own right, or closes\n // on its own left) for this locale.\n //\n // Every comparison below reads `v1Identity`, not the raw code point (spec 3.2 `V1ID`, spec\n // 0.4.1) — a *conservative* closure, not a claim that every U+0027 becomes U+2019.\n // `apostrophe` (R₆) only ever emits U+2019 for a U+0027, but its own case ladder leaves some\n // U+0027s unedited (prime guard, case 5); `v1Identity`'s definition above explains why\n // `quotes` cannot know which without a circular re-derivation of `apostrophe`'s verdict\n // against its own output. Without this closure, a literal U+0027-vs-U+2019 comparison here\n // gives a different verdict before and after `apostrophe` edits a neighbour between two\n // pipeline passes — a composition-obligation violation against this rule's own idempotency\n // (quotes.md §5, Lemma A / Corollary A1). At *this* comparison the effect is one-directional\n // — an extra veto on a mixed U+0027/U+2019 adjacency, never a granted capability — but that is\n // a local fact about this line, not a claim about the rule's final output: declining one\n // candidate here can remove a crossing/nesting/certification conflict downstream (passes 2\n // and 4 are global over the whole candidate list) and thereby let a *different* pair certify\n // that previously could not. See the module comment on `v1Identity` above.\n const gV1 = v1Identity(g);\n const gapIsNbspInsertable = skip.spaceRight.has(g) || skip.spaceLeft.has(g);\n const leftVetoed =\n v1Identity(lLit) === gV1 ||\n (lLit !== NONE && INLINE_SPACE.has(lLit) && v1Identity(lSkip) === gV1 && gapIsNbspInsertable);\n const rightVetoed =\n v1Identity(rLit) === gV1 ||\n (rLit !== NONE && INLINE_SPACE.has(rLit) && v1Identity(rSkip) === gV1 && gapIsNbspInsertable);\n if (leftVetoed || rightVetoed) {\n canOpen = false;\n canClose = false;\n }\n\n if (canOpen || canClose) {\n candidates.push({ index: i, wide: WIDE.has(g), canOpen, canClose });\n }\n }\n\n return candidates;\n}\n\n/** spec 3.3 `vacuous(a, b)`. Vacuously true when `b = a + 1`. */\nfunction isVacuous(arr: readonly number[], a: number, b: number): boolean {\n for (let k = a + 1; k < b; k += 1) {\n if (!INLINE_SPACE.has(arr[k] as number)) return false;\n }\n return true;\n}\n\n/**\n * Pass 2 — pair the candidates, one stack per width (spec 3.3). Closing is tried before\n * opening; a candidate reaches exactly one of three outcomes (paired, pushed, unmatched), and a\n * closer that fails the vacuity condition falls through to step 2 and then step 3 rather than\n * being discarded — the exhaustive three-outcome shape the certification gate depends on.\n */\nfunction pairCandidates(arr: readonly number[], candidates: readonly Candidate[]): Pair[] {\n const wideStack: Candidate[] = [];\n const narrowStack: Candidate[] = [];\n const pairs: Pair[] = [];\n\n for (const c of candidates) {\n const stack = c.wide ? wideStack : narrowStack;\n const top = stack[stack.length - 1];\n if (c.canClose && top !== undefined && !isVacuous(arr, top.index, c.index)) {\n stack.pop();\n pairs.push({ open: top.index, close: c.index });\n continue;\n }\n if (c.canOpen) stack.push(c);\n }\n\n return pairs;\n}\n\n/**\n * Pass 3 — depth over the *accepted* set, never the raw pass-2 output (spec 3.4). On a second\n * run the accepted set is the raw set, so a depth taken over the raw set on run 1 and the\n * accepted set on run 2 would disagree whenever the gate declined anything.\n */\nfunction depthOf(pairs: readonly Pair[], p: Pair): number {\n let depth = 1;\n for (const q of pairs) {\n if (q.open < p.open && p.close < q.close) depth += 1;\n }\n return depth;\n}\n\nfunction pairFor(ctx: RuleContext, depth: number): QuotePair {\n return depth % 2 === 1 ? ctx.locale.quotes.primary : ctx.locale.quotes.secondary;\n}\n\ninterface RenderPlan {\n /** index (in `arr`) -> replacement code point, for every mark in an accepted pair. */\n readonly replace: ReadonlyMap<number, number>;\n /** indices (in `arr`) to delete: the inner-run deletions the landing guard permitted. */\n readonly deleteIndices: ReadonlySet<number>;\n}\n\n/**\n * spec 3.5 `render`'s glyph/deletion plan, shared by the certification gate's hypothetical and\n * the real emit (pass 5) — the only difference between them is whether the plan is applied to a\n * throwaway array or actually returned as edits.\n */\nfunction computeRenderPlan(\n arr: readonly number[],\n accepted: readonly Pair[],\n ctx: RuleContext,\n): RenderPlan {\n const replace = new Map<number, number>();\n const deleteIndices = new Set<number>();\n\n for (const p of accepted) {\n const glyphs = pairFor(ctx, depthOf(accepted, p));\n replace.set(p.open, glyphCodePoint(glyphs.open));\n replace.set(p.close, glyphCodePoint(glyphs.close));\n\n if (glyphs.innerSpace !== \"none\") continue;\n\n // Open-side run: the maximal INLINE-SPACE run starting at p.open + 1.\n let openEnd = p.open + 1;\n while (openEnd < arr.length && INLINE_SPACE.has(arr[openEnd] as number)) openEnd += 1;\n const openStart = p.open + 1;\n const openEmpty = openEnd === openStart;\n const openLanding = openEnd < arr.length ? (arr[openEnd] as number) : NONE;\n\n // Close-side run: the maximal INLINE-SPACE run ending at p.close - 1.\n let closeStart = p.close - 1;\n while (closeStart >= 0 && INLINE_SPACE.has(arr[closeStart] as number)) closeStart -= 1;\n closeStart += 1;\n const closeEnd = p.close;\n const closeEmpty = closeStart === closeEnd;\n const closeLanding = closeStart - 1 >= 0 ? (arr[closeStart - 1] as number) : NONE;\n\n // A run is deleted iff non-empty, its landing is in DELETE-LANDING, and it is not\n // simultaneously both of the pair's runs — a pair enclosing nothing but spaces deletes\n // neither (spec 3.5). Unreachable for an accepted pair given pass 2's vacuity condition,\n // but the guard is cheap and the spec states it unconditionally.\n const sameRun = !openEmpty && !closeEmpty && openStart === closeStart && openEnd === closeEnd;\n\n if (!openEmpty && isDeleteLanding(openLanding) && !sameRun) {\n for (let k = openStart; k < openEnd; k += 1) deleteIndices.add(k);\n }\n if (!closeEmpty && isDeleteLanding(closeLanding) && !sameRun) {\n for (let k = closeStart; k < closeEnd; k += 1) deleteIndices.add(k);\n }\n }\n\n return { replace, deleteIndices };\n}\n\n/** Applies a render plan, returning the rendered array and the order-preserving index map. */\nfunction applyRenderPlan(\n arr: readonly number[],\n plan: RenderPlan,\n): { readonly y: number[]; readonly map: readonly number[] } {\n const y: number[] = [];\n const map: number[] = new Array(arr.length).fill(-1);\n for (let i = 0; i < arr.length; i += 1) {\n if (plan.deleteIndices.has(i)) continue;\n map[i] = y.length;\n y.push(plan.replace.get(i) ?? (arr[i] as number));\n }\n return { y, map };\n}\n\nfunction pairKey(open: number, close: number): string {\n return `${open},${close}`;\n}\n\nfunction pairSetsEqual(a: ReadonlySet<string>, b: ReadonlySet<string>): boolean {\n if (a.size !== b.size) return false;\n for (const key of a) {\n if (!b.has(key)) return false;\n }\n return true;\n}\n\n/**\n * Pass 4 — the certification gate (spec 3.5). The accepted pairing is *checked*, not proved:\n * render the hypothetical output, re-run passes 1–2 on it, and decline pairs until the re-run\n * reproduces the accepted set exactly. Declination is simultaneous per round, and when the\n * intersection fails to shrink `A`, the pair with the greatest `open` index is forced out — both\n * clauses are normative (spec 3.5), so two ports cannot disagree.\n */\nfunction certify(\n arr: readonly number[],\n initialPairs: readonly Pair[],\n ctx: RuleContext,\n skip: SkipSets,\n): Pair[] {\n let accepted: Pair[] = initialPairs.slice();\n // Each round accepts or strictly shrinks `accepted`; it is finite and ∅ accepts\n // unconditionally, so the loop runs at most |A0| + 1 times (spec 3.5). The cap is a defensive\n // safety net, not a normative bound.\n const cap = initialPairs.length + 2;\n\n for (let round = 0; round <= cap; round += 1) {\n if (accepted.length === 0) return accepted;\n\n const plan = computeRenderPlan(arr, accepted, ctx);\n const { y, map } = applyRenderPlan(arr, plan);\n const rederived = pairCandidates(\n y,\n collectCandidates(y, skip, ctx.locale.quotes.elisionIdioms, ctx.locale.quotes.elisionClitics),\n );\n const bSet = new Set(rederived.map((p) => pairKey(p.open, p.close)));\n\n const projected = accepted.map((p) => ({\n open: map[p.open] as number,\n close: map[p.close] as number,\n }));\n const projSet = new Set(projected.map((p) => pairKey(p.open, p.close)));\n\n if (pairSetsEqual(projSet, bSet)) return accepted;\n\n const survivors = accepted.filter((_, idx) => {\n const proj = projected[idx] as { open: number; close: number };\n return bSet.has(pairKey(proj.open, proj.close));\n });\n\n if (survivors.length === accepted.length) {\n let removeIdx = 0;\n for (let i = 1; i < accepted.length; i += 1) {\n if ((accepted[i] as Pair).open > (accepted[removeIdx] as Pair).open) removeIdx = i;\n }\n accepted = accepted.filter((_, i) => i !== removeIdx);\n } else {\n accepted = survivors;\n }\n }\n\n // Unreachable given the termination argument; declines everything rather than looping.\n return [];\n}\n\n/**\n * Pass 5 — emit (spec 3.6). An edit whose replacement equals the span it replaces is never\n * emitted — the invisible-edit principle, applied per mark, not per pair.\n */\nfunction emit(arr: readonly number[], accepted: readonly Pair[], ctx: RuleContext): Edit[] {\n const plan = computeRenderPlan(arr, accepted, ctx);\n const edits: Edit[] = [];\n\n for (const [index, cp] of plan.replace) {\n if (arr[index] === cp) continue;\n edits.push({ start: index, end: index + 1, replacement: [cp], ruleId: \"quotes\" });\n }\n\n const deletions = Array.from(plan.deleteIndices).sort((a, b) => a - b);\n let i = 0;\n while (i < deletions.length) {\n let j = i;\n while (\n j + 1 < deletions.length &&\n (deletions[j + 1] as number) === (deletions[j] as number) + 1\n ) {\n j += 1;\n }\n edits.push({\n start: deletions[i] as number,\n end: (deletions[j] as number) + 1,\n replacement: [],\n ruleId: \"quotes\",\n });\n i = j + 1;\n }\n\n edits.sort((a, b) => a.start - b.start);\n return edits;\n}\n\nexport const quotesRule: Rule = {\n id: \"quotes\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const skip = computeSkipSets(ctx.locale);\n\n const candidates = collectCandidates(\n cp,\n skip,\n ctx.locale.quotes.elisionIdioms,\n ctx.locale.quotes.elisionClitics,\n );\n if (candidates.length === 0) return [];\n\n const initialPairs = pairCandidates(cp, candidates);\n if (initialPairs.length === 0) return [];\n\n const accepted = certify(cp, initialPairs, ctx, skip);\n if (accepted.length === 0) return [];\n\n return emit(cp, accepted, ctx);\n },\n};\n","import { isLetter } from \"../engine/unicode.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\nimport {\n buildReplacement,\n effectiveNeighbour,\n findDashTokens,\n isDashUnion,\n isOpenBracket,\n isSpaced,\n isSpacingTransitionBlocked,\n isStripBeforeOrCloseBracket,\n rangeFlanks,\n sameContent,\n type DashStyle,\n type RangeFlanks,\n} from \"./dash-shared.js\";\n\n/**\n * `ranges` — spec/rules/ranges.md (spec 0.5.0), order 25. Explicit opt-in: off by default\n * (RULE_DEFAULTS in registry.ts). Split out of `dashes` (spec 0.5.0) — see ranges.md 1 and\n * dashes.md 7.11 for why this is opt-in rather than a bounded structural fix: separating a\n * genuine numeric range (`5-10`) from a compound label sharing the identical shape (`Figure\n * 5-10`) needs the preceding word, which is exactly the open-ended, per-locale context this\n * project's rules are built never to consult.\n *\n * Explicit index-based scanning only: no regex anywhere, and every index addresses the\n * code-point array, never a native string (ARCHITECTURE.md 4.1, 4.2).\n */\n\nconst FULL_STOP = 0x2e;\nconst COMMA = 0x2c;\nconst SOLIDUS = 0x2f;\nconst DIGIT_ZERO = 0x30;\n\n/** ranges.md 3.3 G5: equal-length ASCII digit runs compare lexicographically, so no arithmetic. */\nfunction isNonDecreasing(\n cp: readonly number[],\n leftStart: number,\n rightStart: number,\n length: number,\n): boolean {\n for (let i = 0; i < length; i += 1) {\n const l = cp[leftStart + i] as number;\n const r = cp[rightStart + i] as number;\n if (l < r) return true;\n if (l > r) return false;\n }\n return true;\n}\n\n/**\n * ranges.md 3.2, G1-G5, over the flanks and digit runs ranges.md 3.2a's walk produced.\n *\n * `before` and `after` read past a matched outer closed-up symbol, so G1-G3 judge the text in\n * front of the whole member rather than the symbol itself — which is what declines `US$15-US$20`\n * on G1, where `before` is `S`.\n */\nfunction rangeGuardsPass(cp: readonly number[], flanks: RangeFlanks): boolean {\n const { left, right, a, b, outerLeft, outerRight } = flanks;\n\n const before = effectiveNeighbour(cp, (outerLeft < 0 ? a : outerLeft) - 1, -1);\n const after = effectiveNeighbour(cp, (outerRight < 0 ? b : outerRight) + 1, 1);\n\n // G1 — no letter adjacency.\n if (isLetter(before)) return false;\n // G2 — no chain: an ISO date, an ISBN or a phone number always trips this.\n if (isDashUnion(before)) return false;\n if (isDashUnion(after)) return false;\n // G3 — not part of a decimal or a path.\n if (before === FULL_STOP || before === COMMA || before === SOLIDUS) return false;\n if (after === SOLIDUS) return false;\n // G4 — run lengths. Equal, or the directional (1,2) branch with no leading zero on Rrun.\n const leftLength = left - a + 1;\n const rightLength = b - right + 1;\n if (leftLength === 1 && rightLength === 2 && cp[right] !== DIGIT_ZERO) {\n return true;\n }\n if (leftLength !== rightLength) return false;\n // G5 — non-decreasing.\n return isNonDecreasing(cp, a, right, leftLength);\n}\n\nfunction scan(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const edits: Edit[] = [];\n const style: DashStyle = ctx.locale.dash.range;\n\n for (const token of findDashTokens(cp)) {\n const { left, right, lsp, rsp, spanStart, spanEnd } = token;\n\n // ranges.md 3.2, 3.2a — a range candidate iff both flanks are DIGIT once a matched closed-up\n // symbol has been walked over. `ranges` never processes any other token shape; that is\n // `dashes`' territory, and `dashes` declines a candidate unconditionally too (operator\n // decision, spec 0.5.0) — neither rule reinterprets the other's shape, whether or not\n // `ranges` is enabled.\n const flanks = rangeFlanks(cp, left, right);\n if (flanks === undefined) continue;\n\n if (!rangeGuardsPass(cp, flanks)) continue;\n\n // `\"none\"`: the locale has no verified convention, so nothing is substituted.\n if (style === \"none\") continue;\n\n if (isSpaced(style)) {\n // T1/T2 read the walked flanks, not the raw ones: ranges.md 3.2a makes `cp[L']`/`cp[R']`\n // what every shared guard sees once a closed-up symbol has been consumed.\n // T1: a tight token may not become spaced across a digit run that has a far dash.\n if (lsp === 0 && rsp === 0 && isSpacingTransitionBlocked(cp, flanks.left, flanks.right)) {\n continue;\n }\n // T2: the emitted U+0020 must not land where `spaces` (order 10) would delete it.\n if (isStripBeforeOrCloseBracket(cp[flanks.right] as number)) continue;\n if (isOpenBracket(cp[flanks.left] as number)) continue;\n }\n\n // ranges.md 3.3.1: never make an edit whose entire content is invisible. Try the unbound\n // replacement first; only add the joiner pair if the dash itself is genuinely changing.\n const unbound = buildReplacement(style, false);\n const onlyBindingWouldChange = !isSpaced(style) && sameContent(cp, spanStart, spanEnd, unbound);\n const bind = !isSpaced(style) && !onlyBindingWouldChange;\n const replacement = bind ? buildReplacement(style, true) : unbound;\n if (sameContent(cp, spanStart, spanEnd, replacement)) continue;\n\n edits.push({ start: spanStart, end: spanEnd, replacement, ruleId: \"ranges\" });\n }\n\n return edits;\n}\n\nexport const rangesRule: Rule = {\n id: \"ranges\",\n apply: scan,\n};\n","import type { Edit, Rule, RuleContext } from \"../types.js\";\nimport { isMarker, LINE_MARKER, NONE } from \"../engine/sentinels.js\";\nimport { isLetter } from \"../engine/unicode.js\";\n\n// spec/rules/spaces.md 3.1. Explicit code points only: no regex, no \\s (ARCHITECTURE.md 4.1).\nconst SPACE = 0x20;\n\nconst LF = 0x0a;\nconst CR = 0x0d;\nconst VT = 0x0b;\nconst FF = 0x0c;\nconst NEL = 0x85;\nconst LS = 0x2028;\nconst PS = 0x2029;\n\nconst COMMA = 0x2c;\nconst FULL_STOP = 0x2e;\nconst SEMICOLON = 0x3b;\nconst COLON = 0x3a;\nconst EXCLAMATION = 0x21;\nconst QUESTION = 0x3f;\nconst ELLIPSIS = 0x2026;\n\nconst PAREN_OPEN = 0x28;\nconst PAREN_CLOSE = 0x29;\nconst SQUARE_OPEN = 0x5b;\nconst SQUARE_CLOSE = 0x5d;\nconst CURLY_OPEN = 0x7b;\nconst CURLY_CLOSE = 0x7d;\n\nconst HYPHEN_MINUS = 0x2d;\nconst CARET = 0x5e;\nconst SOLIDUS = 0x2f;\nconst REVERSE_SOLIDUS = 0x5c;\nconst VERTICAL_LINE = 0x7c;\nconst ASTERISK = 0x2a;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\nconst LETTER_D_UPPER = 0x44;\nconst LETTER_D_LOWER = 0x64;\nconst LETTER_P_UPPER = 0x50;\nconst LETTER_P_LOWER = 0x70;\nconst LETTER_O_UPPER = 0x4f;\nconst LETTER_O_LOWER = 0x6f;\n\n/** `NONE` in the spec: the position one past either end of the array. */\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\n/** `BREAK` — including `LINE_MARKER`, a member for every rule everywhere (modes.md 3.2). */\nfunction isBreak(cp: number): boolean {\n return (\n cp === LF ||\n cp === CR ||\n cp === VT ||\n cp === FF ||\n cp === NEL ||\n cp === LS ||\n cp === PS ||\n cp === LINE_MARKER\n );\n}\n\n/**\n * Six code points. U+2026 is deliberately absent: with it, `Wait ...` would keep its space\n * here, `ellipsis` would yield `Wait …`, and a second pipeline pass would then strip that\n * space — a composition divergence (spec/rules/spaces.md 3.4).\n */\nfunction isStripBefore(cp: number): boolean {\n return (\n cp === COMMA ||\n cp === FULL_STOP ||\n cp === SEMICOLON ||\n cp === COLON ||\n cp === EXCLAMATION ||\n cp === QUESTION\n );\n}\n\nfunction isDotlike(cp: number): boolean {\n return cp === FULL_STOP || cp === ELLIPSIS;\n}\n\nfunction isOpenBracket(cp: number): boolean {\n return cp === PAREN_OPEN || cp === SQUARE_OPEN || cp === CURLY_OPEN;\n}\n\nfunction isCloseBracket(cp: number): boolean {\n return cp === PAREN_CLOSE || cp === SQUARE_CLOSE || cp === CURLY_CLOSE;\n}\n\nfunction matchingCloser(open: number): number {\n if (open === PAREN_OPEN) return PAREN_CLOSE;\n if (open === SQUARE_OPEN) return SQUARE_CLOSE;\n return CURLY_CLOSE;\n}\n\n/** spec/rules/spaces.md 3.3: `- [ ] item` must not become `- [] item`. It may still collapse. */\nfunction isEmptyBracketGuarded(left: number, right: number): boolean {\n return isOpenBracket(left) && right === matchingCloser(left);\n}\n\n/**\n * The replacement length is a pure function of the two bounding code points, computed once\n * (spec/rules/spaces.md 3.2 step 5). A two-pass \"collapse then strip\" formulation would need a\n * fixed-point loop, which two runtimes would iterate differently.\n */\n/**\n * spec/rules/spaces.md 3.4. A run of dots is a different token from a terminal full stop — a\n * relative path, a truncation, a typed ellipsis — and deleting the space before it merges the\n * run with a preceding abbreviation dot (`See ../docs` → `See../docs`).\n *\n * A single dot followed directly by a letter or an ASCII digit starts a token too (`.NET`,\n * `.gitignore`, `.5` — spec 1.2.0's word-start clause), so the space before it is not deleted.\n * A span boundary marker after the dot is neither, and the dot stays terminal.\n *\n * `e` indexes `right` in the **input** array, and the run is measured there. Measuring it after\n * any edit had been applied would break the Chicago spaced ellipsis `Hello . . .`, where every\n * dot is a lone dot at decision time and all three spaces must still strip.\n */\nfunction isLoneDot(cp: readonly number[], e: number): boolean {\n if (at(cp, e) !== FULL_STOP) return true;\n const next = at(cp, e + 1);\n if (isLetter(next) || isDigitAscii(next)) return false;\n return !isDotlike(next);\n}\n\nfunction isDigitAscii(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\n/** spec/rules/spaces.md 3.6: the recognised \"mouth\" glyphs of a Western text emoticon. */\nfunction isEmoticonMouth(cp: number): boolean {\n return (\n cp === PAREN_OPEN ||\n cp === PAREN_CLOSE ||\n cp === SQUARE_OPEN ||\n cp === SQUARE_CLOSE ||\n cp === LETTER_D_UPPER ||\n cp === LETTER_D_LOWER ||\n cp === LETTER_P_UPPER ||\n cp === LETTER_P_LOWER ||\n cp === LETTER_O_UPPER ||\n cp === LETTER_O_LOWER ||\n cp === SOLIDUS ||\n cp === REVERSE_SOLIDUS ||\n cp === VERTICAL_LINE ||\n cp === ASTERISK\n );\n}\n\n/**\n * spec/rules/spaces.md 3.6, the emoticon guard. A colon or semicolon immediately followed by\n * an optional \"nose\" and a recognised \"mouth\" is the eye of a Western text emoticon\n * (`:-)`, `:)`, `;-)`), not sentence punctuation, and the space in front of it must survive.\n *\n * The mouth must not itself run into a letter or a digit — `:Deal` is a colon before a\n * capitalised word, not a face — which is the one check needed to keep this from firing on\n * ordinary prose. `e` indexes `right`, exactly as `isLoneDot` does.\n */\nfunction isEmoticon(cp: readonly number[], e: number): boolean {\n const eye = at(cp, e);\n if (eye !== COLON && eye !== SEMICOLON) return false;\n\n let i = e + 1;\n const nose = at(cp, i);\n if (nose === HYPHEN_MINUS || nose === CARET) i += 1;\n\n if (!isEmoticonMouth(at(cp, i))) return false;\n i += 1;\n\n const after = at(cp, i);\n return !isLetter(after) && !isDigitAscii(after);\n}\n\n/**\n * spec/rules/spaces.md 3.6, the mouth side. `(` and `[` are EMOTICON-MOUTH members and\n * OPEN-BRACKET members at once, so without this the opening-bracket clause deleted the space\n * after an emoticon the eye side had just recognised: `a :( b` became `a :(b`, and then `a:(b`\n * on a second pass, because a letter after the mouth stops the eye side firing.\n *\n * The walk is the eye side's, backwards from `s`, and it needs no trailing check: the code point\n * after the mouth is the space run itself, which is neither a letter nor a digit. A nose with no\n * eye behind it is not a face — EMOTICON-NOSE and EMOTICON-EYE are disjoint, so the walk cannot\n * mistake one for the other.\n */\nfunction isEmoticonEnd(cp: readonly number[], s: number): boolean {\n if (!isEmoticonMouth(at(cp, s - 1))) return false;\n\n let j = s - 2;\n const nose = at(cp, j);\n if (nose === HYPHEN_MINUS || nose === CARET) j -= 1;\n\n const eye = at(cp, j);\n return eye === COLON || eye === SEMICOLON;\n}\n\nfunction replacementLength(\n cp: readonly number[],\n s: number,\n e: number,\n left: number,\n right: number,\n): number {\n // The guard is a clause of this decision, not a \"skip the run\" branch: `( )` collapses to\n // `( )` (spec/rules/spaces.md 3.3, normative reading).\n if (isEmptyBracketGuarded(left, right)) return 1;\n if (isOpenBracket(left) && !isEmoticonEnd(cp, s)) return 0;\n if (isCloseBracket(right)) return 0;\n if (isStripBefore(right) && isLoneDot(cp, e) && !isEmoticon(cp, e)) return 0;\n return 1;\n}\n\nexport const spacesRule: Rule = {\n id: \"spaces\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const n = cp.length;\n const edits: Edit[] = [];\n let i = 0;\n\n while (i < n) {\n if (at(cp, i) !== SPACE) {\n i += 1;\n continue;\n }\n\n const s = i;\n let e = s;\n while (e < n && at(cp, e) === SPACE) e += 1;\n const k = e - s;\n\n const left = at(cp, s - 1);\n const right = at(cp, e);\n\n // Boundary guard: indentation, Markdown hard breaks and text-unit edges are structural.\n // A span boundary is a text-unit edge: spaces.md 3.2 step 4 protects \"trailing spaces at\n // the end of a text unit, which in `html` mode are frequently the only separator between\n // two inline elements\", and in the concatenated array that edge is a marker rather than\n // `NONE`. Only this guard treats a marker that way; everywhere else in this rule the\n // marker is opaque content, per modes.md 3.3.\n if (\n left === NONE ||\n isMarker(left) ||\n isBreak(left) ||\n right === NONE ||\n isMarker(right) ||\n isBreak(right)\n ) {\n i = e;\n continue;\n }\n\n const length = replacementLength(cp, s, e, left, right);\n if (length !== k) {\n edits.push({\n start: s,\n end: e,\n replacement: length === 0 ? [] : [SPACE],\n ruleId: \"spaces\",\n });\n }\n i = e;\n }\n\n return edits;\n },\n};\n","import { isLetter } from \"../engine/unicode.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\nimport { NONE } from \"../engine/sentinels.js\";\n\n// spec/rules/symbols.md 3.1.\nconst PAREN_OPEN = 0x28;\nconst PAREN_CLOSE = 0x29;\nconst SQUARE_CLOSE = 0x5d;\n\nconst COPYRIGHT = 0xa9;\nconst REGISTERED = 0xae;\nconst TRADEMARK = 0x2122;\nconst MULTIPLICATION = 0xd7;\n\nconst SPACE = 0x20;\nconst NBSP = 0xa0;\nconst NNBSP = 0x202f;\n\nconst LOWER_X = 0x78;\nconst UPPER_X = 0x58;\nconst CYRILLIC_LOWER_HA = 0x445;\nconst CYRILLIC_UPPER_HA = 0x425;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\nconst PLUS = 0x2b;\nconst SOLIDUS = 0x2f;\nconst HYPHEN_MINUS = 0x2d;\nconst PLUS_MINUS = 0xb1;\nconst SQUARE_OPEN = 0x5b;\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\n/**\n * Every accepted spelling is enumerated. Case folding is forbidden here: `toLowerCase` is\n * locale-dependent in the host process and `(TM)` would behave differently under a Turkish\n * locale (ARCHITECTURE.md 4.4). Longest literals first (spec/rules/symbols.md 3.2 step 1).\n */\ninterface TrademarkRow {\n readonly literal: readonly number[];\n readonly to: number;\n /** S1 applies to the `(c)` and `(r)` rows only (spec/rules/symbols.md 3.2 step 3). */\n readonly guardedByS1: boolean;\n}\n\nconst TRADEMARK_TABLE: readonly TrademarkRow[] = [\n { literal: [PAREN_OPEN, 0x74, 0x6d, PAREN_CLOSE], to: TRADEMARK, guardedByS1: false }, // (tm)\n { literal: [PAREN_OPEN, 0x54, 0x4d, PAREN_CLOSE], to: TRADEMARK, guardedByS1: false }, // (TM)\n { literal: [PAREN_OPEN, 0x54, 0x6d, PAREN_CLOSE], to: TRADEMARK, guardedByS1: false }, // (Tm)\n { literal: [PAREN_OPEN, 0x74, 0x4d, PAREN_CLOSE], to: TRADEMARK, guardedByS1: false }, // (tM)\n { literal: [PAREN_OPEN, 0x63, PAREN_CLOSE], to: COPYRIGHT, guardedByS1: true }, // (c)\n { literal: [PAREN_OPEN, 0x43, PAREN_CLOSE], to: COPYRIGHT, guardedByS1: true }, // (C)\n { literal: [PAREN_OPEN, 0x72, PAREN_CLOSE], to: REGISTERED, guardedByS1: true }, // (r)\n { literal: [PAREN_OPEN, 0x52, PAREN_CLOSE], to: REGISTERED, guardedByS1: true }, // (R)\n];\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\nfunction isAlnum(cp: number): boolean {\n return isDigit(cp) || isLetter(cp);\n}\n\nfunction isSpaceLike(cp: number): boolean {\n return cp === SPACE || cp === NBSP || cp === NNBSP;\n}\n\n/**\n * `MUL-LETTER`, spec/rules/symbols.md 3.1: four code points, enumerated, no locale data. The\n * Cyrillic pair is unconditional — U+0445 between two ASCII digits is a Russian dimension typed\n * on a Cyrillic layout or keyboard debris, there is no third reading, and the glyphs are\n * identical to the Latin ones in every font, so no human review can catch it.\n */\nfunction isMulLetter(cp: number): boolean {\n return cp === LOWER_X || cp === UPPER_X || cp === CYRILLIC_LOWER_HA || cp === CYRILLIC_UPPER_HA;\n}\n\nfunction matchesAt(cp: readonly number[], i: number, literal: readonly number[]): boolean {\n if (i + literal.length > cp.length) return false;\n for (let j = 0; j < literal.length; j += 1) {\n if (at(cp, i + j) !== literal[j]) return false;\n }\n return true;\n}\n\n/** Returns the edit, or `null` when a guard rejects the candidate. */\nfunction trademarkAt(cp: readonly number[], i: number): Edit | null {\n for (const row of TRADEMARK_TABLE) {\n if (!matchesAt(cp, i, row.literal)) continue;\n const end = i + row.literal.length;\n const before = at(cp, i - 1);\n const after = at(cp, end);\n\n // S1 — left adjacency, for the `(c)` and `(r)` rows only: a one-letter argument list is\n // common, `(tm)` tucked against a product name is not a call. ©, ® and ™ are listed so\n // that `(c)(r)` converges in one run (spec/rules/symbols.md 5).\n if (\n row.guardedByS1 &&\n before !== NONE &&\n (isAlnum(before) ||\n before === PAREN_CLOSE ||\n before === SQUARE_CLOSE ||\n before === COPYRIGHT ||\n before === REGISTERED ||\n before === TRADEMARK)\n ) {\n return null;\n }\n // S2 — right adjacency: `(r)evolution`.\n if (after !== NONE && isAlnum(after)) return null;\n // S3 — no nesting: `((c))` is ASCII art or code.\n if (before === PAREN_OPEN) return null;\n\n return { start: i, end, replacement: [row.to], ruleId: \"symbols\" };\n }\n return null;\n}\n\ninterface ChainLink {\n readonly letterIndex: number;\n readonly leftSpace: 0 | 1;\n readonly rightSpace: 0 | 1;\n}\n\ninterface Chain {\n /** Index of the last code point read, whether or not any link was completed. */\n readonly end: number;\n readonly links: readonly ChainLink[];\n readonly firstRunEnd: number;\n}\n\n/**\n * `DIGIT+ (MUL-LETTER DIGIT+)+`, read from the start of a maximal digit run at `a`\n * (spec/rules/symbols.md 3.3 step 1). Reading the whole chain up front is what lets step 8\n * convert every link in one pass; a pairwise test cannot be made idempotent here by any amount\n * of guarding, because it converts one operator per pass (spec 5, 7.10).\n */\nfunction readChain(cp: readonly number[], a: number): Chain {\n let p = a;\n while (isDigit(at(cp, p))) p += 1;\n const firstRunEnd = p - 1;\n const links: ChainLink[] = [];\n let end = p - 1;\n\n for (;;) {\n let q = p;\n let leftSpace: 0 | 1 = 0;\n if (isSpaceLike(at(cp, q))) {\n leftSpace = 1;\n q += 1;\n }\n if (!isMulLetter(at(cp, q))) break;\n const letterIndex = q;\n q += 1;\n let rightSpace: 0 | 1 = 0;\n if (isSpaceLike(at(cp, q))) {\n rightSpace = 1;\n q += 1;\n }\n if (!isDigit(at(cp, q))) break;\n while (isDigit(at(cp, q))) q += 1;\n links.push({ letterIndex, leftSpace, rightSpace });\n end = q - 1;\n p = q;\n }\n\n return { end, links, firstRunEnd };\n}\n\n/** `null` when a guard declines the chain — always the whole chain, never a subset. */\nfunction chainEdits(cp: readonly number[], a: number, chain: Chain): Edit[] | null {\n const links = chain.links;\n const first = links[0];\n if (first === undefined) return null;\n\n // M1 — each link symmetric, and every link agreeing. `5x4 x 3` is ambiguous and is declined\n // whole rather than half-converted.\n const sp = first.leftSpace;\n for (const link of links) {\n if (link.leftSpace !== link.rightSpace) return null;\n if (link.leftSpace !== sp) return null;\n }\n\n // M2/M3 — the chain's OUTER boundaries, not each link. Applying them per link is what made\n // the pairwise form reject chains: the letter past the middle digit run is itself a\n // MUL-LETTER, hence a LETTER.\n const before = at(cp, a - 1);\n const after = at(cp, chain.end + 1);\n if (before !== NONE && isLetter(before)) return null;\n if (after !== NONE && isLetter(after)) return null;\n\n // M4 — hexadecimal literal. Latin-lowercase only: a hex literal is never written with\n // Cyrillic. Inspects the first link alone.\n if (\n sp === 0 &&\n at(cp, first.letterIndex) === LOWER_X &&\n chain.firstRunEnd === a &&\n at(cp, a) === DIGIT_ZERO\n ) {\n return null;\n }\n\n // There is no M5. It was removed rather than extended (spec 3.3 step 7, 7.3).\n const edits: Edit[] = [];\n for (const link of links) {\n const j = link.letterIndex;\n const replacement =\n sp === 0 ? [MULTIPLICATION] : [at(cp, j - 1), MULTIPLICATION, at(cp, j + 1)];\n edits.push({ start: j - sp, end: j + sp + 1, replacement, ruleId: \"symbols\" });\n }\n return edits;\n}\n\n/** spec/rules/symbols.md 3.4. Only the literal `+/-`; the bare `+-` is never converted. */\nfunction plusMinusAt(cp: readonly number[], i: number): Edit | null {\n if (at(cp, i + 1) !== SOLIDUS || at(cp, i + 2) !== HYPHEN_MINUS) return null;\n // F1 — `[+/-]` is a regular-expression character class.\n if (at(cp, i - 1) === SQUARE_OPEN) return null;\n // F2 — numeric context, with one optional intervening space so `+/-5` and `+/- 5` both work.\n // Without it, prose that names the characters (`lines marked +/- were edited`) is corrupted.\n let j = i + 3;\n if (at(cp, j) === SPACE) j += 1;\n if (!isDigit(at(cp, j))) return null;\n return { start: i, end: i + 3, replacement: [PLUS_MINUS], ruleId: \"symbols\" };\n}\n\nexport const symbolsRule: Rule = {\n id: \"symbols\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const n = cp.length;\n const edits: Edit[] = [];\n let i = 0;\n\n while (i < n) {\n const current = at(cp, i);\n\n if (current === PAREN_OPEN) {\n const edit = trademarkAt(cp, i);\n if (edit !== null) {\n edits.push(edit);\n i = edit.end;\n continue;\n }\n } else if (isDigit(current) && !isDigit(at(cp, i - 1))) {\n // Keyed on the start of a maximal digit run, not on the letter.\n const chain = readChain(cp, i);\n const chainResult = chainEdits(cp, i, chain);\n if (chainResult !== null) for (const edit of chainResult) edits.push(edit);\n // Continue past the chain whether or not it converted. A declined chain has no\n // convertible sub-chain: any sub-chain starts right after a MUL-LETTER, which is a\n // LETTER, so M2 rejects it.\n i = chain.end + 1;\n continue;\n } else if (current === PLUS) {\n const edit = plusMinusAt(cp, i);\n if (edit !== null) {\n edits.push(edit);\n i = edit.end;\n continue;\n }\n }\n i += 1;\n }\n\n return edits;\n },\n};\n","import type { Rule, RuleId } from \"../types.js\";\nimport { apostropheRule } from \"./apostrophe.js\";\nimport { dashesRule } from \"./dashes.js\";\nimport { ellipsisRule } from \"./ellipsis.js\";\nimport { hyphenRule } from \"./hyphen.js\";\nimport { nbspRule } from \"./nbsp.js\";\nimport { quotesRule } from \"./quotes.js\";\nimport { rangesRule } from \"./ranges.js\";\nimport { spacesRule } from \"./spaces.js\";\nimport { symbolsRule } from \"./symbols.js\";\n\n/**\n * Mirrors spec/rules/order.json, ascending by `order`. The pipeline must not depend on\n * registration order or map iteration order — Go randomizes the latter (ARCHITECTURE.md 4.5).\n * tests/engine/pipeline.test.ts asserts this list against the spec file.\n *\n * `ranges` sits at order 25, between `ellipsis` (20) and `dashes` (30) — chosen from an observed\n * behavioural difference, not for convenience (dashes.md 7.11, ranges.md 4). A dedicated\n * adjacency stress battery (a parenthetical dash directly touching a range: `a - 5-10`) found\n * that the two orders genuinely disagree: `ranges`-before-`dashes` converts both tokens\n * (`a—5–10`), matching what the single unified pre-0.5.0 `dashes` rule produced (its one scan\n * evaluated every token's cross-token guards — G2 in particular — against the *original*,\n * unedited input, since all edits were collected before any were applied). `dashes`-before-`ranges`\n * instead has `dashes` remove the space between the parenthetical dash and the range's digit run\n * first, which then makes `ranges`' own G2 (\"no chain\") guard see a dash immediately adjacent to\n * the range and decline it (`a—5-10`) — a regression against the pre-split rule's own behaviour,\n * introduced purely by which rule happens to run first, not by anything in either rule's own\n * guards changing. `ranges`-before-`dashes` is the order that stays faithful to what one combined\n * pass already did; see tests/rules/ranges.test.ts's \"adjacency order\" cases for the reproduction.\n */\nexport const RULE_ORDER: readonly RuleId[] = [\n \"spaces\",\n \"ellipsis\",\n \"ranges\",\n \"dashes\",\n \"hyphen\",\n \"quotes\",\n \"apostrophe\",\n \"symbols\",\n \"nbsp\",\n];\n\n/**\n * From the `default` field of spec/rules/order.json. Every rule except `ranges` defaults on;\n * `ranges` (spec 0.5.0) is the first rule to default off — see `rule-runner.ts`'s `planRules`\n * for how `Options.rules` resolves a default-off rule's explicit `true`.\n */\nexport const RULE_DEFAULTS: Readonly<Record<RuleId, boolean>> = {\n spaces: true,\n ellipsis: true,\n ranges: false,\n dashes: true,\n hyphen: true,\n quotes: true,\n apostrophe: true,\n symbols: true,\n nbsp: true,\n};\n\n/** Rule implementations, keyed by id. Partial until every rule lands. */\nexport const RULES: Readonly<Partial<Record<RuleId, Rule>>> = {\n spaces: spacesRule,\n ellipsis: ellipsisRule,\n ranges: rangesRule,\n dashes: dashesRule,\n hyphen: hyphenRule,\n quotes: quotesRule,\n apostrophe: apostropheRule,\n symbols: symbolsRule,\n nbsp: nbspRule,\n};\n\nexport function isRuleId(value: string): value is RuleId {\n return (RULE_ORDER as readonly string[]).includes(value);\n}\n","import { PolytypoError } from \"../errors.js\";\nimport type { Edit, RuleId } from \"../types.js\";\nimport { isValidCodePoint } from \"./codepoints.js\";\n\nfunction reject(message: string): never {\n throw new PolytypoError(\"POLYTYPO_RULE_CONTRACT\", message);\n}\n\n/**\n * Rules are community-contributed, so the contract is enforced rather than trusted: edits must\n * be in bounds, ascending, non-overlapping, and made of real code points.\n */\nexport function validateEdits(edits: readonly Edit[], length: number, ruleId?: RuleId): void {\n let previousEnd = 0;\n let i = -1;\n for (const edit of edits) {\n i += 1;\n const where = ruleId === undefined ? `edit ${i}` : `rule \"${ruleId}\" edit ${i}`;\n\n if (!Number.isInteger(edit.start) || !Number.isInteger(edit.end)) {\n reject(`${where} has non-integer bounds (${edit.start}, ${edit.end})`);\n }\n if (edit.start < 0 || edit.end > length) {\n reject(`${where} is out of bounds (${edit.start}, ${edit.end}) for length ${length}`);\n }\n if (edit.end < edit.start) {\n reject(`${where} has end ${edit.end} before start ${edit.start}`);\n }\n if (edit.start < previousEnd) {\n reject(`${where} starts at ${edit.start}, which overlaps or precedes the previous edit`);\n }\n if (ruleId !== undefined && edit.ruleId !== ruleId) {\n reject(`${where} is tagged \"${edit.ruleId}\" but was produced by rule \"${ruleId}\"`);\n }\n for (const value of edit.replacement) {\n if (!isValidCodePoint(value)) {\n reject(`${where} contains an invalid code point (${value})`);\n }\n }\n previousEnd = edit.end;\n }\n}\n\n/** Applies validated edits left to right, producing a new code-point array. */\nexport function applyEdits(\n cp: readonly number[],\n edits: readonly Edit[],\n ruleId?: RuleId,\n): number[] {\n validateEdits(edits, cp.length, ruleId);\n if (edits.length === 0) return cp.slice();\n\n const out: number[] = [];\n let cursor = 0;\n for (const edit of edits) {\n for (const value of cp.slice(cursor, edit.start)) out.push(value);\n for (const value of edit.replacement) out.push(value);\n cursor = edit.end;\n }\n for (const value of cp.slice(cursor)) out.push(value);\n return out;\n}\n","import type { Edit, RuleId } from \"../types.js\";\nimport { fromCodePoints } from \"./codepoints.js\";\n\n/**\n * analyze.md §2: every reported offset is a code-point offset into the input the caller passed,\n * in every mode. The rules, however, run over an array that is not the input — in `text` mode\n * edits from earlier rules have already shifted it, and in `html`/`markdown` mode it is the\n * marker-joined concatenation of the processable spans (modes.md §3.5). This module carries the\n * one structure that bridges the two: an origin map, parallel to the current code-point array,\n * holding the input offset each code point came from, or NO_ORIGIN for one the pipeline itself\n * produced.\n */\nexport const NO_ORIGIN = -1;\n\n/**\n * The input offset an edit boundary at `index` addresses. Synthetic code points have no origin\n * of their own, so the scan runs forward to the first that has one — an insertion between two\n * earlier insertions still lands where the next real character is. Falling off the end means the\n * boundary is at the end of the input.\n */\nexport function originAt(origin: readonly number[], index: number, inputLength: number): number {\n for (let i = index; i < origin.length; i += 1) {\n const value = origin[i] as number;\n if (value !== NO_ORIGIN) return value;\n }\n return inputLength;\n}\n\n/**\n * The origin map for the array `applyEdits` is about to produce. A replacement of equal length\n * keeps its origins position by position, which is what makes a conversion (U+0020 → U+00A0)\n * still point at the character it converted; anything longer is synthetic beyond the positions\n * it covers.\n */\nexport function applyEditsToOrigin(origin: readonly number[], edits: readonly Edit[]): number[] {\n if (edits.length === 0) return origin.slice();\n const out: number[] = [];\n let cursor = 0;\n for (const edit of edits) {\n for (let i = cursor; i < edit.start; i += 1) out.push(origin[i] as number);\n for (let k = 0; k < edit.replacement.length; k += 1) {\n const source = edit.start + k;\n out.push(source < edit.end ? (origin[source] as number) : NO_ORIGIN);\n }\n cursor = edit.end;\n }\n for (let i = cursor; i < origin.length; i += 1) out.push(origin[i] as number);\n return out;\n}\n\n/** One entry of `analyze`'s result, in input coordinates (analyze.md §2). */\nexport interface Change {\n readonly ruleId: RuleId;\n readonly start: number;\n readonly end: number;\n readonly before: string;\n readonly after: string;\n}\n\n/**\n * One rule's edits, in the coordinates that rule saw, rendered as Changes in input coordinates.\n * `before` is the text this rule replaced and `after` what it replaced it with (analyze.md §2),\n * so on a text two rules have both touched, `before` is what the second rule saw rather than\n * what the caller typed — §5 says so and shows the French case where it matters.\n */\nexport function recordChanges(\n cp: readonly number[],\n edits: readonly Edit[],\n origin: readonly number[],\n inputLength: number,\n ruleId: RuleId,\n): Change[] {\n return edits.map((edit) => ({\n ruleId,\n start: originAt(origin, edit.start, inputLength),\n end: originAt(origin, edit.end, inputLength),\n before: fromCodePoints(cp.slice(edit.start, edit.end)),\n after: fromCodePoints(edit.replacement),\n }));\n}\n","import { PolytypoError } from \"../errors.js\";\nimport { isRuleId, RULES, RULE_DEFAULTS, RULE_ORDER } from \"../rules/registry.js\";\nimport type { Edit, LocaleData, Mode, Options, RuleId } from \"../types.js\";\nimport { applyEdits } from \"./edits.js\";\nimport { applyEditsToOrigin, recordChanges, type Change } from \"./origin.js\";\n\n/**\n * The rules that will run, in spec order. An explicit `false` always disables a rule and an\n * absent key always means \"use that rule's own default\" (RULE_DEFAULTS in registry.ts) —\n * unchanged since spec 0.4.1. Spec 0.5.0 adds the other half: an explicit `true` on a\n * default-off rule (`ranges`, the first one) turns it on. This is not a \"one option is now\n * opt-in, opt-out for the rest\" special case — it is the same single rule applied uniformly:\n * `override ?? RULE_DEFAULTS[id]`. For every rule but `ranges`, `RULE_DEFAULTS[id]` is already\n * `true`, so an explicit `true` there was always a no-op (tests/engine/pipeline.test.ts still\n * asserts that), and the only thing that changes is which rules *can* have a meaningful `true`.\n * Disabling a rule removes it from the sequence and never reorders the rest (ARCHITECTURE.md\n * 4.5).\n */\nexport function planRules(rules: Options[\"rules\"]): RuleId[] {\n const overrides = new Map<RuleId, boolean>();\n if (rules !== undefined) {\n for (const [key, value] of Object.entries(rules)) {\n if (!isRuleId(key)) {\n throw new PolytypoError(\n \"POLYTYPO_UNKNOWN_RULE\",\n `Unknown rule \"${key}\". Known rules: ${RULE_ORDER.join(\", \")}.`,\n );\n }\n overrides.set(key, value);\n }\n }\n return RULE_ORDER.filter((id) => overrides.get(id) ?? RULE_DEFAULTS[id]);\n}\n\n/**\n * Rules report edits and the pipeline applies them; no rule ever touches a string\n * (ARCHITECTURE.md 7.1). Each rule sees the output of the previous one.\n */\nexport function runRules(\n cp: readonly number[],\n planned: readonly RuleId[],\n locale: LocaleData,\n mode: Mode,\n narrowTarget: number,\n): readonly number[] {\n let current = cp;\n for (const id of planned) {\n const rule = RULES[id];\n if (rule === undefined) continue;\n current = applyEdits(current, rule.apply({ cp: current, locale, mode, narrowTarget }), id);\n }\n return current;\n}\n\n/**\n * `runRules`, keeping the edits instead of discarding them (analyze.md §1: same pipeline, same\n * order, reporting rather than applying). The origin map travels alongside the array so every\n * change comes back in input coordinates, and `filterEdits` is the hook the span runner needs\n * for modes.md §3.4's boundary filters — text mode passes nothing and gets the identity.\n */\nexport function runRulesRecording(\n cp: readonly number[],\n planned: readonly RuleId[],\n locale: LocaleData,\n mode: Mode,\n narrowTarget: number,\n origin: readonly number[],\n inputLength: number,\n filterEdits?: (current: readonly number[], edits: readonly Edit[]) => readonly Edit[],\n): Change[] {\n let current = cp;\n let currentOrigin = origin;\n const changes: Change[] = [];\n for (const id of planned) {\n const rule = RULES[id];\n if (rule === undefined) continue;\n const produced = rule.apply({ cp: current, locale, mode, narrowTarget });\n const edits = filterEdits === undefined ? produced : filterEdits(current, produced);\n if (edits.length > 0) {\n changes.push(...recordChanges(current, edits, currentOrigin, inputLength, id));\n currentOrigin = applyEditsToOrigin(currentOrigin, edits);\n }\n current = applyEdits(current, edits, id);\n }\n return changes;\n}\n"],"mappings":";AAWO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAC9B;AAAA,EAET,YAAY,MAAyB,SAAiB;AACpD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;;;ACXO,SAAS,aAAa,OAAyB;AACpD,QAAM,MAAgB,CAAC;AACvB,QAAM,MAAM,MAAM;AAClB,MAAI,IAAI;AACR,SAAO,IAAI,KAAK;AACd,UAAM,OAAO,MAAM,WAAW,CAAC;AAC/B,QAAI,QAAQ,SAAU,QAAQ,SAAU,IAAI,IAAI,KAAK;AACnD,YAAM,OAAO,MAAM,WAAW,IAAI,CAAC;AACnC,UAAI,QAAQ,SAAU,QAAQ,OAAQ;AACpC,YAAI,MAAM,OAAO,SAAU,QAAS,OAAO,SAAU,KAAO;AAC5D,aAAK;AACL;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,IAAI;AACb,SAAK;AAAA,EACP;AACA,SAAO;AACT;AAEA,IAAM,QAAQ;AAEP,SAAS,eAAe,IAA+B;AAC5D,MAAI,GAAG,WAAW,EAAG,QAAO;AAC5B,MAAI,GAAG,UAAU,MAAO,QAAO,OAAO,cAAc,GAAG,EAAE;AACzD,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK,OAAO;AACzC,WAAO,OAAO,cAAc,GAAG,GAAG,MAAM,GAAG,IAAI,KAAK,CAAC;AAAA,EACvD;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,OAAwB;AACvD,SAAO,OAAO,UAAU,KAAK,KAAK,SAAS,KAAK,SAAS;AAC3D;;;ACnCO,IAAM,gBAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,UAA4C;AAAA,EACvD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,UAAgD;AAAA,EAC3D,IAAI,EAAE,QAAQ,MAAM,MAAM,SAAS,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,WAAW,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,eAAe,CAAC,SAAS,UAAU,GAAG,aAAa,CAAC,KAAK,SAAW,MAAM,MAAM,MAAM,MAAM,MAAM,SAAW,OAAO,QAAQ,QAAQ,MAAM,GAAG,cAAc,CAAC,GAAG,YAAY,CAAC,OAAO,QAAQ,MAAM,GAAG,cAAc,CAAC,MAAQ,GAAG,gBAAgB,SAAS,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,wxBAA42B,KAAK,uCAAuC,MAAM,8mDAAkwD,GAAG,EAAE,MAAM,UAAU,MAAM,mrBAAqvB,KAAK,uCAAuC,MAAM,qqBAAmuB,GAAG,EAAE,MAAM,UAAU,MAAM,gnBAAoqB,KAAK,uCAAuC,MAAM,m4BAA68B,GAAG,EAAE,MAAM,YAAY,MAAM,0fAAoiB,KAAK,uCAAuC,MAAM,0hBAAwkB,GAAG,EAAE,MAAM,UAAU,MAAM,okBAAkpB,KAAK,uCAAuC,MAAM,wpBAA4sB,GAAG,EAAE,MAAM,QAAQ,MAAM,+9BAA+lC,KAAK,uCAAuC,MAAM,ooEAA03E,GAAG,EAAE,MAAM,QAAQ,MAAM,omBAAgqB,KAAK,uCAAuC,MAAM,wvCAA03C,GAAG,EAAE,MAAM,QAAQ,MAAM,qeAA6hB,KAAK,uCAAuC,MAAM,mWAAuY,CAAC,EAAE;AAAA,EACz4f,SAAS,EAAE,QAAQ,SAAS,MAAM,wBAAwB,QAAQ,EAAE,SAAS,EAAE,MAAM,QAAU,OAAO,QAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,WAAW,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,SAAS,SAAS,SAAS,SAAS,YAAY,UAAU,GAAG,aAAa,CAAC,KAAK,UAAU,SAAW,MAAM,MAAM,MAAM,MAAM,QAAQ,KAAK,GAAG,cAAc,CAAC,QAAQ,QAAQ,SAAS,QAAQ,IAAI,GAAG,YAAY,CAAC,KAAK,GAAG,cAAc,CAAC,QAAU,UAAc,GAAG,gBAAgB,QAAQ,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,0TAAgV,KAAK,oIAAoI,MAAM,wRAAkS,GAAG,EAAE,MAAM,UAAU,MAAM,8NAAkO,KAAK,oIAAoI,MAAM,+FAAqG,GAAG,EAAE,MAAM,UAAU,MAAM,6PAA+P,KAAK,mIAAmI,GAAG,EAAE,MAAM,QAAQ,MAAM,8eAAwf,KAAK,oIAAoI,MAAM,2vBAAyxB,GAAG,EAAE,MAAM,QAAQ,MAAM,42BAAg4B,KAAK,2EAA2E,MAAM,87CAAo+C,GAAG,EAAE,MAAM,UAAU,MAAM,maAAmb,KAAK,2EAA2E,MAAM,keAA4e,CAAC,EAAE;AAAA,EAC73O,SAAS,EAAE,QAAQ,SAAS,MAAM,oBAAoB,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,WAAW,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,SAAS,SAAS,SAAS,YAAc,SAAS,UAAU,GAAG,aAAa,CAAC,KAAK,UAAU,UAAU,SAAW,MAAM,MAAM,MAAM,MAAM,QAAQ,KAAK,GAAG,cAAc,CAAC,OAAO,IAAI,GAAG,YAAY,CAAC,KAAK,GAAG,cAAc,CAAC,QAAU,UAAc,GAAG,gBAAgB,QAAQ,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,4PAA8Q,KAAK,2EAA2E,MAAM,qKAA6K,GAAG,EAAE,MAAM,UAAU,MAAM,qLAAqL,KAAK,sEAAsE,GAAG,EAAE,MAAM,UAAU,MAAM,0NAA4N,KAAK,oIAAoI,MAAM,wPAAkQ,GAAG,EAAE,MAAM,QAAQ,MAAM,iUAAuU,MAAM,6bAA6c,GAAG,EAAE,MAAM,QAAQ,MAAM,8nBAA8oB,KAAK,2EAA2E,MAAM,+iCAA2kC,GAAG,EAAE,MAAM,UAAU,MAAM,maAAmb,KAAK,2EAA2E,MAAM,qaAA+a,GAAG,EAAE,MAAM,QAAQ,MAAM,wRAA4R,MAAM,6nCAAupC,CAAC,EAAE;AAAA,EAC/wO,IAAI,EAAE,QAAQ,MAAM,MAAM,SAAS,QAAQ,EAAE,SAAS,EAAE,MAAM,QAAU,OAAO,QAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,QAAQ,OAAO,OAAO,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,GAAG,aAAa,CAAC,GAAG,cAAc,CAAC,GAAG,YAAY,CAAC,GAAG,cAAc,CAAC,GAAG,gBAAgB,OAAO,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,ghGAAkiG,KAAK,oGAAoG,MAAM,8pCAAgrC,GAAG,EAAE,MAAM,UAAU,MAAM,8tIAAkwI,KAAK,oGAAoG,MAAM,ozDAAg1D,GAAG,EAAE,MAAM,YAAY,MAAM,2xDAAizD,KAAK,oGAAoG,MAAM,i7FAA29F,GAAG,EAAE,MAAM,UAAU,MAAM,msDAA+tD,KAAK,oGAAoG,MAAM,wnCAAkoC,GAAG,EAAE,MAAM,QAAQ,MAAM,izDAAi0D,KAAK,oGAAoG,MAAM,s7FAA0/F,GAAG,EAAE,MAAM,UAAU,MAAM,y/BAAmgC,KAAK,oGAAoG,MAAM,6kBAAmlB,GAAG,EAAE,MAAM,cAAc,MAAM,gsDAAstD,KAAK,6HAA6H,MAAM,uuBAAyuB,GAAG,EAAE,MAAM,WAAW,MAAM,w1BAAs2B,KAAK,uEAAuE,MAAM,66BAAi7B,CAAC,EAAE;AAAA,EAC/p8B,SAAS,EAAE,QAAQ,SAAS,MAAM,4BAA4B,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,WAAW,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,GAAG,aAAa,CAAC,KAAK,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM,SAAW,SAAW,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,YAAY,CAAC,GAAG,cAAc,CAAC,GAAG,gBAAgB,OAAO,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,yEAAyE,KAAK,2EAA2E,MAAM,qpBAAypB,GAAG,EAAE,MAAM,UAAU,MAAM,4EAA4E,KAAK,2EAA2E,MAAM,kkBAAskB,GAAG,EAAE,MAAM,YAAY,MAAM,kEAAkE,KAAK,2EAA2E,MAAM,wVAAwV,GAAG,EAAE,MAAM,QAAQ,MAAM,wKAAwK,KAAK,8EAA8E,MAAM,seAAse,GAAG,EAAE,MAAM,QAAQ,MAAM,sGAAsG,KAAK,2EAA2E,MAAM,8cAAgd,GAAG,EAAE,MAAM,QAAQ,MAAM,sFAAsF,MAAM,2SAA2S,GAAG,EAAE,MAAM,QAAQ,MAAM,0FAA0F,KAAK,2EAA2E,MAAM,shBAAwhB,GAAG,EAAE,MAAM,UAAU,MAAM,4GAA4G,MAAM,6cAA6c,GAAG,EAAE,MAAM,UAAU,MAAM,8oBAA8oB,KAAK,8FAA8F,MAAM,szCAAwzC,CAAC,EAAE;AAAA,EAC1kQ,SAAS,EAAE,QAAQ,SAAS,MAAM,2BAA2B,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,EAAE,MAAM,QAAQ,QAAQ,KAAK,OAAO,OAAO,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,YAAY,OAAO,WAAW,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,GAAG,aAAa,CAAC,KAAK,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM,SAAW,SAAW,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,YAAY,CAAC,GAAG,cAAc,CAAC,GAAG,gBAAgB,QAAQ,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,sHAAsH,KAAK,sFAAsF,MAAM,yYAAyY,GAAG,EAAE,MAAM,UAAU,MAAM,6UAA6U,KAAK,6FAA6F,MAAM,gnBAAsnB,GAAG,EAAE,MAAM,UAAU,MAAM,4OAA4O,KAAK,iEAAiE,MAAM,uWAA+W,GAAG,EAAE,MAAM,UAAU,MAAM,mHAAmH,KAAK,uEAAuE,MAAM,gSAAgS,GAAG,EAAE,MAAM,YAAY,MAAM,gEAAgE,KAAK,oFAAoF,MAAM,+PAA+P,GAAG,EAAE,MAAM,QAAQ,MAAM,4HAA4H,KAAK,oFAAoF,MAAM,ocAAsc,GAAG,EAAE,MAAM,QAAQ,MAAM,wKAAwK,KAAK,8EAA8E,MAAM,yZAAyZ,GAAG,EAAE,MAAM,QAAQ,MAAM,qFAAqF,MAAM,qYAAuY,GAAG,EAAE,MAAM,UAAU,MAAM,4GAA4G,MAAM,ulBAAulB,GAAG,EAAE,MAAM,QAAQ,MAAM,yYAAyY,KAAK,wFAAwF,MAAM,89BAA89B,GAAG,EAAE,MAAM,UAAU,MAAM,8oBAA8oB,KAAK,8FAA8F,MAAM,gzCAAkzC,CAAC,EAAE;AAAA,EACzvU,IAAI,EAAE,QAAQ,MAAM,MAAM,WAAW,QAAQ,EAAE,SAAS,EAAE,MAAM,QAAU,OAAO,QAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,QAAQ,OAAO,OAAO,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,UAAU,SAAS,SAAS,WAAW,WAAW,aAAa,eAAe,QAAQ,GAAG,aAAa,CAAC,KAAK,UAAU,SAAW,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO,MAAM,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,QAAQ,WAAa,QAAQ,WAAa,UAAY,GAAG,YAAY,CAAC,OAAO,QAAQ,OAAO,GAAG,cAAc,CAAC,GAAG,gBAAgB,QAAQ,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,ofAAwgB,KAAK,mCAAmC,MAAM,2jCAA+mC,GAAG,EAAE,MAAM,UAAU,MAAM,qRAAiS,KAAK,mCAAmC,MAAM,ofAAkhB,GAAG,EAAE,MAAM,UAAU,MAAM,qSAAiT,KAAK,+BAA+B,MAAM,sxBAAkzB,GAAG,EAAE,MAAM,UAAU,MAAM,0TAAoV,KAAK,gCAAgC,MAAM,+gBAA+iB,GAAG,EAAE,MAAM,YAAY,MAAM,2MAAuN,KAAK,+CAA+C,MAAM,+cAAue,GAAG,EAAE,MAAM,UAAU,MAAM,wNAAgO,KAAK,gCAAgC,MAAM,+cAA+d,GAAG,EAAE,MAAM,QAAQ,MAAM,kSAAkT,KAAK,kFAAkF,MAAM,slCAAoqC,GAAG,EAAE,MAAM,QAAQ,MAAM,igBAAyiB,KAAK,uCAAuC,MAAM,uiCAAmmC,GAAG,EAAE,MAAM,QAAQ,MAAM,wJAA4J,KAAK,8EAA8E,MAAM,6cAAme,GAAG,EAAE,MAAM,QAAQ,MAAM,qhBAAijB,KAAK,sCAAsC,MAAM,6jDAAqpD,CAAC,EAAE;AAAA,EACp0a,IAAI,EAAE,QAAQ,MAAM,MAAM,WAAW,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,WAAW,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,aAAa,GAAG,aAAa,CAAC,KAAK,UAAU,QAAU,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,MAAM,KAAK,OAAO,KAAK,MAAM,SAAW,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,YAAY,CAAC,GAAG,cAAc,CAAC,MAAQ,GAAG,gBAAgB,OAAO,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,4FAA4F,KAAK,2DAA2D,MAAM,8YAA4Z,GAAG,EAAE,MAAM,UAAU,MAAM,iGAAiG,KAAK,gEAAgE,MAAM,6YAAya,GAAG,EAAE,MAAM,UAAU,MAAM,sHAA0H,KAAK,+EAA+E,MAAM,2OAAuP,GAAG,EAAE,MAAM,UAAU,MAAM,sJAAwJ,KAAK,8EAA8E,MAAM,kZAAwZ,GAAG,EAAE,MAAM,YAAY,MAAM,gGAAkG,KAAK,4DAA4D,MAAM,+OAA+O,GAAG,EAAE,MAAM,QAAQ,MAAM,kGAAkG,KAAK,6DAA6D,MAAM,qSAAqS,GAAG,EAAE,MAAM,QAAQ,MAAM,yHAAmI,KAAK,qEAAqE,MAAM,2kCAA+lC,GAAG,EAAE,MAAM,QAAQ,MAAM,qHAA6H,KAAK,wDAAwD,MAAM,uOAA+O,GAAG,EAAE,MAAM,QAAQ,MAAM,sSAAgT,KAAK,8EAA8E,MAAM,utDAAqwD,GAAG,EAAE,MAAM,QAAQ,MAAM,sGAAsG,KAAK,oEAAoE,MAAM,+0BAAy1B,GAAG,EAAE,MAAM,QAAQ,MAAM,0IAA4I,KAAK,4DAA4D,MAAM,k+CAA0+C,GAAG,EAAE,MAAM,UAAU,MAAM,yGAAyG,KAAK,wEAAwE,MAAM,skBAAwkB,CAAC,EAAE;AAAA,EACj8W,IAAI,EAAE,QAAQ,MAAM,MAAM,UAAU,QAAQ,EAAE,SAAS,EAAE,MAAM,QAAU,OAAO,QAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,UAAU,UAAU,QAAQ,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,OAAO,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,GAAG,yBAAyB,CAAC,KAAK,KAAK,GAAG,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,QAAQ,GAAG,aAAa,CAAC,KAAK,UAAU,UAAU,SAAW,MAAM,MAAM,MAAM,MAAM,QAAQ,KAAK,GAAG,cAAc,CAAC,QAAQ,QAAQ,SAAW,OAAS,GAAG,YAAY,CAAC,MAAM,OAAO,OAAO,QAAQ,QAAQ,OAAO,GAAG,cAAc,CAAC,MAAQ,GAAG,gBAAgB,SAAS,GAAG,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,sbAAod,KAAK,+CAA+C,MAAM,qkBAA2nB,GAAG,EAAE,MAAM,QAAQ,MAAM,4aAAge,KAAK,+CAA+C,MAAM,o5BAAw8B,GAAG,EAAE,MAAM,UAAU,MAAM,2QAAmS,KAAK,4DAA4D,MAAM,+yBAAu3B,GAAG,EAAE,MAAM,UAAU,MAAM,kTAAkU,KAAK,+CAA+C,MAAM,2XAA2Y,GAAG,EAAE,MAAM,UAAU,MAAM,qPAAyQ,KAAK,+CAA+C,MAAM,0rBAA8uB,GAAG,EAAE,MAAM,QAAQ,MAAM,weAA4gB,KAAK,+CAA+C,MAAM,upCAAywC,GAAG,EAAE,MAAM,UAAU,MAAM,2TAA+U,KAAK,+CAA+C,MAAM,4UAAgW,GAAG,EAAE,MAAM,QAAQ,MAAM,8aAA0d,KAAK,4JAA4J,MAAM,0pDAAwyD,GAAG,EAAE,MAAM,UAAU,MAAM,ikBAAqmB,KAAK,4GAA4G,MAAM,+rDAAiwD,GAAG,EAAE,MAAM,UAAU,MAAM,mbAAud,KAAK,8HAA8H,MAAM,quBAAmwB,CAAC,EAAE;AAAA,EACphf,SAAS,EAAE,QAAQ,SAAS,MAAM,mBAAmB,QAAQ,EAAE,SAAS,EAAE,MAAM,QAAU,OAAO,QAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,UAAU,UAAU,QAAQ,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,OAAO,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,QAAQ,GAAG,aAAa,CAAC,KAAK,UAAU,UAAU,SAAW,MAAM,MAAM,MAAM,MAAM,QAAQ,KAAK,GAAG,cAAc,CAAC,QAAQ,QAAQ,SAAW,OAAS,GAAG,YAAY,CAAC,MAAM,OAAO,OAAO,QAAQ,QAAQ,OAAO,GAAG,cAAc,CAAC,MAAQ,GAAG,gBAAgB,SAAS,GAAG,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,sdAA0f,KAAK,mJAAmJ,MAAM,g+BAAsiC,GAAG,EAAE,MAAM,QAAQ,MAAM,mMAAmN,KAAK,+CAA+C,MAAM,mzBAA+2B,GAAG,EAAE,MAAM,UAAU,MAAM,2hBAA6kB,KAAK,8GAA8G,MAAM,0aAA0c,GAAG,EAAE,MAAM,UAAU,MAAM,gRAAwS,KAAK,kEAAkE,MAAM,uPAAqQ,GAAG,EAAE,MAAM,YAAY,MAAM,6IAAqJ,KAAK,+CAA+C,MAAM,8JAA4K,GAAG,EAAE,MAAM,UAAU,MAAM,+HAAqI,KAAK,+CAA+C,MAAM,4LAAsM,GAAG,EAAE,MAAM,QAAQ,MAAM,8aAA0d,KAAK,4JAA4J,MAAM,0pDAAwyD,GAAG,EAAE,MAAM,UAAU,MAAM,ikBAAqmB,KAAK,4GAA4G,MAAM,+rDAAiwD,GAAG,EAAE,MAAM,UAAU,MAAM,mbAAud,KAAK,8HAA8H,MAAM,quBAAmwB,CAAC,EAAE;AAAA,EACzoZ,IAAI,EAAE,QAAQ,MAAM,MAAM,WAAW,QAAQ,EAAE,SAAS,EAAE,MAAM,QAAU,OAAO,QAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,KAAK,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,OAAO,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,GAAG,aAAa,CAAC,KAAK,UAAU,UAAU,SAAW,MAAM,MAAM,MAAM,MAAM,QAAQ,KAAK,GAAG,cAAc,CAAC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,cAAc,CAAC,GAAG,gBAAgB,OAAO,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,+dAA2e,KAAK,iGAAiG,MAAM,orCAA4tC,GAAG,EAAE,MAAM,UAAU,MAAM,wMAAoN,KAAK,iGAAiG,MAAM,2hCAA2kC,GAAG,EAAE,MAAM,UAAU,MAAM,kXAAkY,KAAK,iGAAiG,MAAM,4iCAA8kC,GAAG,EAAE,MAAM,UAAU,MAAM,qcAAyd,KAAK,iGAAiG,MAAM,4mBAA4oB,GAAG,EAAE,MAAM,YAAY,MAAM,sWAAsX,KAAK,sEAAsE,MAAM,k2BAAk3B,GAAG,EAAE,MAAM,UAAU,MAAM,mWAAqX,KAAK,iGAAiG,MAAM,6vBAA+wB,GAAG,EAAE,MAAM,QAAQ,MAAM,wJAA4J,KAAK,8EAA8E,MAAM,6jBAAmlB,GAAG,EAAE,MAAM,QAAQ,MAAM,oYAAoZ,KAAK,iGAAiG,MAAM,8tCAAozC,GAAG,EAAE,MAAM,QAAQ,MAAM,mNAAqN,MAAM,4+BAAk/B,GAAG,EAAE,MAAM,UAAU,MAAM,2pBAAyrB,KAAK,uGAAuG,MAAM,2vCAAiwC,CAAC,EAAE;AAAA,EACnze,IAAI,EAAE,QAAQ,MAAM,MAAM,SAAS,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,KAAK,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,OAAO,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,WAAW,GAAG,aAAa,CAAC,KAAK,UAAU,SAAW,MAAM,MAAM,MAAM,MAAM,QAAQ,KAAK,GAAG,cAAc,CAAC,GAAG,YAAY,CAAC,GAAG,cAAc,CAAC,UAAU,GAAG,GAAG,gBAAgB,OAAO,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,seAAwf,KAAK,6EAA6E,MAAM,01CAAs3C,GAAG,EAAE,MAAM,UAAU,MAAM,qZAAqa,KAAK,0FAA0F,MAAM,szBAAw0B,GAAG,EAAE,MAAM,UAAU,MAAM,yXAAyY,KAAK,uDAAuD,MAAM,uiBAAujB,GAAG,EAAE,MAAM,YAAY,MAAM,qSAAiT,KAAK,kFAAkF,MAAM,qfAAqgB,GAAG,EAAE,MAAM,UAAU,MAAM,0NAAkO,KAAK,kDAAkD,MAAM,8XAAgY,GAAG,EAAE,MAAM,QAAQ,MAAM,gtBAAwuB,KAAK,0FAA0F,MAAM,24CAA+7C,GAAG,EAAE,MAAM,QAAQ,MAAM,6YAA6Z,KAAK,qDAAqD,MAAM,qqBAAurB,GAAG,EAAE,MAAM,UAAU,MAAM,uTAA+T,KAAK,sCAAsC,MAAM,2tCAAiuC,GAAG,EAAE,MAAM,UAAU,MAAM,qYAA2Z,KAAK,4DAA4D,MAAM,mNAAmN,CAAC,EAAE;AAAA,EAC97Y,IAAI,EAAE,QAAQ,MAAM,MAAM,UAAU,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,QAAU,OAAO,QAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,WAAW,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,eAAe,CAAC,aAAa,sBAAwB,UAAU,GAAG,aAAa,CAAC,KAAK,UAAU,SAAW,MAAM,MAAM,MAAM,MAAM,QAAQ,KAAK,GAAG,cAAc,CAAC,GAAG,YAAY,CAAC,GAAG,cAAc,CAAC,MAAQ,GAAG,gBAAgB,OAAO,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,ukBAAmmB,KAAK,mDAAmD,MAAM,+uCAAyxC,GAAG,EAAE,MAAM,UAAU,MAAM,uUAAyV,KAAK,sHAAsH,MAAM,wrCAAgtC,GAAG,EAAE,MAAM,UAAU,MAAM,mVAA+V,KAAK,sHAAsH,MAAM,qlBAAinB,GAAG,EAAE,MAAM,YAAY,MAAM,gSAAgT,KAAK,yFAAyF,MAAM,kaAAwa,GAAG,EAAE,MAAM,UAAU,MAAM,4TAA0U,KAAK,2EAA2E,MAAM,4SAA8S,GAAG,EAAE,MAAM,QAAQ,MAAM,8YAAoa,KAAK,iGAAiG,MAAM,goCAAkrC,GAAG,EAAE,MAAM,QAAQ,MAAM,+UAAiW,KAAK,yEAAyE,MAAM,60CAAu2C,GAAG,EAAE,MAAM,QAAQ,MAAM,4fAA8gB,KAAK,8EAA8E,MAAM,2oCAAirC,GAAG,EAAE,MAAM,QAAQ,MAAM,sVAAsW,KAAK,sGAAsG,MAAM,kZAAsa,CAAC,EAAE;AAAA,EACjxa,SAAS,EAAE,QAAQ,SAAS,MAAM,uBAAuB,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,KAAK,KAAK,OAAO,KAAK,KAAK,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,OAAO,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,QAAQ,GAAG,aAAa,CAAC,KAAK,UAAU,SAAW,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO,IAAI,GAAG,cAAc,CAAC,IAAI,GAAG,YAAY,CAAC,GAAG,cAAc,CAAC,GAAG,gBAAgB,OAAO,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,6jBAAmnB,KAAK,sGAAsG,MAAM,8oCAA0tC,GAAG,EAAE,MAAM,UAAU,MAAM,oXAA4Z,KAAK,sGAAsG,MAAM,geAAwf,GAAG,EAAE,MAAM,UAAU,MAAM,kMAA8M,MAAM,gUAAsV,GAAG,EAAE,MAAM,YAAY,MAAM,olBAA8pB,KAAK,iGAAiG,MAAM,yoBAAirB,GAAG,EAAE,MAAM,UAAU,MAAM,4bAAgf,KAAK,uEAAuE,MAAM,+/BAA+kC,GAAG,EAAE,MAAM,QAAQ,MAAM,kQAAgR,KAAK,8EAA8E,MAAM,ijCAAioC,GAAG,EAAE,MAAM,QAAQ,MAAM,+KAAyL,MAAM,w4CAA0gD,GAAG,EAAE,MAAM,UAAU,MAAM,grBAAgvB,KAAK,8CAA8C,MAAM,yqDAAqsD,CAAC,EAAE;AAAA,EACvpa,SAAS,EAAE,QAAQ,SAAS,MAAM,yBAAyB,QAAQ,EAAE,SAAS,EAAE,MAAM,QAAU,OAAO,QAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,KAAK,KAAK,OAAO,KAAK,KAAK,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,OAAO,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,QAAQ,GAAG,aAAa,CAAC,KAAK,UAAU,SAAW,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO,IAAI,GAAG,cAAc,CAAC,IAAI,GAAG,YAAY,CAAC,GAAG,cAAc,CAAC,GAAG,gBAAgB,OAAO,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,4nBAAwrB,KAAK,iGAAiG,MAAM,+hCAAymC,GAAG,EAAE,MAAM,UAAU,MAAM,0SAA0U,KAAK,iGAAiG,MAAM,02BAAk7B,GAAG,EAAE,MAAM,UAAU,MAAM,2eAA2gB,KAAK,iGAAiG,MAAM,ogBAAsiB,GAAG,EAAE,MAAM,YAAY,MAAM,uPAA+Q,KAAK,iGAAiG,MAAM,ofAAghB,GAAG,EAAE,MAAM,UAAU,MAAM,+YAAqb,KAAK,uEAAuE,MAAM,+/BAA+kC,GAAG,EAAE,MAAM,QAAQ,MAAM,mkBAA+mB,KAAK,8EAA8E,MAAM,22BAA+6B,GAAG,EAAE,MAAM,QAAQ,MAAM,wpBAAkvB,KAAK,iGAAiG,MAAM,w4CAA0gD,GAAG,EAAE,MAAM,UAAU,MAAM,grBAAgvB,KAAK,8CAA8C,MAAM,yqDAAqsD,CAAC,EAAE;AAAA,EAC/vc,IAAI,EAAE,QAAQ,MAAM,MAAM,WAAW,QAAQ,EAAE,SAAS,EAAE,MAAM,QAAU,OAAO,QAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,WAAW,GAAG,UAAU,EAAE,0BAA0B,KAAK,GAAG,QAAQ,EAAE,UAAU,CAAC,uBAAuB,qBAAqB,GAAG,UAAU,CAAC,iBAAiB,6BAA6B,yCAAyC,6BAA6B,eAAe,GAAG,WAAW,CAAC,6BAA6B,iCAAiC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,UAAU,gBAAgB,gBAAgB,gBAAgB,gBAAgB,gBAAgB,gBAAgB,gBAAgB,gBAAgB,gBAAgB,cAAc,GAAG,eAAe,CAAC,0BAA0B,0BAA0B,mBAAmB,sBAAsB,GAAG,aAAa,CAAC,KAAK,UAAU,UAAU,SAAW,gBAAgB,gBAAgB,gBAAgB,gBAAgB,WAAW,iBAAiB,WAAW,iBAAiB,uBAAuB,sBAAsB,0BAA0B,GAAG,cAAc,CAAC,GAAG,YAAY,CAAC,iBAAiB,eAAe,GAAG,cAAc,CAAC,UAAU,MAAQ,GAAG,gBAAgB,QAAQ,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,0mCAAknC,KAAK,uGAAuG,MAAM,6sDAAqtD,GAAG,EAAE,MAAM,YAAY,MAAM,ivCAA6vC,KAAK,kGAAkG,MAAM,wmBAAgnB,GAAG,EAAE,MAAM,UAAU,MAAM,y0CAA61C,KAAK,+GAA+G,MAAM,uxCAAuxC,GAAG,EAAE,MAAM,QAAQ,MAAM,u0DAAq2D,KAAK,2LAA2L,MAAM,ixGAA+0G,GAAG,EAAE,MAAM,QAAQ,MAAM,qvFAA2wF,KAAK,uEAAuE,MAAM,i3XAAqgY,GAAG,EAAE,MAAM,UAAU,MAAM,k5DAA05D,KAAK,uDAAuD,MAAM,gtJAAguJ,CAAC,EAAE;AAAA,EAC7loC,IAAI,EAAE,QAAQ,MAAM,MAAM,WAAW,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,WAAW,GAAG,UAAU,EAAE,0BAA0B,MAAM,GAAG,QAAQ,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,GAAG,aAAa,CAAC,KAAK,UAAU,MAAM,UAAU,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,MAAM,MAAM,OAAO,OAAO,OAAO,OAAO,KAAK,OAAS,GAAG,cAAc,CAAC,GAAG,YAAY,CAAC,GAAG,cAAc,CAAC,MAAQ,GAAG,gBAAgB,OAAO,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,mLAA+L,KAAK,sEAAsE,MAAM,kpBAAsrB,GAAG,EAAE,MAAM,UAAU,MAAM,gFAAsF,KAAK,sEAAsE,MAAM,kVAA8V,GAAG,EAAE,MAAM,UAAU,MAAM,kFAAwF,KAAK,sEAAsE,MAAM,4mBAAgpB,GAAG,EAAE,MAAM,YAAY,MAAM,uGAA2G,KAAK,sEAAsE,MAAM,2NAA6N,GAAG,EAAE,MAAM,QAAQ,MAAM,oFAA0F,KAAK,sEAAsE,MAAM,g+BAAwgC,GAAG,EAAE,MAAM,QAAQ,MAAM,qLAAiM,KAAK,8EAA8E,MAAM,2iBAAikB,GAAG,EAAE,MAAM,QAAQ,MAAM,oGAA8G,KAAK,sEAAsE,MAAM,6aAA+a,GAAG,EAAE,MAAM,QAAQ,MAAM,+GAAmH,MAAM,onBAAooB,GAAG,EAAE,MAAM,QAAQ,MAAM,qIAA+I,KAAK,sEAAsE,MAAM,0rBAAwsB,GAAG,EAAE,MAAM,UAAU,MAAM,oHAA8H,KAAK,sEAAsE,MAAM,4jBAAkkB,CAAC,EAAE;AAAA,EAC5sR,IAAI,EAAE,QAAQ,MAAM,MAAM,aAAa,QAAQ,EAAE,SAAS,EAAE,MAAM,QAAU,OAAO,QAAU,YAAY,OAAO,GAAG,WAAW,EAAE,MAAM,UAAU,OAAO,UAAU,YAAY,OAAO,GAAG,eAAe,CAAC,GAAG,gBAAgB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,eAAe,aAAa,OAAO,WAAW,GAAG,UAAU,EAAE,0BAA0B,KAAK,GAAG,QAAQ,EAAE,UAAU,CAAC,6BAA6B,mCAAmC,yCAAyC,iCAAiC,GAAG,UAAU,CAAC,iBAAiB,iBAAiB,iBAAiB,iBAAiB,6BAA6B,6BAA6B,uCAAuC,GAAG,WAAW,CAAC,mCAAmC,uBAAuB,uBAAuB,iBAAiB,uBAAuB,uBAAuB,uBAAuB,uBAAuB,6BAA6B,6BAA6B,yCAAyC,6BAA6B,mCAAmC,mCAAmC,yCAAyC,yCAAyC,yCAAyC,qDAAqD,6CAA6C,EAAE,GAAG,MAAM,EAAE,mBAAmB,CAAC,GAAG,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,GAAG,eAAe,CAAC,0BAA0B,gCAAgC,8BAA8B,kCAAkC,GAAG,aAAa,CAAC,KAAK,gBAAgB,sBAAsB,gBAAgB,gBAAgB,sBAAsB,gBAAgB,gBAAgB,gBAAgB,gBAAgB,gBAAgB,gBAAgB,mCAAmC,iBAAiB,sBAAsB,4BAA4B,4BAA4B,sBAAsB,SAAS,GAAG,cAAc,CAAC,GAAG,YAAY,CAAC,6BAA6B,uBAAuB,2BAA2B,GAAG,cAAc,CAAC,GAAG,gBAAgB,QAAQ,GAAG,SAAS,CAAC,EAAE,MAAM,UAAU,MAAM,q0DAA22D,KAAK,yDAAyD,MAAM,y0FAAi1F,GAAG,EAAE,MAAM,UAAU,MAAM,kqCAA4qC,KAAK,yDAAyD,MAAM,qvFAA6wF,GAAG,EAAE,MAAM,UAAU,MAAM,ynCAAmoC,KAAK,yDAAyD,MAAM,g6CAA46C,GAAG,EAAE,MAAM,YAAY,MAAM,0xDAA8yD,KAAK,yDAAyD,MAAM,87BAA87B,GAAG,EAAE,MAAM,UAAU,MAAM,0nDAA0oD,KAAK,yDAAyD,MAAM,qsDAA+sD,GAAG,EAAE,MAAM,UAAU,MAAM,80DAAk2D,KAAK,yDAAyD,MAAM,+pGAAurG,GAAG,EAAE,MAAM,QAAQ,MAAM,q3EAAu4E,KAAK,yDAAyD,MAAM,2zIAA64I,GAAG,EAAE,MAAM,QAAQ,MAAM,6qEAA+rE,KAAK,8EAA8E,MAAM,w9IAAo/I,CAAC,EAAE;AACp/sC;;;AChDA,IAAM,SAAS;AACf,IAAM,aAAa;AACnB,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,WAAW;AAGjB,SAAS,SAAS,OAAwB;AACxC,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,OAAO;AAChB;AAEA,SAAS,aAAa,IAAiC;AACrD,SAAO,OAAO,UAAa,MAAM,WAAW,MAAM;AACpD;AAEA,SAAS,aAAa,IAAiC;AACrD,SAAO,OAAO,UAAa,MAAM,WAAW,MAAM;AACpD;AAOA,SAAS,aAAa,KAAuB;AAC3C,QAAM,IAAI,aAAa,GAAG,EAAE,IAAI,CAAC,OAAQ,OAAO,aAAa,SAAS,EAAG;AACzE,QAAM,IAAI,EAAE;AACZ,MAAI,KAAK,GAAG;AACV,eAAW,KAAK,CAAC,GAAG,CAAC,GAAG;AACtB,UAAI,aAAa,EAAE,CAAC,CAAC,EAAG,GAAE,CAAC,IAAK,EAAE,CAAC,IAAe;AAAA,IACpD;AAAA,EACF;AACA,MAAI,MAAM,KAAK,EAAE,CAAC,MAAM,QAAQ;AAC9B,eAAW,KAAK,CAAC,GAAG,CAAC,GAAG;AACtB,UAAI,aAAa,EAAE,CAAC,CAAC,EAAG,GAAE,CAAC,IAAK,EAAE,CAAC,IAAe;AAAA,IACpD;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,iBAAiB,GAA+B;AACvD,MAAI,EAAE,WAAW,EAAG,QAAO,aAAa,EAAE,CAAC,CAAC,KAAK,aAAa,EAAE,CAAC,CAAC;AAClE,MAAI,EAAE,WAAW,GAAG;AAClB,WACE,aAAa,EAAE,CAAC,CAAC,KACjB,aAAa,EAAE,CAAC,CAAC,KACjB,EAAE,CAAC,MAAM,UACT,aAAa,EAAE,CAAC,CAAC,KACjB,aAAa,EAAE,CAAC,CAAC;AAAA,EAErB;AACA,SAAO;AACT;AAGA,SAAS,YAAY,KAAiC;AACpD,QAAM,SAAS,OAAO,UAAU,eAAe,KAAK,SAAS,GAAG,IAAI,QAAQ,GAAG,IAAI;AACnF,MAAI,WAAW,OAAW,QAAO;AACjC,MAAI,CAAC,cAAc,SAAS,MAAM,GAAG;AACnC,UAAM,IAAI;AAAA,MACR;AAAA,MACA,mBAAmB,GAAG,gBAAgB,MAAM;AAAA,IAC9C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,OAAO,KAAiC;AAG/C,MAAI,cAAc,SAAS,GAAG,EAAG,QAAO;AACxC,SAAO,YAAY,GAAG;AACxB;AASO,SAAS,iBAAiB,KAAsB;AAMrD,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,MACA,oEAAoE,SAAS,GAAG,CAAC;AAAA,IACnF;AAAA,EACF;AACA,QAAM,IAAI,aAAa,GAAG;AAC1B,MAAI,iBAAiB,CAAC,GAAG;AACvB,UAAM,YAAY,eAAe,CAAC;AAClC,UAAM,SAAS,OAAO,SAAS;AAC/B,QAAI,WAAW,OAAW,QAAO;AACjC,QAAI,EAAE,WAAW,GAAG;AAClB,YAAM,OAAO,OAAO,eAAe,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;AACjD,UAAI,SAAS,OAAW,QAAO;AAAA,IACjC;AAAA,EACF;AACA,QAAM,IAAI;AAAA,IACR;AAAA,IACA,mBAAmB,GAAG,qBAAqB,cAAc,KAAK,IAAI,CAAC;AAAA,EACrE;AACF;AAEO,SAAS,cAAc,KAA0B;AACtD,QAAM,WAAW,iBAAiB,GAAG;AACrC,QAAM,OAAO,OAAO,UAAU,eAAe,KAAK,SAAS,QAAQ,IAC/D,QAAQ,QAAQ,IAChB;AACJ,MAAI,SAAS,QAAW;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,MACA,WAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;;;ACnIO,IAAM,wBAAwB;AAE9B,IAAM,iBAAiB;AAUvB,SAAS,oBAAoB,OAAuC;AACzE,MAAI,UAAU,UAAa,UAAU,SAAU,QAAO;AACtD,MAAI,UAAU,OAAQ,QAAO;AAC7B,QAAM,IAAI;AAAA,IACR;AAAA,IACA,sBAAsB,KAAK,UAAU,KAAK,CAAC;AAAA,EAC7C;AACF;;;ACvBA;AAAA,EACE;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC5F;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAAK;AAAA,EAC1F;AAAA,EAAK;AAAA,EAAK;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EACxF;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAC1F;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EACtF;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACtF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAClD;;;ACjFO,IAAM,gBAAmC;AAGzC,SAAS,SAAS,IAAqB;AAC5C,MAAI,KAAK,EAAG,QAAO;AACnB,MAAI,KAAK,IAAM,QAAQ,MAAM,MAAQ,MAAM,MAAU,MAAM,MAAQ,MAAM;AACzE,MAAI,KAAK;AACT,MAAI,KAAK,cAAc,SAAS,IAAI;AACpC,SAAO,MAAM,IAAI;AACf,UAAM,MAAO,KAAK,MAAO;AACzB,UAAM,QAAQ,cAAc,MAAM,CAAC;AACnC,UAAM,MAAM,cAAc,MAAM,IAAI,CAAC;AACrC,QAAI,KAAK,MAAO,MAAK,MAAM;AAAA,aAClB,KAAK,IAAK,MAAK,MAAM;AAAA,QACzB,QAAO;AAAA,EACd;AACA,SAAO;AACT;AAWO,IAAM,eAAkC;AAAA,EAC7C;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC5F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAC3F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAQ;AAAA,EACrF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxF;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAC1F;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAC1F;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAC1F;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAC1F;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAC1F;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAC1F;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAC1F;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EA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A,EAC1F;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EACvF;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EACvF;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EACxF;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EACvF;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EACxF;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EACvF;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EACxF;AAAA,EAAO;AAAA,EAAO;AAAA,EAAG;AAAA,EAAK;AAAA,EAAO;AAAA,EAAO;AAAA,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","names":["HYPHEN","DIGIT_ZERO","DIGIT_NINE","isDigit","bind","HYPHEN","at","HYPHEN_MINUS","DIGIT_ZERO","DIGIT_NINE","at","isDigit","scan","a","SPACE","FULL_STOP","DIGIT_ZERO","DIGIT_NINE","EN_DASH","EM_DASH","at","isDigit","isAlnum","isBreak","scan","at","isAlnum","DIGIT_ZERO","DIGIT_NINE","DIGIT_ZERO","DIGIT_NINE","SQ","INLINE_SPACE","SPACELIKE","OPENISH","CLOSEISH","at","isDigit","isAlnum","FULL_STOP","COMMA","DIGIT_ZERO","scan","bind","SPACE","COMMA","FULL_STOP","SEMICOLON","EXCLAMATION","QUESTION","ELLIPSIS","PAREN_OPEN","PAREN_CLOSE","SQUARE_OPEN","SQUARE_CLOSE","HYPHEN_MINUS","SOLIDUS","DIGIT_ZERO","DIGIT_NINE","at","isBreak","isDotlike","isOpenBracket","PAREN_OPEN","PAREN_CLOSE","SQUARE_CLOSE","SPACE","NBSP","NNBSP","DIGIT_ZERO","DIGIT_NINE","SOLIDUS","HYPHEN_MINUS","SQUARE_OPEN","at","isDigit","isAlnum","isSpaceLike","matchesAt"]}
|