@mailwoman/resolver-wof-sqlite 5.1.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/candidate-lookup.d.ts.map +1 -1
- package/out/candidate-lookup.js +7 -1
- package/out/candidate-lookup.js.map +1 -1
- package/out/geonames-aliases.d.ts +9 -0
- package/out/geonames-aliases.d.ts.map +1 -1
- package/out/geonames-aliases.js +76 -7
- package/out/geonames-aliases.js.map +1 -1
- package/out/geonames-postal.d.ts +64 -0
- package/out/geonames-postal.d.ts.map +1 -0
- package/out/geonames-postal.js +116 -0
- package/out/geonames-postal.js.map +1 -0
- package/out/lookup.d.ts +28 -0
- package/out/lookup.d.ts.map +1 -1
- package/out/lookup.js +265 -21
- package/out/lookup.js.map +1 -1
- package/out/schema.d.ts +5 -0
- package/out/schema.d.ts.map +1 -1
- package/out/sharding.d.ts +19 -1
- package/out/sharding.d.ts.map +1 -1
- package/out/sharding.js +39 -5
- package/out/sharding.js.map +1 -1
- package/out/types.d.ts +17 -0
- package/out/types.d.ts.map +1 -1
- package/out/unified-schema.d.ts.map +1 -1
- package/out/unified-schema.js +7 -0
- package/out/unified-schema.js.map +1 -1
- package/package.json +7 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidate-lookup.d.ts","sourceRoot":"","sources":["../candidate-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAU1C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAA;AAE3F,MAAM,WAAW,2BAA2B;IAC3C,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,YAAY,CAAA;CACvB;AA6CD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,WAAW;;gBA0B9C,IAAI,EAAE,2BAA2B;IAoDvC,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"candidate-lookup.d.ts","sourceRoot":"","sources":["../candidate-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAU1C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAA;AAE3F,MAAM,WAAW,2BAA2B;IAC3C,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,YAAY,CAAA;CACvB;AA6CD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,WAAW;;gBA0B9C,IAAI,EAAE,2BAA2B;IAoDvC,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA8JjE,KAAK,IAAI,IAAI;CAGb"}
|
package/out/candidate-lookup.js
CHANGED
|
@@ -123,9 +123,15 @@ export class WOFCandidateTableLookup {
|
|
|
123
123
|
return expandPlacetypeFilter(want).includes("locality");
|
|
124
124
|
}
|
|
125
125
|
async findPlace(query) {
|
|
126
|
-
|
|
126
|
+
let text = (query.text ?? "").trim();
|
|
127
127
|
if (!text)
|
|
128
128
|
return [];
|
|
129
|
+
// #920 name law, candidate-key edition: postcode rows are keyed by their whitespace-stripped
|
|
130
|
+
// form at build (the GeoNames fold normalizes '624 66' → '62466'), so a postcode-typed query
|
|
131
|
+
// strips internal whitespace before keying. Postcode-only — locality names keep their spaces.
|
|
132
|
+
if ([query.placetype].flat().includes("postalcode")) {
|
|
133
|
+
text = text.replace(/\s+/g, "");
|
|
134
|
+
}
|
|
129
135
|
const nameKey = normalizeLocalityForKey(text);
|
|
130
136
|
if (!nameKey)
|
|
131
137
|
return [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidate-lookup.js","sourceRoot":"","sources":["../candidate-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAE3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,2BAA2B,EAAiC,MAAM,mCAAmC,CAAA;AAC9G,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AA6BvF;;;GAGG;AACH,MAAM,WAAW,GAAG,EAAE,CAAA;AACtB,MAAM,SAAS,GAAG,IAAI,CAAA;AAEtB;;;;GAIG;AACH,SAAS,eAAe,CAAC,CAAS;IACjC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QAE3B,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAChD,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IACnC,GAAG,CAAc;IACjB,OAAO,CAAS;IACP,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAA;IACxC,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAA;IACxC,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC1C,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAA;IACnD;;;OAGG;IACM,gBAAgB,CAAiD;IAC1E;;;OAGG;IACM,SAAS,CAAiD;IACnE;;;;;;OAMG;IACM,mBAAmB,CAAiD;IAE7E,YAAY,IAAiC;QAC5C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAA;YACxB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACrB,CAAC;aAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;YAClE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACpB,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;QAC9E,CAAC;QAED,gGAAgG;QAChG,sEAAsE;QACtE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAAmC,EAAE,CAAC;YAC/G,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;YACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACzC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;QAC1C,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG;aACtB,OAAO,CAAC,2CAA2C,CAAC;aACpD,GAAG,EAAqC,EAAE,CAAC;YAC5C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAC1D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;QAC3D,CAAC;QAED,8FAA8F;QAC9F,2FAA2F;QAC3F,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,2BAA2B,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CACvC,iDAAiD,2BAA2B,8CAA8C,CAC1H,CAAA;QACF,CAAC;QAED,iGAAiG;QACjG,iGAAiG;QACjG,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAChC,wBAAwB,mBAAmB,UAAU,mBAAmB,0BAA0B,mBAAmB,WAAW,CAChI,CAAA;YACD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAA;QAClG,CAAC;IACF,CAAC;IAED,iGAAiG;IACjG,cAAc,CAAC,SAAsC;QACpD,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAA;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAE/D,OAAO,qBAAqB,CAAC,IAAyB,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;IAC7E,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAqB;QACpC,
|
|
1
|
+
{"version":3,"file":"candidate-lookup.js","sourceRoot":"","sources":["../candidate-lookup.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,5 +55,14 @@ export declare function ingestGeonamesAliases(db: DatabaseSync, countries: strin
|
|
|
55
55
|
* `parentID` scoping and adminCoherence can't reach them and "Tbilisi, GE" can't resolve.
|
|
56
56
|
*/
|
|
57
57
|
adminForCountries?: ReadonlySet<string>;
|
|
58
|
+
/**
|
|
59
|
+
* #936: directory of per-country alternateNamesV2 dumps
|
|
60
|
+
* (`download.geonames.org/export/dump/alternatenames/<CC>.zip` → `<CC>.txt`). When a country's file is present,
|
|
61
|
+
* alias rows gain their language tag, `privateuse` ("preferred" from `isPreferredName`), and the `official` bit
|
|
62
|
+
* (language is CLDR-official for the country, colloquial/historic excluded — the rule the #936 risk probe measured
|
|
63
|
+
* at 7 new name-exact collisions globally). The main dump's bare `alternatenames` list still decides WHICH rows
|
|
64
|
+
* exist; V2 only decorates them. Missing file = the pre-#936 untagged behavior, not an error.
|
|
65
|
+
*/
|
|
66
|
+
alternateDir?: string;
|
|
58
67
|
}): number;
|
|
59
68
|
//# sourceMappingURL=geonames-aliases.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geonames-aliases.d.ts","sourceRoot":"","sources":["../geonames-aliases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"geonames-aliases.d.ts","sourceRoot":"","sources":["../geonames-aliases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI/C;;;GAGG;AACH,eAAO,MAAM,gBAAgB,gBAAoB,CAAA;AAEjD,+FAA+F;AAC/F,MAAM,WAAW,sBAAsB;IACtC,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAA;IACd,+FAA+F;IAC/F,OAAO,EAAE,OAAO,CAAA;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACpC,EAAE,EAAE,YAAY,EAChB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,EACpD,IAAI,CAAC,EAAE;IACN;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACvC;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACrB,GACC,MAAM,CA6NR"}
|
package/out/geonames-aliases.js
CHANGED
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
*/
|
|
26
26
|
import { existsSync, readFileSync } from "node:fs";
|
|
27
27
|
import { join } from "node:path";
|
|
28
|
+
import { isOfficialLanguage } from "@mailwoman/codex/country";
|
|
28
29
|
/**
|
|
29
30
|
* Synthetic id base for GeoNames-sourced rows (#743/#193) — above Overture's 8e12 so the three sources (WOF real ids,
|
|
30
31
|
* Overture, GeoNames) never collide in a combined DB.
|
|
@@ -47,7 +48,7 @@ export function ingestGeonamesAliases(db, countries, geonamesDir, onProgress, op
|
|
|
47
48
|
return t && LATIN_NAME.test(t) && /\p{L}/u.test(t) ? t : null;
|
|
48
49
|
};
|
|
49
50
|
const sprInsert = db.prepare(`INSERT OR REPLACE INTO spr (id, parent_id, name, placetype, country, latitude, longitude, min_latitude, min_longitude, max_latitude, max_longitude, is_current, is_deprecated, is_ceased, is_superseded, is_superseding, lastmodified) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
50
|
-
const namesInsert = db.prepare(`INSERT INTO names (id, name, placetype, country, language, lastmodified) VALUES (?, ?, ?, ?, ?, ?)`);
|
|
51
|
+
const namesInsert = db.prepare(`INSERT INTO names (id, name, placetype, country, language, privateuse, official, lastmodified) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
51
52
|
const populationInsert = db.prepare(`INSERT OR REPLACE INTO place_population (id, population) VALUES (?, ?)`);
|
|
52
53
|
// #267 admin linkage: ancestor rows (locality→region→country) so parentID scoping + adminCoherence reach
|
|
53
54
|
// the gap countries. Only used for a country in opts.adminForCountries.
|
|
@@ -75,9 +76,75 @@ export function ingestGeonamesAliases(db, countries, geonamesDir, onProgress, op
|
|
|
75
76
|
let nc = 0;
|
|
76
77
|
// #267: add A-class admin + ancestry only for the gap countries this country is in (never the EU set).
|
|
77
78
|
const addAdmin = opts?.adminForCountries?.has(cc) ?? false;
|
|
78
|
-
// GeoNames dump columns (0-indexed): 1 name, 2 asciiname, 3 alternatenames, 4 lat, 5 lon,
|
|
79
|
-
// 7 feature_code, 10 admin1 code, 14 pop.
|
|
79
|
+
// GeoNames dump columns (0-indexed): 0 geonameid, 1 name, 2 asciiname, 3 alternatenames, 4 lat, 5 lon,
|
|
80
|
+
// 6 feature_class, 7 feature_code, 10 admin1 code, 14 pop.
|
|
80
81
|
const lines = readFileSync(file, "utf8").split("\n");
|
|
82
|
+
// #936: V2 tags for this country's P-class rows — geonameid → exact alias spelling → tag. The V2
|
|
83
|
+
// dump repeats one spelling under several languages ("Åbo" sv/da/no); the merged tag is official /
|
|
84
|
+
// preferred if ANY qualifying row is.
|
|
85
|
+
const v2File = opts?.alternateDir ? join(opts.alternateDir, `${cc}.txt`) : undefined;
|
|
86
|
+
let v2;
|
|
87
|
+
if (v2File && existsSync(v2File)) {
|
|
88
|
+
const wanted = new Set();
|
|
89
|
+
for (const line of lines) {
|
|
90
|
+
const f = line.split("\t");
|
|
91
|
+
if (f[6] === "P")
|
|
92
|
+
wanted.add(Number(f[0]));
|
|
93
|
+
}
|
|
94
|
+
v2 = new Map();
|
|
95
|
+
// V2 columns (0-indexed): 1 geonameid, 2 isolanguage, 3 name, 4 isPreferredName, 5 isShortName,
|
|
96
|
+
// 6 isColloquial, 7 isHistoric, 8 from, 9 to.
|
|
97
|
+
//
|
|
98
|
+
// Two passes, because historic-ness is a fact about the NAME, not the row: GeoNames splits one
|
|
99
|
+
// spelling across rows — Malabo carries "Santa Isabel" as (es, unflagged) AND as (no-language,
|
|
100
|
+
// isHistoric=1, to=1973). Officialness must see the flags from EVERY row for the spelling, or the
|
|
101
|
+
// colonial-era name sails through on the language-tagged row (the #936 review's Malabo finding).
|
|
102
|
+
// Do NOT gate on isPreferredName instead — it's sparse annotation, not a signal (Turku's sv "Åbo"
|
|
103
|
+
// is unflagged; FI has 1,746 flags across the whole dump).
|
|
104
|
+
const v2Lines = readFileSync(v2File, "utf8").split("\n");
|
|
105
|
+
const historicNames = new Set();
|
|
106
|
+
for (const line of v2Lines) {
|
|
107
|
+
if (!line)
|
|
108
|
+
continue;
|
|
109
|
+
const f = line.split("\t");
|
|
110
|
+
if (f[6] === "1" || f[7] === "1" || (f[9] ?? "").trim() !== "") {
|
|
111
|
+
const alt = (f[3] ?? "").trim();
|
|
112
|
+
if (alt && wanted.has(Number(f[1])))
|
|
113
|
+
historicNames.add(`${f[1]}|${alt}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (const line of v2Lines) {
|
|
117
|
+
if (!line)
|
|
118
|
+
continue;
|
|
119
|
+
const f = line.split("\t");
|
|
120
|
+
const gid = Number(f[1]);
|
|
121
|
+
if (!wanted.has(gid))
|
|
122
|
+
continue;
|
|
123
|
+
const lang = f[2] ?? "";
|
|
124
|
+
// ISO 639 codes are 2-3 letters; GeoNames' pseudo-codes (post, link, iata, wkdt, …) are 4+.
|
|
125
|
+
if (!/^[a-z]{2,3}$/.test(lang))
|
|
126
|
+
continue;
|
|
127
|
+
const alt = (f[3] ?? "").trim();
|
|
128
|
+
if (!alt)
|
|
129
|
+
continue;
|
|
130
|
+
const preferred = f[4] === "1";
|
|
131
|
+
const official = !historicNames.has(`${gid}|${alt}`) && isOfficialLanguage(cc, lang) ? 1 : 0;
|
|
132
|
+
let byName = v2.get(gid);
|
|
133
|
+
if (!byName)
|
|
134
|
+
v2.set(gid, (byName = new Map()));
|
|
135
|
+
const prev = byName.get(alt);
|
|
136
|
+
if (!prev)
|
|
137
|
+
byName.set(alt, { language: lang, privateuse: preferred ? "preferred" : "", official });
|
|
138
|
+
else {
|
|
139
|
+
if (official && !prev.official) {
|
|
140
|
+
prev.language = lang;
|
|
141
|
+
prev.official = 1;
|
|
142
|
+
}
|
|
143
|
+
if (preferred && !prev.privateuse)
|
|
144
|
+
prev.privateuse = "preferred";
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
81
148
|
// #267 admin pre-pass (gap countries): fold the country (PCLI) + regions (ADM1), self+ancestry them, and
|
|
82
149
|
// build the admin1→region map the localities link through. Point bbox (GeoNames gives a centroid only).
|
|
83
150
|
let countryID = -1;
|
|
@@ -100,13 +167,13 @@ export function ingestGeonamesAliases(db, countries, geonamesDir, onProgress, op
|
|
|
100
167
|
continue; // one country row
|
|
101
168
|
countryID = id++;
|
|
102
169
|
sprInsert.run(countryID, -1, aname, "country", cc, lat, lon, lat, lon, lat, lon, 1, 0, 0, 0, 0, 0);
|
|
103
|
-
namesInsert.run(countryID, aname, "country", cc, "", 0);
|
|
170
|
+
namesInsert.run(countryID, aname, "country", cc, "", "", 0, 0);
|
|
104
171
|
ancestorInsert.run(countryID, countryID, "country");
|
|
105
172
|
}
|
|
106
173
|
else if (f[7] === "ADM1" && f[10]) {
|
|
107
174
|
const rid = id++;
|
|
108
175
|
sprInsert.run(rid, -1, aname, "region", cc, lat, lon, lat, lon, lat, lon, 1, 0, 0, 0, 0, 0);
|
|
109
|
-
namesInsert.run(rid, aname, "region", cc, "", 0);
|
|
176
|
+
namesInsert.run(rid, aname, "region", cc, "", "", 0, 0);
|
|
110
177
|
ancestorInsert.run(rid, rid, "region");
|
|
111
178
|
adminMap.set(f[10], rid);
|
|
112
179
|
}
|
|
@@ -139,7 +206,7 @@ export function ingestGeonamesAliases(db, countries, geonamesDir, onProgress, op
|
|
|
139
206
|
// Point bbox — a GeoNames row is a centroid; the candidate's region-bbox disambiguation just
|
|
140
207
|
// sees it as contained in itself, fine for a locality.
|
|
141
208
|
sprInsert.run(nid, parentID, name, "locality", cc, lat, lon, lat, lon, lat, lon, 1, 0, 0, 0, 0, 0);
|
|
142
|
-
namesInsert.run(nid, name, "locality", cc, "", 0);
|
|
209
|
+
namesInsert.run(nid, name, "locality", cc, "", "", 0, 0);
|
|
143
210
|
if (addAdmin) {
|
|
144
211
|
ancestorInsert.run(nid, nid, "locality");
|
|
145
212
|
if (regionID >= 0)
|
|
@@ -148,11 +215,13 @@ export function ingestGeonamesAliases(db, countries, geonamesDir, onProgress, op
|
|
|
148
215
|
ancestorInsert.run(nid, countryID, "country");
|
|
149
216
|
}
|
|
150
217
|
const seen = new Set([name]);
|
|
218
|
+
const tags = v2?.get(Number(f[0]));
|
|
151
219
|
for (const raw of [f[2] ?? "", ...(f[3] ? f[3].split(",") : [])]) {
|
|
152
220
|
const alt = clean(raw);
|
|
153
221
|
if (alt && !seen.has(alt)) {
|
|
154
222
|
seen.add(alt);
|
|
155
|
-
|
|
223
|
+
const tag = tags?.get(alt);
|
|
224
|
+
namesInsert.run(nid, alt, "locality", cc, tag?.language ?? "", tag?.privateuse ?? "", tag?.official ?? 0, 0);
|
|
156
225
|
}
|
|
157
226
|
}
|
|
158
227
|
const pop = Number(f[14]) || 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geonames-aliases.js","sourceRoot":"","sources":["../geonames-aliases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,iBAAiB,CAAA;AAYjD;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACpC,EAAgB,EAChB,SAAmB,EACnB,WAAmB,EACnB,UAAoD,EACpD,
|
|
1
|
+
{"version":3,"file":"geonames-aliases.js","sourceRoot":"","sources":["../geonames-aliases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* #920 — fold GeoNames POSTAL codes into a WOF/unified postcode shard as first-class
|
|
7
|
+
* `postalcode` places, for the countries whose WOF postalcode repos don't exist (the
|
|
8
|
+
* namesake-tail locales: FI/CZ/SK/SI/DK/NO/HR/PL and any future gap).
|
|
9
|
+
*
|
|
10
|
+
* Why: the night-31 taxonomy measured the cross-locale resolve tail as NAMESAKE COLLISION
|
|
11
|
+
* (FI 300/1k … PL 75/1k offender rows), and the controlled experiment showed postcode-shard
|
|
12
|
+
* coverage alone collapses it (FI 300→1, CZ 131→4): a resolvable postcode node feeds the
|
|
13
|
+
* resolver's coordinate-first sibling-postcode candidate injection, which binds the locality
|
|
14
|
+
* pick to its postcode neighborhood. The machinery already ships; it was coverage-starved.
|
|
15
|
+
*
|
|
16
|
+
* Two hard-won laws from the experiment are enforced HERE, in code, not in a runbook:
|
|
17
|
+
*
|
|
18
|
+
* 1. **The name law (#920 format law):** a postcode row's `name` is stored in the
|
|
19
|
+
* SANITIZED-QUERY token shape — every non-letter/number stripped — because that is what
|
|
20
|
+
* `sanitizeFTSQuery` reduces the parsed token to at lookup time. Stored `"110 00"` (CZ) or
|
|
21
|
+
* `"11-041"` (PL) can never match the query `"11000"`/`"11041"`; the spaced CZ build
|
|
22
|
+
* measured WORSE than no coverage (+13 namesake rows) because its bigrams partial-matched
|
|
23
|
+
* WRONG codes. The display form is preserved as an alt row in `names`.
|
|
24
|
+
* 2. **Medoid centroids:** GeoNames postal is one row per (postcode, settlement); the naive
|
|
25
|
+
* mean-of-members centroid displaced tighter village coordinates on already-correct rows
|
|
26
|
+
* (the p50-tax that ni-failed SK/SI/HR at 1.10–1.94 km CI). The MEDOID — the member point
|
|
27
|
+
* nearest the mean — keeps the coordinate on a real settlement.
|
|
28
|
+
*
|
|
29
|
+
* Package home for the same reason as `geonames-aliases.ts`: `build-unified-wof
|
|
30
|
+
* --geonames-postal-countries`, any standalone fold, and the `mailwoman gazetteer` commands
|
|
31
|
+
* share ONE implementation. GeoNames postal dump = `download.geonames.org/export/zip/<CC>.zip`
|
|
32
|
+
* → `<CC>.txt` (TSV: country, postcode, place, admin1, code1, admin2, code2, admin3, code3,
|
|
33
|
+
* lat, lon, accuracy). License CC BY 4.0 — attribution rides the shard's `meta` provenance and
|
|
34
|
+
* the model card like the existing GeoNames alias fold.
|
|
35
|
+
*/
|
|
36
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
37
|
+
/**
|
|
38
|
+
* Synthetic id base for GeoNames-POSTAL rows — its own namespace above the alias fold's {@link GEONAMES_ID_BASE} (9e12)
|
|
39
|
+
* allocation so all four sources (WOF, Overture, GeoNames-alias, GeoNames-postal) coexist collision-free in a combined
|
|
40
|
+
* DB.
|
|
41
|
+
*/
|
|
42
|
+
export declare const GEONAMES_POSTAL_ID_BASE = 9500000000000;
|
|
43
|
+
/**
|
|
44
|
+
* The #920 name law: reduce a postal code to the sanitized-query token shape — strip every non-letter/number — so the
|
|
45
|
+
* stored name matches what `sanitizeFTSQuery` produces from the parsed postcode token. `"110 00"` → `"11000"`,
|
|
46
|
+
* `"11-041"` → `"11041"`, `"AD500"` → `"AD500"`.
|
|
47
|
+
*/
|
|
48
|
+
export declare function normalizePostcodeName(raw: string): string;
|
|
49
|
+
export interface GeonamesPostalIngestResult {
|
|
50
|
+
/** Distinct postcodes inserted across all countries. */
|
|
51
|
+
inserted: number;
|
|
52
|
+
/** Per-country distinct-postcode counts. */
|
|
53
|
+
byCountry: Record<string, number>;
|
|
54
|
+
/** Countries whose `<CC>.txt` was missing under the postal dir (skipped, reported). */
|
|
55
|
+
missing: string[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Fold GeoNames postal codes for `countries` into an open unified/postcode ingest DB: one `spr` row per distinct
|
|
59
|
+
* normalized postcode (placetype `postalcode`, medoid centroid, degenerate bbox), the normalized form as `name`, and
|
|
60
|
+
* the display form as an extra `names` row when it differs. The caller owns the FTS rebuild (rows ride the standard
|
|
61
|
+
* freeze phase).
|
|
62
|
+
*/
|
|
63
|
+
export declare function ingestGeonamesPostal(db: DatabaseSync, countries: readonly string[], postalDir: string): GeonamesPostalIngestResult;
|
|
64
|
+
//# sourceMappingURL=geonames-postal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geonames-postal.d.ts","sourceRoot":"","sources":["../geonames-postal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,gBAAoB,CAAA;AAExD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,MAAM,WAAW,0BAA0B;IAC1C,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,uFAAuF;IACvF,OAAO,EAAE,MAAM,EAAE,CAAA;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CACnC,EAAE,EAAE,YAAY,EAChB,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,SAAS,EAAE,MAAM,GACf,0BAA0B,CAwE5B"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* #920 — fold GeoNames POSTAL codes into a WOF/unified postcode shard as first-class
|
|
7
|
+
* `postalcode` places, for the countries whose WOF postalcode repos don't exist (the
|
|
8
|
+
* namesake-tail locales: FI/CZ/SK/SI/DK/NO/HR/PL and any future gap).
|
|
9
|
+
*
|
|
10
|
+
* Why: the night-31 taxonomy measured the cross-locale resolve tail as NAMESAKE COLLISION
|
|
11
|
+
* (FI 300/1k … PL 75/1k offender rows), and the controlled experiment showed postcode-shard
|
|
12
|
+
* coverage alone collapses it (FI 300→1, CZ 131→4): a resolvable postcode node feeds the
|
|
13
|
+
* resolver's coordinate-first sibling-postcode candidate injection, which binds the locality
|
|
14
|
+
* pick to its postcode neighborhood. The machinery already ships; it was coverage-starved.
|
|
15
|
+
*
|
|
16
|
+
* Two hard-won laws from the experiment are enforced HERE, in code, not in a runbook:
|
|
17
|
+
*
|
|
18
|
+
* 1. **The name law (#920 format law):** a postcode row's `name` is stored in the
|
|
19
|
+
* SANITIZED-QUERY token shape — every non-letter/number stripped — because that is what
|
|
20
|
+
* `sanitizeFTSQuery` reduces the parsed token to at lookup time. Stored `"110 00"` (CZ) or
|
|
21
|
+
* `"11-041"` (PL) can never match the query `"11000"`/`"11041"`; the spaced CZ build
|
|
22
|
+
* measured WORSE than no coverage (+13 namesake rows) because its bigrams partial-matched
|
|
23
|
+
* WRONG codes. The display form is preserved as an alt row in `names`.
|
|
24
|
+
* 2. **Medoid centroids:** GeoNames postal is one row per (postcode, settlement); the naive
|
|
25
|
+
* mean-of-members centroid displaced tighter village coordinates on already-correct rows
|
|
26
|
+
* (the p50-tax that ni-failed SK/SI/HR at 1.10–1.94 km CI). The MEDOID — the member point
|
|
27
|
+
* nearest the mean — keeps the coordinate on a real settlement.
|
|
28
|
+
*
|
|
29
|
+
* Package home for the same reason as `geonames-aliases.ts`: `build-unified-wof
|
|
30
|
+
* --geonames-postal-countries`, any standalone fold, and the `mailwoman gazetteer` commands
|
|
31
|
+
* share ONE implementation. GeoNames postal dump = `download.geonames.org/export/zip/<CC>.zip`
|
|
32
|
+
* → `<CC>.txt` (TSV: country, postcode, place, admin1, code1, admin2, code2, admin3, code3,
|
|
33
|
+
* lat, lon, accuracy). License CC BY 4.0 — attribution rides the shard's `meta` provenance and
|
|
34
|
+
* the model card like the existing GeoNames alias fold.
|
|
35
|
+
*/
|
|
36
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
37
|
+
import { join } from "node:path";
|
|
38
|
+
/**
|
|
39
|
+
* Synthetic id base for GeoNames-POSTAL rows — its own namespace above the alias fold's {@link GEONAMES_ID_BASE} (9e12)
|
|
40
|
+
* allocation so all four sources (WOF, Overture, GeoNames-alias, GeoNames-postal) coexist collision-free in a combined
|
|
41
|
+
* DB.
|
|
42
|
+
*/
|
|
43
|
+
export const GEONAMES_POSTAL_ID_BASE = 9_500_000_000_000;
|
|
44
|
+
/**
|
|
45
|
+
* The #920 name law: reduce a postal code to the sanitized-query token shape — strip every non-letter/number — so the
|
|
46
|
+
* stored name matches what `sanitizeFTSQuery` produces from the parsed postcode token. `"110 00"` → `"11000"`,
|
|
47
|
+
* `"11-041"` → `"11041"`, `"AD500"` → `"AD500"`.
|
|
48
|
+
*/
|
|
49
|
+
export function normalizePostcodeName(raw) {
|
|
50
|
+
return raw.replace(/[^\p{L}\p{N}]/gu, "");
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Fold GeoNames postal codes for `countries` into an open unified/postcode ingest DB: one `spr` row per distinct
|
|
54
|
+
* normalized postcode (placetype `postalcode`, medoid centroid, degenerate bbox), the normalized form as `name`, and
|
|
55
|
+
* the display form as an extra `names` row when it differs. The caller owns the FTS rebuild (rows ride the standard
|
|
56
|
+
* freeze phase).
|
|
57
|
+
*/
|
|
58
|
+
export function ingestGeonamesPostal(db, countries, postalDir) {
|
|
59
|
+
const sprInsert = db.prepare(`INSERT OR REPLACE INTO spr (id, parent_id, name, placetype, country, latitude, longitude, min_latitude, min_longitude, max_latitude, max_longitude, is_current, is_deprecated, is_ceased, is_superseded, is_superseding, lastmodified) VALUES (?, -1, ?, 'postalcode', ?, ?, ?, ?, ?, ?, ?, 1, 0, 0, 0, 0, 0)`);
|
|
60
|
+
const namesInsert = db.prepare(`INSERT INTO names (id, name, placetype, country, language, lastmodified) VALUES (?, ?, 'postalcode', ?, '', 0)`);
|
|
61
|
+
let nextID = GEONAMES_POSTAL_ID_BASE;
|
|
62
|
+
const byCountry = {};
|
|
63
|
+
const missing = [];
|
|
64
|
+
let inserted = 0;
|
|
65
|
+
for (const country of countries) {
|
|
66
|
+
const cc = country.toUpperCase();
|
|
67
|
+
const file = join(postalDir, `${cc}.txt`);
|
|
68
|
+
if (!existsSync(file)) {
|
|
69
|
+
missing.push(cc);
|
|
70
|
+
console.error(` GeoNames postal ${cc}: ${file} missing — download from download.geonames.org/export/zip/${cc}.zip; skipped`);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
// Group member settlement points per NORMALIZED code; remember one display form.
|
|
74
|
+
const members = new Map();
|
|
75
|
+
for (const line of readFileSync(file, "utf8").split("\n")) {
|
|
76
|
+
const cols = line.split("\t");
|
|
77
|
+
if (cols.length < 11)
|
|
78
|
+
continue;
|
|
79
|
+
const display = cols[1].trim();
|
|
80
|
+
const name = normalizePostcodeName(display);
|
|
81
|
+
const lat = Number(cols[9]);
|
|
82
|
+
const lon = Number(cols[10]);
|
|
83
|
+
if (!name || !Number.isFinite(lat) || !Number.isFinite(lon))
|
|
84
|
+
continue;
|
|
85
|
+
const m = members.get(name) ?? { display, pts: [] };
|
|
86
|
+
m.pts.push([lat, lon]);
|
|
87
|
+
members.set(name, m);
|
|
88
|
+
}
|
|
89
|
+
db.exec("BEGIN");
|
|
90
|
+
for (const [name, m] of members) {
|
|
91
|
+
// Medoid: the member point nearest the mean — stays on a real settlement (the p50-tax law).
|
|
92
|
+
const meanLat = m.pts.reduce((s, p) => s + p[0], 0) / m.pts.length;
|
|
93
|
+
const meanLon = m.pts.reduce((s, p) => s + p[1], 0) / m.pts.length;
|
|
94
|
+
let best = m.pts[0];
|
|
95
|
+
let bestD = Infinity;
|
|
96
|
+
for (const p of m.pts) {
|
|
97
|
+
const d = (p[0] - meanLat) ** 2 + (p[1] - meanLon) ** 2;
|
|
98
|
+
if (d < bestD) {
|
|
99
|
+
bestD = d;
|
|
100
|
+
best = p;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const id = nextID++;
|
|
104
|
+
sprInsert.run(id, name, cc, best[0], best[1], best[0], best[1], best[0], best[1]);
|
|
105
|
+
namesInsert.run(id, name, cc);
|
|
106
|
+
if (m.display !== name)
|
|
107
|
+
namesInsert.run(id, m.display, cc);
|
|
108
|
+
inserted++;
|
|
109
|
+
}
|
|
110
|
+
db.exec("COMMIT");
|
|
111
|
+
byCountry[cc] = members.size;
|
|
112
|
+
console.error(` GeoNames postal ${cc}: ${members.size.toLocaleString()} distinct codes (medoid centroids)`);
|
|
113
|
+
}
|
|
114
|
+
return { inserted, byCountry, missing };
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=geonames-postal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geonames-postal.js","sourceRoot":"","sources":["../geonames-postal.ts"],"names":[],"mappings":"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"}
|
package/out/lookup.d.ts
CHANGED
|
@@ -85,6 +85,13 @@ export interface RankingWeights {
|
|
|
85
85
|
* strong text match.
|
|
86
86
|
*/
|
|
87
87
|
proximityBoost: number;
|
|
88
|
+
/**
|
|
89
|
+
* Magnitude of the bias-hint term inside the exact-tier PROMINENCE sort (the `bias`/viewport path). Deliberately
|
|
90
|
+
* population-scale (default = populationBoost) so a candidate near the map view / the user beats a distant-but-bigger
|
|
91
|
+
* namesake — "the map view wins" is the feature; same-region ties (all candidates far from every hint) still fall to
|
|
92
|
+
* population.
|
|
93
|
+
*/
|
|
94
|
+
biasBoost: number;
|
|
88
95
|
/** Distance (km) at which the proximity boost halves. Tune to the typical query radius. */
|
|
89
96
|
proximityScaleKm: number;
|
|
90
97
|
/**
|
|
@@ -121,6 +128,27 @@ export interface RankingWeights {
|
|
|
121
128
|
* handful of states match a 2-letter query).
|
|
122
129
|
*/
|
|
123
130
|
exactMatchTiering: boolean;
|
|
131
|
+
/**
|
|
132
|
+
* #936 option 3 — official-language names ARE names. When true, a candidate holding the query as an OFFICIAL name
|
|
133
|
+
* (`names.official = 1`: a preferred-form name in an official language of its country, stamped at ingest) joins the
|
|
134
|
+
* NAME-exact sub-tier rather than the alias-exact one, provided its population clears {@link officialNameExactFloor}.
|
|
135
|
+
* Fixes unscoped "Åbo" → Turku (its official Swedish name) over a hamlet literally named Åbo; population still orders
|
|
136
|
+
* within the sub-tier, so Paris → Paris FR is untouched.
|
|
137
|
+
*
|
|
138
|
+
* Default true (operator-promoted 2026-07-03 after the pre-registered gate battery: four intended exonym flips —
|
|
139
|
+
* Berne→Bern, Bruges→Brugge, Roma→Rome, Åbo→Turku — with the namesake/abbreviation rows and the US/FI panels
|
|
140
|
+
* byte-identical). Requires a gazetteer carrying the #940 ingest bit — on older DBs without the `official` column the
|
|
141
|
+
* probe fails soft and behavior is identical to the flag being off.
|
|
142
|
+
*/
|
|
143
|
+
officialNameExact: boolean;
|
|
144
|
+
/**
|
|
145
|
+
* Minimum population for a candidate's official names to join the name-exact sub-tier. The #936 review's no-floor
|
|
146
|
+
* census measured the boundary: ≥100k holders are the famous-exonym class (757 flips, intent-correct; 7 collisions,
|
|
147
|
+
* none harmful) while 10k–100k holders are junk-dominated (3,481 flips led by short-form mis-tags — Villeneuve-Loubet
|
|
148
|
+
* carrying "villeneuve" would bury five real villages of that name). Rank-time knob: tunable without re-ingest;
|
|
149
|
+
* below-floor official names simply stay alias-tier (today's behavior).
|
|
150
|
+
*/
|
|
151
|
+
officialNameExactFloor: number;
|
|
124
152
|
}
|
|
125
153
|
/** Padded character-trigram set (a leading/trailing space pads short tokens). */
|
|
126
154
|
export declare function trigrams(s: string): Set<string>;
|
package/out/lookup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAsB,MAAM,aAAa,CAAA;AAG9D,OAAO,EAAyB,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAKnG,OAAO,EAIN,KAAK,UAAU,EACf,KAAK,gBAAgB,EAGrB,MAAM,iBAAiB,CAAA;AAWxB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAE7E,OAAO,
|
|
1
|
+
{"version":3,"file":"lookup.d.ts","sourceRoot":"","sources":["../lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAsB,MAAM,aAAa,CAAA;AAG9D,OAAO,EAAyB,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAKnG,OAAO,EAIN,KAAK,UAAU,EACf,KAAK,gBAAgB,EAGrB,MAAM,iBAAiB,CAAA;AAWxB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAE7E,OAAO,EAKN,KAAK,WAAW,EAChB,MAAM,eAAe,CAAA;AAEtB,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAA;AAE3F,MAAM,WAAW,wBAAwB;IACxC;;;;;;;;;;;;;OAaG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,GAAG,WAAW,CAAC,CAAA;IAC3D;;;OAGG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC3D;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,wBAAwB,CAAA;CAC5C;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC9B,mFAAmF;IACnF,mBAAmB,EAAE,MAAM,CAAA;IAC3B,sFAAsF;IACtF,qBAAqB,EAAE,MAAM,CAAA;IAC7B,+EAA+E;IAC/E,iBAAiB,EAAE,MAAM,CAAA;IACzB,8EAA8E;IAC9E,gBAAgB,EAAE,MAAM,CAAA;IACxB,uFAAuF;IACvF,eAAe,EAAE,MAAM,CAAA;IACvB,sFAAsF;IACtF,mBAAmB,EAAE,MAAM,CAAA;IAC3B;;;;;OAKG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB;;;;;OAKG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB,2FAA2F;IAC3F,gBAAgB,EAAE,MAAM,CAAA;IACxB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,CAAA;IACvB;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAA;IAC5B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,iBAAiB,EAAE,OAAO,CAAA;IAC1B;;;;;;;;;;;OAWG;IACH,iBAAiB,EAAE,OAAO,CAAA;IAC1B;;;;;;OAMG;IACH,sBAAsB,EAAE,MAAM,CAAA;CAC9B;AAkGD,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAO/C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU3D;AAqBD,qBAAa,oBAAqB,YAAW,WAAW,EAAE,UAAU;;gBAuDvD,IAAI,EAAE,wBAAwB,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAkHvE,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAyDjE;;;;;OAKG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,kBAAkB,EAAE;IAsDvE;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,EAAE;IAytB1C,KAAK,IAAI,IAAI;IAUb,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAgBxB"}
|