From f3a9e0680a17ceac3883880ccfdf22e75bcfb1f7 Mon Sep 17 00:00:00 2001 From: Gary Tokman Date: Tue, 26 May 2026 18:35:02 -0400 Subject: [PATCH 1/2] feat: add generated permissive MTA input types --- README.md | 4 + index.ts | 12 +- package.json | 2 + scripts/generate-known-types.ts | 105 + src/generated.ts | 6827 +++++++++++++++++++++++++++++++ src/types.ts | 36 +- 6 files changed, 6970 insertions(+), 16 deletions(-) create mode 100644 scripts/generate-known-types.ts create mode 100644 src/generated.ts diff --git a/README.md b/README.md index 347e9ec..28d125d 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,10 @@ For production static stop search, prefer the hosted API. It serves a compact Blob-backed snapshot instead of requiring each SDK consumer to manage GTFS imports. +Route and stop inputs include generated autocomplete for known MTA values while +remaining permissive for future route and stop additions. Refresh the generated +types from the hosted stops snapshot with `bun run generate:types`. + ## Endpoints - `mta.subway.arrivals(...)` diff --git a/index.ts b/index.ts index f13d137..5822a50 100644 --- a/index.ts +++ b/index.ts @@ -16,6 +16,7 @@ import type { Route, Stop, StopsNearQuery, + SubwayArrivalQuery, TransitMode, Vehicle, } from "./src/types"; @@ -107,13 +108,7 @@ export class MTA { class SubwayClient { constructor(private readonly mta: MTA) {} - async arrivals(query: { - stopId: string; - route?: string; - direction?: Direction | "uptown" | "downtown"; - limit?: number; - includeRaw?: boolean; - }): Promise { + async arrivals(query: SubwayArrivalQuery): Promise { if (this.mta.hostedApiEnabled()) { return this.mta.hostedJson("/api/v1/subway/arrivals", query); } @@ -146,7 +141,7 @@ class SubwayClient { private arrivalsFromFeed( feed: GtfsRealtimeFeed, stopIds: Set, - query: { stopId: string; route?: string; direction?: Direction | "uptown" | "downtown"; includeRaw?: boolean }, + query: SubwayArrivalQuery, ) { const arrivals: Arrival[] = []; const wantedDirection = normalizeDirection(query.direction); @@ -481,4 +476,5 @@ function alertMatchesMode( export { decodeFeedMessage, encodeFeedMessage } from "./src/gtfs-realtime"; export { GTFSCache } from "./src/static-gtfs"; export * from "./src/errors"; +export type * from "./src/generated"; export type * from "./src/types"; diff --git a/package.json b/package.json index 36b2843..84d1b89 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "files": [ "index.ts", "src", + "scripts", "examples", "README.md" ], @@ -20,6 +21,7 @@ }, "types": "./index.ts", "scripts": { + "generate:types": "bun scripts/generate-known-types.ts", "test": "bun test", "typecheck": "bunx tsc --noEmit" }, diff --git a/scripts/generate-known-types.ts b/scripts/generate-known-types.ts new file mode 100644 index 0000000..391937a --- /dev/null +++ b/scripts/generate-known-types.ts @@ -0,0 +1,105 @@ +import { writeFileSync } from "node:fs" + +const snapshotUrl = + process.env.MTA_STOPS_SNAPSHOT_URL ?? + process.env.NEXT_PUBLIC_MTA_STOPS_SNAPSHOT_URL + +if (!snapshotUrl) { + throw new Error("MTA_STOPS_SNAPSHOT_URL is required to generate known MTA types.") +} + +type SnapshotStop = { + id: string + mode?: string +} + +type SnapshotRoute = { + id?: string + shortName?: string + type?: number +} + +type Snapshot = { + generatedAt?: string + stops?: SnapshotStop[] + stopRoutes?: Record + indexes?: { + routesToStops?: Record + } +} + +const snapshot = (await fetch(snapshotUrl).then((response) => { + if (!response.ok) { + throw new Error(`Unable to fetch stops snapshot: ${response.status} ${response.statusText}`) + } + return response.json() +})) as Snapshot + +const stops = snapshot.stops ?? [] +const routeEntries = Object.entries(snapshot.indexes?.routesToStops ?? {}) +const routeMetadata = new Map() +const routeTypes = new Map() + +for (const routes of Object.values(snapshot.stopRoutes ?? {})) { + for (const route of routes) { + for (const id of [route.id, route.shortName]) { + if (!id) continue + routeMetadata.set(id, route) + if (route.type !== undefined) routeTypes.set(id, route.type) + } + } +} + +function aliasesForRoute(routeId: string) { + const route = routeMetadata.get(routeId) + const aliases = new Set([routeId, route?.id, route?.shortName].filter((id): id is string => Boolean(id))) + + for (const id of [...aliases]) { + if (id.endsWith("-SBS")) aliases.add(id.replace(/-SBS$/, "")) + if (id.endsWith("+")) aliases.add(id.replace(/\+$/, "")) + } + + return [...aliases] +} + +function routeType(routeId: string) { + return ( + routeTypes.get(routeId) ?? + routeTypes.get(`${routeId}-SBS`) ?? + routeTypes.get(`${routeId}+`) ?? + routeMetadata.get(routeId)?.type + ) +} + +function looksLikeSubwayRoute(routeId: string) { + if (routeType(routeId) !== undefined) return false + return /^[A-Z0-9]{1,2}$/.test(routeId) +} + +const routeIds = routeEntries.flatMap(([routeId]) => aliasesForRoute(routeId)) +const subwayRoutes = routeIds.filter((routeId) => routeType(routeId) === 1 || looksLikeSubwayRoute(routeId)) +const busRoutes = routeIds.filter((routeId) => routeType(routeId) === 3) +const stopIds = stops.map((stop) => stop.id) +const subwayStopIds = stops.filter((stop) => stop.mode === "subway").map((stop) => stop.id) +const busStopIds = stops.filter((stop) => stop.mode === "bus").map((stop) => stop.id) + +function uniqueSorted(values: string[]) { + return [...new Set(values)].sort((a, b) => a.localeCompare(b, "en", { numeric: true })) +} + +function union(name: string, values: string[]) { + const sorted = uniqueSorted(values) + if (!sorted.length) return `export type ${name} = never;\n` + + return [ + `export type ${name} =`, + ...sorted.map((value, index) => ` ${index === 0 ? "" : "| "}${JSON.stringify(value)}`), + ].join("\n") + "\n" +} + +const generated = `// Generated by scripts/generate-known-types.ts from the hosted stops snapshot.\n// Snapshot generated at: ${snapshot.generatedAt ?? "unknown"}\n// Do not edit by hand.\n\n${union("KnownRoute", routeIds)}\n${union("KnownSubwayRoute", subwayRoutes)}\n${union("KnownBusRoute", busRoutes)}\n${union("KnownStopId", stopIds)}\n${union("KnownSubwayStopId", subwayStopIds)}\n${union("KnownBusStopId", busStopIds)}` + +writeFileSync(new URL("../src/generated.ts", import.meta.url), generated) +console.log( + `Generated src/generated.ts with ${uniqueSorted(routeIds).length} routes and ${uniqueSorted(stopIds).length} stops.`, +) diff --git a/src/generated.ts b/src/generated.ts new file mode 100644 index 0000000..265f98e --- /dev/null +++ b/src/generated.ts @@ -0,0 +1,6827 @@ +// Generated by scripts/generate-known-types.ts from the hosted stops snapshot. +// Snapshot generated at: 2026-05-26T17:12:29.787Z +// Do not edit by hand. + +export type KnownRoute = + "1" + | "2" + | "3" + | "4" + | "5" + | "6" + | "6X" + | "7" + | "7X" + | "A" + | "B" + | "C" + | "D" + | "E" + | "F" + | "FS" + | "FX" + | "G" + | "GS" + | "H" + | "J" + | "L" + | "M" + | "M1" + | "M2" + | "M3" + | "M4" + | "M5" + | "M7" + | "M8" + | "M9" + | "M10" + | "M11" + | "M12" + | "M14A" + | "M14A-SBS" + | "M14A+" + | "M14D" + | "M14D-SBS" + | "M14D+" + | "M15" + | "M15-SBS" + | "M15+" + | "M20" + | "M21" + | "M22" + | "M23" + | "M23-SBS" + | "M23+" + | "M31" + | "M34" + | "M34-SBS" + | "M34+" + | "M34A" + | "M34A-SBS" + | "M34A+" + | "M35" + | "M42" + | "M50" + | "M55" + | "M57" + | "M60" + | "M60-SBS" + | "M60+" + | "M66" + | "M72" + | "M79" + | "M79-SBS" + | "M79+" + | "M86" + | "M86-SBS" + | "M86+" + | "M96" + | "M98" + | "M101" + | "M102" + | "M103" + | "M104" + | "M106" + | "M116" + | "M125" + | "N" + | "Q" + | "R" + | "S" + | "SI" + | "SIR" + | "W" + | "Z" + +export type KnownSubwayRoute = + "1" + | "2" + | "3" + | "4" + | "5" + | "6" + | "6X" + | "7" + | "7X" + | "A" + | "B" + | "C" + | "D" + | "E" + | "F" + | "FS" + | "FX" + | "G" + | "GS" + | "H" + | "J" + | "L" + | "M" + | "N" + | "Q" + | "R" + | "S" + | "W" + | "Z" + +export type KnownBusRoute = + "M1" + | "M2" + | "M3" + | "M4" + | "M5" + | "M7" + | "M8" + | "M9" + | "M10" + | "M11" + | "M12" + | "M14A" + | "M14A-SBS" + | "M14A+" + | "M14D" + | "M14D-SBS" + | "M14D+" + | "M15" + | "M15-SBS" + | "M15+" + | "M20" + | "M21" + | "M22" + | "M23" + | "M23-SBS" + | "M23+" + | "M31" + | "M34" + | "M34-SBS" + | "M34+" + | "M34A" + | "M34A-SBS" + | "M34A+" + | "M35" + | "M42" + | "M50" + | "M55" + | "M57" + | "M60" + | "M60-SBS" + | "M60+" + | "M66" + | "M72" + | "M79" + | "M79-SBS" + | "M79+" + | "M86" + | "M86-SBS" + | "M86+" + | "M96" + | "M98" + | "M101" + | "M102" + | "M103" + | "M104" + | "M106" + | "M116" + | "M125" + +export type KnownStopId = + "101" + | "101N" + | "101S" + | "103" + | "103N" + | "103S" + | "104" + | "104N" + | "104S" + | "106" + | "106N" + | "106S" + | "107" + | "107N" + | "107S" + | "108" + | "108N" + | "108S" + | "109" + | "109N" + | "109S" + | "110" + | "110N" + | "110S" + | "111" + | "111N" + | "111S" + | "112" + | "112N" + | "112S" + | "113" + | "113N" + | "113S" + | "114" + | "114N" + | "114S" + | "115" + | "115N" + | "115S" + | "116" + | "116N" + | "116S" + | "117" + | "117N" + | "117S" + | "118" + | "118N" + | "118S" + | "119" + | "119N" + | "119S" + | "120" + | "120N" + | "120S" + | "121" + | "121N" + | "121S" + | "122" + | "122N" + | "122S" + | "123" + | "123N" + | "123S" + | "124" + | "124N" + | "124S" + | "125" + | "125N" + | "125S" + | "126" + | "126N" + | "126S" + | "127" + | "127N" + | "127S" + | "128" + | "128N" + | "128S" + | "129" + | "129N" + | "129S" + | "130" + | "130N" + | "130S" + | "131" + | "131N" + | "131S" + | "132" + | "132N" + | "132S" + | "133" + | "133N" + | "133S" + | "134" + | "134N" + | "134S" + | "135" + | "135N" + | "135S" + | "136" + | "136N" + | "136S" + | "137" + | "137N" + | "137S" + | "138" + | "138N" + | "138S" + | "139" + | "139N" + | "139S" + | "142" + | "142N" + | "142S" + | "201" + | "201N" + | "201S" + | "204" + | "204N" + | "204S" + | "205" + | "205N" + | "205S" + | "206" + | "206N" + | "206S" + | "207" + | "207N" + | "207S" + | "208" + | "208N" + | "208S" + | "209" + | "209N" + | "209S" + | "210" + | "210N" + | "210S" + | "211" + | "211N" + | "211S" + | "212" + | "212N" + | "212S" + | "213" + | "213N" + | "213S" + | "214" + | "214N" + | "214S" + | "215" + | "215N" + | "215S" + | "216" + | "216N" + | "216S" + | "217" + | "217N" + | "217S" + | "218" + | "218N" + | "218S" + | "219" + | "219N" + | "219S" + | "220" + | "220N" + | "220S" + | "221" + | "221N" + | "221S" + | "222" + | "222N" + | "222S" + | "224" + | "224N" + | "224S" + | "225" + | "225N" + | "225S" + | "226" + | "226N" + | "226S" + | "227" + | "227N" + | "227S" + | "228" + | "228N" + | "228S" + | "229" + | "229N" + | "229S" + | "230" + | "230N" + | "230S" + | "231" + | "231N" + | "231S" + | "232" + | "232N" + | "232S" + | "233" + | "233N" + | "233S" + | "234" + | "234N" + | "234S" + | "235" + | "235N" + | "235S" + | "236" + | "236N" + | "236S" + | "237" + | "237N" + | "237S" + | "238" + | "238N" + | "238S" + | "239" + | "239N" + | "239S" + | "241" + | "241N" + | "241S" + | "242" + | "242N" + | "242S" + | "243" + | "243N" + | "243S" + | "244" + | "244N" + | "244S" + | "245" + | "245N" + | "245S" + | "246" + | "246N" + | "246S" + | "247" + | "247N" + | "247S" + | "248" + | "248N" + | "248S" + | "249" + | "249N" + | "249S" + | "250" + | "250N" + | "250S" + | "251" + | "251N" + | "251S" + | "252" + | "252N" + | "252S" + | "253" + | "253N" + | "253S" + | "254" + | "254N" + | "254S" + | "255" + | "255N" + | "255S" + | "256" + | "256N" + | "256S" + | "257" + | "257N" + | "257S" + | "301" + | "301N" + | "301S" + | "302" + | "302N" + | "302S" + | "401" + | "401N" + | "401S" + | "402" + | "402N" + | "402S" + | "405" + | "405N" + | "405S" + | "406" + | "406N" + | "406S" + | "407" + | "407N" + | "407S" + | "408" + | "408N" + | "408S" + | "409" + | "409N" + | "409S" + | "410" + | "410N" + | "410S" + | "411" + | "411N" + | "411S" + | "412" + | "412N" + | "412S" + | "413" + | "413N" + | "413S" + | "414" + | "414N" + | "414S" + | "415" + | "415N" + | "415S" + | "416" + | "416N" + | "416S" + | "418" + | "418N" + | "418S" + | "419" + | "419N" + | "419S" + | "420" + | "420N" + | "420S" + | "423" + | "423N" + | "423S" + | "501" + | "501N" + | "501S" + | "502" + | "502N" + | "502S" + | "503" + | "503N" + | "503S" + | "504" + | "504N" + | "504S" + | "505" + | "505N" + | "505S" + | "601" + | "601N" + | "601S" + | "602" + | "602N" + | "602S" + | "603" + | "603N" + | "603S" + | "604" + | "604N" + | "604S" + | "606" + | "606N" + | "606S" + | "607" + | "607N" + | "607S" + | "608" + | "608N" + | "608S" + | "609" + | "609N" + | "609S" + | "610" + | "610N" + | "610S" + | "611" + | "611N" + | "611S" + | "612" + | "612N" + | "612S" + | "613" + | "613N" + | "613S" + | "614" + | "614N" + | "614S" + | "615" + | "615N" + | "615S" + | "616" + | "616N" + | "616S" + | "617" + | "617N" + | "617S" + | "618" + | "618N" + | "618S" + | "619" + | "619N" + | "619S" + | "621" + | "621N" + | "621S" + | "622" + | "622N" + | "622S" + | "623" + | "623N" + | "623S" + | "624" + | "624N" + | "624S" + | "625" + | "625N" + | "625S" + | "626" + | "626N" + | "626S" + | "627" + | "627N" + | "627S" + | "628" + | "628N" + | "628S" + | "629" + | "629N" + | "629S" + | "630" + | "630N" + | "630S" + | "631" + | "631N" + | "631S" + | "632" + | "632N" + | "632S" + | "633" + | "633N" + | "633S" + | "634" + | "634N" + | "634S" + | "635" + | "635N" + | "635S" + | "636" + | "636N" + | "636S" + | "637" + | "637N" + | "637S" + | "638" + | "638N" + | "638S" + | "639" + | "639N" + | "639S" + | "640" + | "640N" + | "640S" + | "701" + | "701N" + | "701S" + | "702" + | "702N" + | "702S" + | "705" + | "705N" + | "705S" + | "706" + | "706N" + | "706S" + | "707" + | "707N" + | "707S" + | "708" + | "708N" + | "708S" + | "709" + | "709N" + | "709S" + | "710" + | "710N" + | "710S" + | "711" + | "711N" + | "711S" + | "712" + | "712N" + | "712S" + | "713" + | "713N" + | "713S" + | "714" + | "714N" + | "714S" + | "715" + | "715N" + | "715S" + | "716" + | "716N" + | "716S" + | "718" + | "718N" + | "718S" + | "719" + | "719N" + | "719S" + | "720" + | "720N" + | "720S" + | "721" + | "721N" + | "721S" + | "723" + | "723N" + | "723S" + | "724" + | "724N" + | "724S" + | "725" + | "725N" + | "725S" + | "726" + | "726N" + | "726S" + | "901" + | "901N" + | "901S" + | "902" + | "902N" + | "902S" + | "101014" + | "101015" + | "101017" + | "101018" + | "101066" + | "101069" + | "101074" + | "102209" + | "103772" + | "104075" + | "104630" + | "400001" + | "400003" + | "400007" + | "400008" + | "400018" + | "400019" + | "400021" + | "400023" + | "400024" + | "400026" + | "400027" + | "400028" + | "400029" + | "400030" + | "400031" + | "400032" + | "400033" + | "400034" + | "400036" + | "400037" + | "400038" + | "400039" + | "400041" + | "400042" + | "400043" + | "400044" + | "400045" + | "400046" + | "400047" + | "400048" + | "400051" + | "400053" + | "400054" + | "400055" + | "400056" + | "400057" + | "400059" + | "400060" + | "400061" + | "400062" + | "400065" + | "400066" + | "400067" + | "400070" + | "400080" + | "400081" + | "400085" + | "400086" + | "400087" + | "400088" + | "400089" + | "400091" + | "400092" + | "400093" + | "400094" + | "400095" + | "400096" + | "400097" + | "400098" + | "400099" + | "400102" + | "400103" + | "400105" + | "400107" + | "400108" + | "400109" + | "400110" + | "400111" + | "400115" + | "400116" + | "400117" + | "400118" + | "400119" + | "400120" + | "400121" + | "400122" + | "400123" + | "400124" + | "400125" + | "400126" + | "400127" + | "400128" + | "400129" + | "400131" + | "400133" + | "400135" + | "400153" + | "400154" + | "400155" + | "400157" + | "400162" + | "400166" + | "400168" + | "400170" + | "400176" + | "400190" + | "400191" + | "400224" + | "400225" + | "400226" + | "400227" + | "400228" + | "400230" + | "400231" + | "400233" + | "400234" + | "400235" + | "400236" + | "400237" + | "400238" + | "400239" + | "400240" + | "400241" + | "400242" + | "400248" + | "400249" + | "400250" + | "400251" + | "400252" + | "400258" + | "400259" + | "400263" + | "400264" + | "400265" + | "400266" + | "400267" + | "400268" + | "400271" + | "400272" + | "400274" + | "400275" + | "400276" + | "400277" + | "400278" + | "400279" + | "400280" + | "400281" + | "400282" + | "400283" + | "400284" + | "400285" + | "400287" + | "400288" + | "400289" + | "400290" + | "400292" + | "400316" + | "400322" + | "400323" + | "400324" + | "400325" + | "400327" + | "400329" + | "400330" + | "400331" + | "400333" + | "400334" + | "400335" + | "400336" + | "400337" + | "400352" + | "400353" + | "400354" + | "400358" + | "400359" + | "400360" + | "400362" + | "400363" + | "400364" + | "400390" + | "400394" + | "400395" + | "400396" + | "400397" + | "400398" + | "400399" + | "400400" + | "400401" + | "400403" + | "400404" + | "400405" + | "400406" + | "400408" + | "400409" + | "400418" + | "400419" + | "400422" + | "400423" + | "400426" + | "400448" + | "400449" + | "400452" + | "400453" + | "400454" + | "400457" + | "400461" + | "400462" + | "400467" + | "400468" + | "400469" + | "400470" + | "400471" + | "400472" + | "400473" + | "400474" + | "400475" + | "400476" + | "400477" + | "400479" + | "400482" + | "400483" + | "400484" + | "400485" + | "400486" + | "400512" + | "400514" + | "400515" + | "400516" + | "400518" + | "400519" + | "400561" + | "400595" + | "400596" + | "400597" + | "400598" + | "400599" + | "400602" + | "400609" + | "400610" + | "400611" + | "400612" + | "400613" + | "400614" + | "400615" + | "400616" + | "400617" + | "400618" + | "400619" + | "400620" + | "400621" + | "400622" + | "400623" + | "400624" + | "400626" + | "400627" + | "400628" + | "400629" + | "400630" + | "400631" + | "400632" + | "400633" + | "400634" + | "400635" + | "400636" + | "400639" + | "400640" + | "400641" + | "400642" + | "400643" + | "400644" + | "400645" + | "400646" + | "400647" + | "400648" + | "400649" + | "400655" + | "400656" + | "400657" + | "400658" + | "400659" + | "400661" + | "400662" + | "400663" + | "400676" + | "400677" + | "400678" + | "400716" + | "400719" + | "400722" + | "400723" + | "400724" + | "400725" + | "400731" + | "400732" + | "400744" + | "400745" + | "400747" + | "400750" + | "400751" + | "400752" + | "400755" + | "400756" + | "400759" + | "400760" + | "400761" + | "400762" + | "400764" + | "400768" + | "400769" + | "400771" + | "400772" + | "400796" + | "400798" + | "400799" + | "400808" + | "400809" + | "400810" + | "400811" + | "400812" + | "400814" + | "400815" + | "400816" + | "400834" + | "400835" + | "400836" + | "400837" + | "400838" + | "400840" + | "400841" + | "400843" + | "400846" + | "400847" + | "400848" + | "400849" + | "400851" + | "400852" + | "400853" + | "400856" + | "400858" + | "400860" + | "400861" + | "400890" + | "400903" + | "400910" + | "400913" + | "400916" + | "400917" + | "400919" + | "400929" + | "400933" + | "400936" + | "400938" + | "400940" + | "400941" + | "400943" + | "400948" + | "400950" + | "400988" + | "401014" + | "401015" + | "401016" + | "401021" + | "401022" + | "401023" + | "401024" + | "401025" + | "401026" + | "401027" + | "401029" + | "401030" + | "401031" + | "401032" + | "401033" + | "401034" + | "401035" + | "401036" + | "401037" + | "401038" + | "401039" + | "401044" + | "401045" + | "401047" + | "401051" + | "401052" + | "401055" + | "401056" + | "401069" + | "401070" + | "401074" + | "401078" + | "401079" + | "401084" + | "401085" + | "401086" + | "401087" + | "401088" + | "401090" + | "401091" + | "401092" + | "401093" + | "401094" + | "401096" + | "401099" + | "401100" + | "401101" + | "401139" + | "401140" + | "401141" + | "401142" + | "401147" + | "401149" + | "401150" + | "401168" + | "401169" + | "401182" + | "401183" + | "401191" + | "401192" + | "401193" + | "401194" + | "401195" + | "401202" + | "401206" + | "401208" + | "401209" + | "401210" + | "401220" + | "401223" + | "401224" + | "401225" + | "401226" + | "401227" + | "401229" + | "401231" + | "401232" + | "401239" + | "401248" + | "401250" + | "401252" + | "401253" + | "401254" + | "401255" + | "401256" + | "401257" + | "401258" + | "401259" + | "401261" + | "401262" + | "401263" + | "401264" + | "401265" + | "401267" + | "401268" + | "401269" + | "401270" + | "401271" + | "401272" + | "401274" + | "401275" + | "401276" + | "401277" + | "401279" + | "401281" + | "401282" + | "401286" + | "401287" + | "401288" + | "401294" + | "401301" + | "401302" + | "401305" + | "401306" + | "401307" + | "401308" + | "401310" + | "401311" + | "401312" + | "401313" + | "401314" + | "401315" + | "401317" + | "401318" + | "401324" + | "401326" + | "401327" + | "401328" + | "401329" + | "401330" + | "401331" + | "401333" + | "401334" + | "401335" + | "401336" + | "401337" + | "401338" + | "401339" + | "401341" + | "401342" + | "401343" + | "401344" + | "401345" + | "401348" + | "401359" + | "401360" + | "401361" + | "401363" + | "401364" + | "401366" + | "401371" + | "401372" + | "401373" + | "401374" + | "401375" + | "401377" + | "401379" + | "401380" + | "401381" + | "401386" + | "401387" + | "401388" + | "401393" + | "401398" + | "401400" + | "401401" + | "401402" + | "401404" + | "401407" + | "401408" + | "401409" + | "401410" + | "401411" + | "401412" + | "401413" + | "401414" + | "401416" + | "401417" + | "401435" + | "401436" + | "401438" + | "401440" + | "401441" + | "401442" + | "401443" + | "401444" + | "401446" + | "401447" + | "401448" + | "401450" + | "401453" + | "401458" + | "401459" + | "401462" + | "401463" + | "401464" + | "401465" + | "401466" + | "401467" + | "401469" + | "401470" + | "401489" + | "401490" + | "401491" + | "401492" + | "401493" + | "401495" + | "401496" + | "401497" + | "401500" + | "401501" + | "401502" + | "401503" + | "401506" + | "401507" + | "401528" + | "401529" + | "401531" + | "401532" + | "401533" + | "401535" + | "401536" + | "401538" + | "401543" + | "401544" + | "401545" + | "401547" + | "401548" + | "401549" + | "401552" + | "401553" + | "401554" + | "401555" + | "401556" + | "401557" + | "401558" + | "401561" + | "401562" + | "401563" + | "401564" + | "401565" + | "401566" + | "401567" + | "401568" + | "401569" + | "401570" + | "401575" + | "401577" + | "401587" + | "401589" + | "401595" + | "401596" + | "401599" + | "401600" + | "401608" + | "401609" + | "401610" + | "401624" + | "401625" + | "401626" + | "401630" + | "401633" + | "401657" + | "401659" + | "401664" + | "401665" + | "401666" + | "401669" + | "401670" + | "401675" + | "401679" + | "401681" + | "401685" + | "401686" + | "401687" + | "401688" + | "401689" + | "401690" + | "401694" + | "401696" + | "401697" + | "401698" + | "401699" + | "401701" + | "401702" + | "401703" + | "401704" + | "401706" + | "401707" + | "401708" + | "401709" + | "401710" + | "401712" + | "401715" + | "401716" + | "401718" + | "401721" + | "401722" + | "401725" + | "401726" + | "401727" + | "401729" + | "401730" + | "401731" + | "401732" + | "401738" + | "401739" + | "401740" + | "401741" + | "401742" + | "401746" + | "401747" + | "401748" + | "401754" + | "401755" + | "401756" + | "401760" + | "401761" + | "401762" + | "401763" + | "401764" + | "401765" + | "401768" + | "401769" + | "401771" + | "401772" + | "401774" + | "401775" + | "401778" + | "401779" + | "401780" + | "401781" + | "401782" + | "401784" + | "401785" + | "401786" + | "401787" + | "401791" + | "401793" + | "401797" + | "401802" + | "401806" + | "401808" + | "401809" + | "401811" + | "401812" + | "401813" + | "401814" + | "401818" + | "401819" + | "401821" + | "401822" + | "401824" + | "401826" + | "401827" + | "401832" + | "401833" + | "401840" + | "401842" + | "401847" + | "401848" + | "401850" + | "401851" + | "401852" + | "401853" + | "401857" + | "401858" + | "401867" + | "401869" + | "401870" + | "401874" + | "401875" + | "401876" + | "401877" + | "401878" + | "401880" + | "401881" + | "401882" + | "401883" + | "401884" + | "401887" + | "401889" + | "401890" + | "401893" + | "401897" + | "401898" + | "401899" + | "401900" + | "401901" + | "401903" + | "401905" + | "401906" + | "401908" + | "401910" + | "401916" + | "401917" + | "401919" + | "401920" + | "401921" + | "401922" + | "401924" + | "401925" + | "401926" + | "401927" + | "401929" + | "401930" + | "401933" + | "401934" + | "401935" + | "401936" + | "401937" + | "401939" + | "401941" + | "401942" + | "401943" + | "401946" + | "401947" + | "401948" + | "401950" + | "401951" + | "401954" + | "401955" + | "401957" + | "401958" + | "401960" + | "401961" + | "401964" + | "401965" + | "401968" + | "401969" + | "401970" + | "401971" + | "401973" + | "401977" + | "401988" + | "401989" + | "401990" + | "401993" + | "401994" + | "401999" + | "402000" + | "402001" + | "402003" + | "402004" + | "402005" + | "402006" + | "402016" + | "402017" + | "402018" + | "402022" + | "402023" + | "402024" + | "402027" + | "402028" + | "402029" + | "402032" + | "402033" + | "402034" + | "402036" + | "402037" + | "402038" + | "402039" + | "402042" + | "402043" + | "402048" + | "402052" + | "402054" + | "402055" + | "402056" + | "402057" + | "402067" + | "402068" + | "402071" + | "402082" + | "402085" + | "402088" + | "402090" + | "402091" + | "402092" + | "402093" + | "402094" + | "402095" + | "402096" + | "402097" + | "402100" + | "402102" + | "402103" + | "402104" + | "402105" + | "402106" + | "402107" + | "402108" + | "402109" + | "402110" + | "402111" + | "402112" + | "402113" + | "402118" + | "402119" + | "402124" + | "402125" + | "402126" + | "402127" + | "402128" + | "402130" + | "402134" + | "402142" + | "402143" + | "402144" + | "402145" + | "402152" + | "402153" + | "402154" + | "402155" + | "402157" + | "402160" + | "402161" + | "402162" + | "402163" + | "402164" + | "402165" + | "402166" + | "402167" + | "402169" + | "402171" + | "402172" + | "402173" + | "402174" + | "402175" + | "402183" + | "402185" + | "402186" + | "402188" + | "402189" + | "402191" + | "402194" + | "402195" + | "402205" + | "402211" + | "402214" + | "402215" + | "402216" + | "402217" + | "402218" + | "402221" + | "402222" + | "402223" + | "402224" + | "402228" + | "402229" + | "402233" + | "402269" + | "402290" + | "402292" + | "402293" + | "402294" + | "402295" + | "402296" + | "402298" + | "402299" + | "402300" + | "402301" + | "402303" + | "402328" + | "402330" + | "402331" + | "402334" + | "402335" + | "402336" + | "402338" + | "402339" + | "402345" + | "402346" + | "402347" + | "402348" + | "402349" + | "402351" + | "402355" + | "402446" + | "402458" + | "402460" + | "402461" + | "402498" + | "402502" + | "402503" + | "402504" + | "402505" + | "402506" + | "402507" + | "402508" + | "402509" + | "402510" + | "402517" + | "402518" + | "402519" + | "402520" + | "402521" + | "402522" + | "402525" + | "402526" + | "402535" + | "402634" + | "402638" + | "402639" + | "402641" + | "402642" + | "402643" + | "402644" + | "402645" + | "402646" + | "402647" + | "402653" + | "402656" + | "402657" + | "402658" + | "402659" + | "402660" + | "402661" + | "402662" + | "402666" + | "402670" + | "402673" + | "402674" + | "402677" + | "402678" + | "402679" + | "402680" + | "402681" + | "402682" + | "402687" + | "402688" + | "402689" + | "402691" + | "402692" + | "402694" + | "402696" + | "402697" + | "402704" + | "402705" + | "402707" + | "402723" + | "402740" + | "402741" + | "402744" + | "402745" + | "402748" + | "402749" + | "402753" + | "402755" + | "402762" + | "402764" + | "402766" + | "402767" + | "402769" + | "402772" + | "402773" + | "402774" + | "402805" + | "402809" + | "402811" + | "402816" + | "402819" + | "402826" + | "402829" + | "402831" + | "402835" + | "402838" + | "402839" + | "402843" + | "402845" + | "402851" + | "402853" + | "402854" + | "402856" + | "402857" + | "402858" + | "402861" + | "402862" + | "402863" + | "402864" + | "402865" + | "402867" + | "402868" + | "402869" + | "402870" + | "403036" + | "403037" + | "403038" + | "403047" + | "403076" + | "403103" + | "403104" + | "403105" + | "403106" + | "403107" + | "403109" + | "403110" + | "403111" + | "403112" + | "403114" + | "403115" + | "403116" + | "403117" + | "403118" + | "403119" + | "403122" + | "403125" + | "403126" + | "403132" + | "403139" + | "403142" + | "403144" + | "403145" + | "403147" + | "403148" + | "403149" + | "403150" + | "403151" + | "403152" + | "403153" + | "403154" + | "403155" + | "403158" + | "403159" + | "403162" + | "403163" + | "403164" + | "403165" + | "403166" + | "403167" + | "403168" + | "403169" + | "403171" + | "403192" + | "403216" + | "403238" + | "403239" + | "403240" + | "403241" + | "403242" + | "403245" + | "403247" + | "403248" + | "403249" + | "403251" + | "403252" + | "403253" + | "403257" + | "403264" + | "403266" + | "403267" + | "403271" + | "403276" + | "403292" + | "403297" + | "403303" + | "403304" + | "403305" + | "403306" + | "403307" + | "403311" + | "403312" + | "403313" + | "403316" + | "403317" + | "403318" + | "403319" + | "403320" + | "403323" + | "403326" + | "403338" + | "403342" + | "403343" + | "403350" + | "403359" + | "403362" + | "403367" + | "403369" + | "403372" + | "403373" + | "403374" + | "403375" + | "403376" + | "403377" + | "403380" + | "403383" + | "403392" + | "403397" + | "403399" + | "403415" + | "403416" + | "403417" + | "403418" + | "403419" + | "403421" + | "403422" + | "403424" + | "403425" + | "403427" + | "403432" + | "403433" + | "403434" + | "403436" + | "403439" + | "403440" + | "403443" + | "403444" + | "403447" + | "403456" + | "403457" + | "403458" + | "403459" + | "403461" + | "403462" + | "403465" + | "403466" + | "403472" + | "403475" + | "403480" + | "403483" + | "403486" + | "403487" + | "403488" + | "403489" + | "403491" + | "403492" + | "403494" + | "403503" + | "403504" + | "403505" + | "403506" + | "403510" + | "403512" + | "403513" + | "403518" + | "403522" + | "403523" + | "403525" + | "403526" + | "403528" + | "403530" + | "403537" + | "403545" + | "403547" + | "403552" + | "403555" + | "403556" + | "403557" + | "403560" + | "403562" + | "403563" + | "403573" + | "403590" + | "403601" + | "403604" + | "403606" + | "403608" + | "403610" + | "403611" + | "403612" + | "403617" + | "403620" + | "403621" + | "403626" + | "403632" + | "403639" + | "403647" + | "403670" + | "403671" + | "403672" + | "403673" + | "403674" + | "403676" + | "403677" + | "403711" + | "403726" + | "403731" + | "403732" + | "403733" + | "403736" + | "403749" + | "403757" + | "403760" + | "403763" + | "403765" + | "403766" + | "403769" + | "403772" + | "403776" + | "403777" + | "403779" + | "403781" + | "403782" + | "403786" + | "403787" + | "403791" + | "403797" + | "403802" + | "403805" + | "403808" + | "403821" + | "403822" + | "403826" + | "403829" + | "403830" + | "403832" + | "403837" + | "403846" + | "403847" + | "403851" + | "403853" + | "403854" + | "403858" + | "403870" + | "403871" + | "403876" + | "403878" + | "403886" + | "403887" + | "403893" + | "403894" + | "403895" + | "403896" + | "403897" + | "403902" + | "403903" + | "403906" + | "403907" + | "403910" + | "403913" + | "403914" + | "403942" + | "403953" + | "403954" + | "403955" + | "403956" + | "403975" + | "403976" + | "403978" + | "403979" + | "403980" + | "403981" + | "403982" + | "403984" + | "403986" + | "403987" + | "403989" + | "403992" + | "403993" + | "403994" + | "403995" + | "403996" + | "403997" + | "404008" + | "404010" + | "404011" + | "404012" + | "404013" + | "404014" + | "404015" + | "404017" + | "404018" + | "404019" + | "404024" + | "404029" + | "404030" + | "404031" + | "404032" + | "404035" + | "404037" + | "404039" + | "404040" + | "404043" + | "404049" + | "404052" + | "404054" + | "404056" + | "404058" + | "404066" + | "404075" + | "404076" + | "404077" + | "404079" + | "404080" + | "404081" + | "404085" + | "404087" + | "404092" + | "404099" + | "404100" + | "404101" + | "404104" + | "404105" + | "404106" + | "404108" + | "404116" + | "404120" + | "404122" + | "404124" + | "404125" + | "404129" + | "404130" + | "404131" + | "404132" + | "404133" + | "404134" + | "404135" + | "404136" + | "404137" + | "404138" + | "404142" + | "404147" + | "404148" + | "404153" + | "404155" + | "404160" + | "404161" + | "404168" + | "404171" + | "404180" + | "404190" + | "404191" + | "404194" + | "404211" + | "404219" + | "404224" + | "404225" + | "404232" + | "404244" + | "404245" + | "404251" + | "404253" + | "404254" + | "404255" + | "404258" + | "404259" + | "404260" + | "404262" + | "404264" + | "404266" + | "404271" + | "404274" + | "404278" + | "404279" + | "404280" + | "404283" + | "404284" + | "404286" + | "404287" + | "404289" + | "404290" + | "404308" + | "404309" + | "404320" + | "404321" + | "404325" + | "404327" + | "404333" + | "404334" + | "404335" + | "404336" + | "404337" + | "404338" + | "404339" + | "404341" + | "404350" + | "404351" + | "404352" + | "404353" + | "404354" + | "404355" + | "404356" + | "404357" + | "404362" + | "404681" + | "404821" + | "404822" + | "404823" + | "404824" + | "404825" + | "404826" + | "404833" + | "404834" + | "404837" + | "404838" + | "404843" + | "404844" + | "404846" + | "404847" + | "404850" + | "404853" + | "404854" + | "404855" + | "404856" + | "404857" + | "404858" + | "404859" + | "404860" + | "404863" + | "404864" + | "404865" + | "404870" + | "404871" + | "404876" + | "404881" + | "404895" + | "404905" + | "404909" + | "404911" + | "404915" + | "404916" + | "404918" + | "404920" + | "404921" + | "404922" + | "404926" + | "404927" + | "404936" + | "404947" + | "404948" + | "404949" + | "404950" + | "404963" + | "404964" + | "404972" + | "404973" + | "404976" + | "404977" + | "404978" + | "404979" + | "404980" + | "404983" + | "404986" + | "404987" + | "404988" + | "404990" + | "404991" + | "404992" + | "404994" + | "404995" + | "405003" + | "405006" + | "405014" + | "405015" + | "405016" + | "405024" + | "405026" + | "405053" + | "405054" + | "405056" + | "405057" + | "405061" + | "405062" + | "405063" + | "405065" + | "405066" + | "405067" + | "405068" + | "405069" + | "405070" + | "405071" + | "405072" + | "405073" + | "405075" + | "405076" + | "405077" + | "405078" + | "405079" + | "405083" + | "405084" + | "405086" + | "405087" + | "405091" + | "405092" + | "405093" + | "405098" + | "405100" + | "405102" + | "405103" + | "405111" + | "405112" + | "405118" + | "405120" + | "405124" + | "405125" + | "405133" + | "405135" + | "405138" + | "405140" + | "405150" + | "405151" + | "405152" + | "405154" + | "405155" + | "405157" + | "405159" + | "405165" + | "405167" + | "405169" + | "405172" + | "405179" + | "405181" + | "405182" + | "405185" + | "405186" + | "405193" + | "405227" + | "405230" + | "405231" + | "405234" + | "405237" + | "405241" + | "405247" + | "405248" + | "405249" + | "405265" + | "405266" + | "405269" + | "405279" + | "405284" + | "405285" + | "405286" + | "405289" + | "405290" + | "405291" + | "405292" + | "405293" + | "405294" + | "405295" + | "405297" + | "405298" + | "405299" + | "405308" + | "405311" + | "405312" + | "405313" + | "405315" + | "405316" + | "405318" + | "405319" + | "405320" + | "405321" + | "405322" + | "405323" + | "405325" + | "405328" + | "405329" + | "405331" + | "405333" + | "405336" + | "405339" + | "405340" + | "405341" + | "405342" + | "405343" + | "405346" + | "405348" + | "405349" + | "405350" + | "405352" + | "405353" + | "405358" + | "405359" + | "405361" + | "405368" + | "405370" + | "405372" + | "405373" + | "405374" + | "405375" + | "405376" + | "405380" + | "405382" + | "405383" + | "405386" + | "405387" + | "405390" + | "405393" + | "405394" + | "405396" + | "405406" + | "405409" + | "405412" + | "405414" + | "405415" + | "405416" + | "405417" + | "405419" + | "405420" + | "405421" + | "405422" + | "405424" + | "405426" + | "405444" + | "405447" + | "405450" + | "405451" + | "405452" + | "405455" + | "405456" + | "405457" + | "405458" + | "405459" + | "405460" + | "405464" + | "405466" + | "405467" + | "405468" + | "405470" + | "405471" + | "405472" + | "405473" + | "405474" + | "405477" + | "405480" + | "405485" + | "405488" + | "405489" + | "405490" + | "405491" + | "405492" + | "405493" + | "405494" + | "405495" + | "405496" + | "405499" + | "405505" + | "405506" + | "405508" + | "405514" + | "405516" + | "405517" + | "405519" + | "405521" + | "405523" + | "405525" + | "405527" + | "405530" + | "405531" + | "405537" + | "405540" + | "405541" + | "405542" + | "405543" + | "405548" + | "405549" + | "405555" + | "405558" + | "405561" + | "405562" + | "405564" + | "405565" + | "405575" + | "405576" + | "405577" + | "405579" + | "405580" + | "405583" + | "405585" + | "405586" + | "405587" + | "405588" + | "405592" + | "405593" + | "405609" + | "405612" + | "405620" + | "405622" + | "405627" + | "405631" + | "405635" + | "405641" + | "405643" + | "405645" + | "405648" + | "405650" + | "405652" + | "405653" + | "450045" + | "450102" + | "450104" + | "450123" + | "450180" + | "450228" + | "450331" + | "450367" + | "450422" + | "450424" + | "450492" + | "503357" + | "503848" + | "503853" + | "503855" + | "503870" + | "503876" + | "504007" + | "504023" + | "504417" + | "504423" + | "504517" + | "505254" + | "803002" + | "803003" + | "803024" + | "803034" + | "803054" + | "803056" + | "803057" + | "803058" + | "803059" + | "803066" + | "803067" + | "803081" + | "803082" + | "803094" + | "803108" + | "803115" + | "803120" + | "803131" + | "803151" + | "803153" + | "803154" + | "803166" + | "803194" + | "803195" + | "803215" + | "803243" + | "840115" + | "901342" + | "903002" + | "903003" + | "903004" + | "903007" + | "903025" + | "903027" + | "903030" + | "903042" + | "903046" + | "903049" + | "903063" + | "903074" + | "903075" + | "903079" + | "903082" + | "903088" + | "903092" + | "903093" + | "903105" + | "903280" + | "903286" + | "903290" + | "903302" + | "903325" + | "903340" + | "903341" + | "903352" + | "903355" + | "903358" + | "903360" + | "903363" + | "903365" + | "903370" + | "903371" + | "903372" + | "904242" + | "904246" + | "904918" + | "904920" + | "904987" + | "940010" + | "940040" + | "A02" + | "A02N" + | "A02S" + | "A03" + | "A03N" + | "A03S" + | "A05" + | "A05N" + | "A05S" + | "A06" + | "A06N" + | "A06S" + | "A07" + | "A07N" + | "A07S" + | "A09" + | "A09N" + | "A09S" + | "A10" + | "A10N" + | "A10S" + | "A11" + | "A11N" + | "A11S" + | "A12" + | "A12N" + | "A12S" + | "A14" + | "A14N" + | "A14S" + | "A15" + | "A15N" + | "A15S" + | "A16" + | "A16N" + | "A16S" + | "A17" + | "A17N" + | "A17S" + | "A18" + | "A18N" + | "A18S" + | "A19" + | "A19N" + | "A19S" + | "A20" + | "A20N" + | "A20S" + | "A21" + | "A21N" + | "A21S" + | "A22" + | "A22N" + | "A22S" + | "A24" + | "A24N" + | "A24S" + | "A25" + | "A25N" + | "A25S" + | "A27" + | "A27N" + | "A27S" + | "A28" + | "A28N" + | "A28S" + | "A30" + | "A30N" + | "A30S" + | "A31" + | "A31N" + | "A31S" + | "A32" + | "A32N" + | "A32S" + | "A33" + | "A33N" + | "A33S" + | "A34" + | "A34N" + | "A34S" + | "A36" + | "A36N" + | "A36S" + | "A38" + | "A38N" + | "A38S" + | "A40" + | "A40N" + | "A40S" + | "A41" + | "A41N" + | "A41S" + | "A42" + | "A42N" + | "A42S" + | "A43" + | "A43N" + | "A43S" + | "A44" + | "A44N" + | "A44S" + | "A45" + | "A45N" + | "A45S" + | "A46" + | "A46N" + | "A46S" + | "A47" + | "A47N" + | "A47S" + | "A48" + | "A48N" + | "A48S" + | "A49" + | "A49N" + | "A49S" + | "A50" + | "A50N" + | "A50S" + | "A51" + | "A51N" + | "A51S" + | "A52" + | "A52N" + | "A52S" + | "A53" + | "A53N" + | "A53S" + | "A54" + | "A54N" + | "A54S" + | "A55" + | "A55N" + | "A55S" + | "A57" + | "A57N" + | "A57S" + | "A59" + | "A59N" + | "A59S" + | "A60" + | "A60N" + | "A60S" + | "A61" + | "A61N" + | "A61S" + | "A63" + | "A63N" + | "A63S" + | "A64" + | "A64N" + | "A64S" + | "A65" + | "A65N" + | "A65S" + | "B04" + | "B04N" + | "B04S" + | "B06" + | "B06N" + | "B06S" + | "B08" + | "B08N" + | "B08S" + | "B10" + | "B10N" + | "B10S" + | "B12" + | "B12N" + | "B12S" + | "B13" + | "B13N" + | "B13S" + | "B14" + | "B14N" + | "B14S" + | "B15" + | "B15N" + | "B15S" + | "B16" + | "B16N" + | "B16S" + | "B17" + | "B17N" + | "B17S" + | "B18" + | "B18N" + | "B18S" + | "B19" + | "B19N" + | "B19S" + | "B20" + | "B20N" + | "B20S" + | "B21" + | "B21N" + | "B21S" + | "B22" + | "B22N" + | "B22S" + | "B23" + | "B23N" + | "B23S" + | "D01" + | "D01N" + | "D01S" + | "D03" + | "D03N" + | "D03S" + | "D04" + | "D04N" + | "D04S" + | "D05" + | "D05N" + | "D05S" + | "D06" + | "D06N" + | "D06S" + | "D07" + | "D07N" + | "D07S" + | "D08" + | "D08N" + | "D08S" + | "D09" + | "D09N" + | "D09S" + | "D10" + | "D10N" + | "D10S" + | "D11" + | "D11N" + | "D11S" + | "D12" + | "D12N" + | "D12S" + | "D13" + | "D13N" + | "D13S" + | "D14" + | "D14N" + | "D14S" + | "D15" + | "D15N" + | "D15S" + | "D16" + | "D16N" + | "D16S" + | "D17" + | "D17N" + | "D17S" + | "D18" + | "D18N" + | "D18S" + | "D19" + | "D19N" + | "D19S" + | "D20" + | "D20N" + | "D20S" + | "D21" + | "D21N" + | "D21S" + | "D22" + | "D22N" + | "D22S" + | "D24" + | "D24N" + | "D24S" + | "D25" + | "D25N" + | "D25S" + | "D26" + | "D26N" + | "D26S" + | "D27" + | "D27N" + | "D27S" + | "D28" + | "D28N" + | "D28S" + | "D29" + | "D29N" + | "D29S" + | "D30" + | "D30N" + | "D30S" + | "D31" + | "D31N" + | "D31S" + | "D32" + | "D32N" + | "D32S" + | "D33" + | "D33N" + | "D33S" + | "D34" + | "D34N" + | "D34S" + | "D35" + | "D35N" + | "D35S" + | "D37" + | "D37N" + | "D37S" + | "D38" + | "D38N" + | "D38S" + | "D39" + | "D39N" + | "D39S" + | "D40" + | "D40N" + | "D40S" + | "D41" + | "D41N" + | "D41S" + | "D42" + | "D42N" + | "D42S" + | "D43" + | "D43N" + | "D43S" + | "E01" + | "E01N" + | "E01S" + | "F01" + | "F01N" + | "F01S" + | "F02" + | "F02N" + | "F02S" + | "F03" + | "F03N" + | "F03S" + | "F04" + | "F04N" + | "F04S" + | "F05" + | "F05N" + | "F05S" + | "F06" + | "F06N" + | "F06S" + | "F07" + | "F07N" + | "F07S" + | "F09" + | "F09N" + | "F09S" + | "F11" + | "F11N" + | "F11S" + | "F12" + | "F12N" + | "F12S" + | "F14" + | "F14N" + | "F14S" + | "F15" + | "F15N" + | "F15S" + | "F16" + | "F16N" + | "F16S" + | "F18" + | "F18N" + | "F18S" + | "F20" + | "F20N" + | "F20S" + | "F21" + | "F21N" + | "F21S" + | "F22" + | "F22N" + | "F22S" + | "F23" + | "F23N" + | "F23S" + | "F24" + | "F24N" + | "F24S" + | "F25" + | "F25N" + | "F25S" + | "F26" + | "F26N" + | "F26S" + | "F27" + | "F27N" + | "F27S" + | "F29" + | "F29N" + | "F29S" + | "F30" + | "F30N" + | "F30S" + | "F31" + | "F31N" + | "F31S" + | "F32" + | "F32N" + | "F32S" + | "F33" + | "F33N" + | "F33S" + | "F34" + | "F34N" + | "F34S" + | "F35" + | "F35N" + | "F35S" + | "F36" + | "F36N" + | "F36S" + | "F38" + | "F38N" + | "F38S" + | "F39" + | "F39N" + | "F39S" + | "G05" + | "G05N" + | "G05S" + | "G06" + | "G06N" + | "G06S" + | "G07" + | "G07N" + | "G07S" + | "G08" + | "G08N" + | "G08S" + | "G09" + | "G09N" + | "G09S" + | "G10" + | "G10N" + | "G10S" + | "G11" + | "G11N" + | "G11S" + | "G12" + | "G12N" + | "G12S" + | "G13" + | "G13N" + | "G13S" + | "G14" + | "G14N" + | "G14S" + | "G15" + | "G15N" + | "G15S" + | "G16" + | "G16N" + | "G16S" + | "G18" + | "G18N" + | "G18S" + | "G19" + | "G19N" + | "G19S" + | "G20" + | "G20N" + | "G20S" + | "G21" + | "G21N" + | "G21S" + | "G22" + | "G22N" + | "G22S" + | "G24" + | "G24N" + | "G24S" + | "G26" + | "G26N" + | "G26S" + | "G28" + | "G28N" + | "G28S" + | "G29" + | "G29N" + | "G29S" + | "G30" + | "G30N" + | "G30S" + | "G31" + | "G31N" + | "G31S" + | "G32" + | "G32N" + | "G32S" + | "G33" + | "G33N" + | "G33S" + | "G34" + | "G34N" + | "G34S" + | "G35" + | "G35N" + | "G35S" + | "G36" + | "G36N" + | "G36S" + | "H01" + | "H01N" + | "H01S" + | "H02" + | "H02N" + | "H02S" + | "H03" + | "H03N" + | "H03S" + | "H04" + | "H04N" + | "H04S" + | "H06" + | "H06N" + | "H06S" + | "H07" + | "H07N" + | "H07S" + | "H08" + | "H08N" + | "H08S" + | "H09" + | "H09N" + | "H09S" + | "H10" + | "H10N" + | "H10S" + | "H11" + | "H11N" + | "H11S" + | "H12" + | "H12N" + | "H12S" + | "H13" + | "H13N" + | "H13S" + | "H14" + | "H14N" + | "H14S" + | "H15" + | "H15N" + | "H15S" + | "J12" + | "J12N" + | "J12S" + | "J13" + | "J13N" + | "J13S" + | "J14" + | "J14N" + | "J14S" + | "J15" + | "J15N" + | "J15S" + | "J16" + | "J16N" + | "J16S" + | "J17" + | "J17N" + | "J17S" + | "J19" + | "J19N" + | "J19S" + | "J20" + | "J20N" + | "J20S" + | "J21" + | "J21N" + | "J21S" + | "J22" + | "J22N" + | "J22S" + | "J23" + | "J23N" + | "J23S" + | "J24" + | "J24N" + | "J24S" + | "J27" + | "J27N" + | "J27S" + | "J28" + | "J28N" + | "J28S" + | "J29" + | "J29N" + | "J29S" + | "J30" + | "J30N" + | "J30S" + | "J31" + | "J31N" + | "J31S" + | "L01" + | "L01N" + | "L01S" + | "L02" + | "L02N" + | "L02S" + | "L03" + | "L03N" + | "L03S" + | "L05" + | "L05N" + | "L05S" + | "L06" + | "L06N" + | "L06S" + | "L08" + | "L08N" + | "L08S" + | "L10" + | "L10N" + | "L10S" + | "L11" + | "L11N" + | "L11S" + | "L12" + | "L12N" + | "L12S" + | "L13" + | "L13N" + | "L13S" + | "L14" + | "L14N" + | "L14S" + | "L15" + | "L15N" + | "L15S" + | "L16" + | "L16N" + | "L16S" + | "L17" + | "L17N" + | "L17S" + | "L19" + | "L19N" + | "L19S" + | "L20" + | "L20N" + | "L20S" + | "L21" + | "L21N" + | "L21S" + | "L22" + | "L22N" + | "L22S" + | "L24" + | "L24N" + | "L24S" + | "L25" + | "L25N" + | "L25S" + | "L26" + | "L26N" + | "L26S" + | "L27" + | "L27N" + | "L27S" + | "L28" + | "L28N" + | "L28S" + | "L29" + | "L29N" + | "L29S" + | "M01" + | "M01N" + | "M01S" + | "M04" + | "M04N" + | "M04S" + | "M05" + | "M05N" + | "M05S" + | "M06" + | "M06N" + | "M06S" + | "M08" + | "M08N" + | "M08S" + | "M09" + | "M09N" + | "M09S" + | "M10" + | "M10N" + | "M10S" + | "M11" + | "M11N" + | "M11S" + | "M12" + | "M12N" + | "M12S" + | "M13" + | "M13N" + | "M13S" + | "M14" + | "M14N" + | "M14S" + | "M16" + | "M16N" + | "M16S" + | "M18" + | "M18N" + | "M18S" + | "M19" + | "M19N" + | "M19S" + | "M20" + | "M20N" + | "M20S" + | "M21" + | "M21N" + | "M21S" + | "M22" + | "M22N" + | "M22S" + | "M23" + | "M23N" + | "M23S" + | "N02" + | "N02N" + | "N02S" + | "N03" + | "N03N" + | "N03S" + | "N04" + | "N04N" + | "N04S" + | "N05" + | "N05N" + | "N05S" + | "N06" + | "N06N" + | "N06S" + | "N07" + | "N07N" + | "N07S" + | "N08" + | "N08N" + | "N08S" + | "N09" + | "N09N" + | "N09S" + | "N10" + | "N10N" + | "N10S" + | "Q01" + | "Q01N" + | "Q01S" + | "Q03" + | "Q03N" + | "Q03S" + | "Q04" + | "Q04N" + | "Q04S" + | "Q05" + | "Q05N" + | "Q05S" + | "R01" + | "R01N" + | "R01S" + | "R03" + | "R03N" + | "R03S" + | "R04" + | "R04N" + | "R04S" + | "R05" + | "R05N" + | "R05S" + | "R06" + | "R06N" + | "R06S" + | "R08" + | "R08N" + | "R08S" + | "R09" + | "R09N" + | "R09S" + | "R11" + | "R11N" + | "R11S" + | "R13" + | "R13N" + | "R13S" + | "R14" + | "R14N" + | "R14S" + | "R15" + | "R15N" + | "R15S" + | "R16" + | "R16N" + | "R16S" + | "R17" + | "R17N" + | "R17S" + | "R18" + | "R18N" + | "R18S" + | "R19" + | "R19N" + | "R19S" + | "R20" + | "R20N" + | "R20S" + | "R21" + | "R21N" + | "R21S" + | "R22" + | "R22N" + | "R22S" + | "R23" + | "R23N" + | "R23S" + | "R24" + | "R24N" + | "R24S" + | "R25" + | "R25N" + | "R25S" + | "R26" + | "R26N" + | "R26S" + | "R27" + | "R27N" + | "R27S" + | "R28" + | "R28N" + | "R28S" + | "R29" + | "R29N" + | "R29S" + | "R30" + | "R30N" + | "R30S" + | "R31" + | "R31N" + | "R31S" + | "R32" + | "R32N" + | "R32S" + | "R33" + | "R33N" + | "R33S" + | "R34" + | "R34N" + | "R34S" + | "R35" + | "R35N" + | "R35S" + | "R36" + | "R36N" + | "R36S" + | "R39" + | "R39N" + | "R39S" + | "R40" + | "R40N" + | "R40S" + | "R41" + | "R41N" + | "R41S" + | "R42" + | "R42N" + | "R42S" + | "R43" + | "R43N" + | "R43S" + | "R44" + | "R44N" + | "R44S" + | "R45" + | "R45N" + | "R45S" + | "S01" + | "S01N" + | "S01S" + | "S03" + | "S03N" + | "S03S" + | "S04" + | "S04N" + | "S04S" + | "S09" + | "S09N" + | "S09S" + | "S11" + | "S11N" + | "S11S" + | "S13" + | "S13N" + | "S13S" + | "S14" + | "S14N" + | "S14S" + | "S15" + | "S15N" + | "S15S" + | "S16" + | "S16N" + | "S16S" + | "S17" + | "S17N" + | "S17S" + | "S18" + | "S18N" + | "S18S" + | "S19" + | "S19N" + | "S19S" + | "S20" + | "S20N" + | "S20S" + | "S21" + | "S21N" + | "S21S" + | "S22" + | "S22N" + | "S22S" + | "S23" + | "S23N" + | "S23S" + | "S24" + | "S24N" + | "S24S" + | "S25" + | "S25N" + | "S25S" + | "S26" + | "S26N" + | "S26S" + | "S27" + | "S27N" + | "S27S" + | "S28" + | "S28N" + | "S28S" + | "S29" + | "S29N" + | "S29S" + | "S30" + | "S30N" + | "S30S" + | "S31" + | "S31N" + | "S31S" + +export type KnownSubwayStopId = + "101" + | "101N" + | "101S" + | "103" + | "103N" + | "103S" + | "104" + | "104N" + | "104S" + | "106" + | "106N" + | "106S" + | "107" + | "107N" + | "107S" + | "108" + | "108N" + | "108S" + | "109" + | "109N" + | "109S" + | "110" + | "110N" + | "110S" + | "111" + | "111N" + | "111S" + | "112" + | "112N" + | "112S" + | "113" + | "113N" + | "113S" + | "114" + | "114N" + | "114S" + | "115" + | "115N" + | "115S" + | "116" + | "116N" + | "116S" + | "117" + | "117N" + | "117S" + | "118" + | "118N" + | "118S" + | "119" + | "119N" + | "119S" + | "120" + | "120N" + | "120S" + | "121" + | "121N" + | "121S" + | "122" + | "122N" + | "122S" + | "123" + | "123N" + | "123S" + | "124" + | "124N" + | "124S" + | "125" + | "125N" + | "125S" + | "126" + | "126N" + | "126S" + | "127" + | "127N" + | "127S" + | "128" + | "128N" + | "128S" + | "129" + | "129N" + | "129S" + | "130" + | "130N" + | "130S" + | "131" + | "131N" + | "131S" + | "132" + | "132N" + | "132S" + | "133" + | "133N" + | "133S" + | "134" + | "134N" + | "134S" + | "135" + | "135N" + | "135S" + | "136" + | "136N" + | "136S" + | "137" + | "137N" + | "137S" + | "138" + | "138N" + | "138S" + | "139" + | "139N" + | "139S" + | "142" + | "142N" + | "142S" + | "201" + | "201N" + | "201S" + | "204" + | "204N" + | "204S" + | "205" + | "205N" + | "205S" + | "206" + | "206N" + | "206S" + | "207" + | "207N" + | "207S" + | "208" + | "208N" + | "208S" + | "209" + | "209N" + | "209S" + | "210" + | "210N" + | "210S" + | "211" + | "211N" + | "211S" + | "212" + | "212N" + | "212S" + | "213" + | "213N" + | "213S" + | "214" + | "214N" + | "214S" + | "215" + | "215N" + | "215S" + | "216" + | "216N" + | "216S" + | "217" + | "217N" + | "217S" + | "218" + | "218N" + | "218S" + | "219" + | "219N" + | "219S" + | "220" + | "220N" + | "220S" + | "221" + | "221N" + | "221S" + | "222" + | "222N" + | "222S" + | "224" + | "224N" + | "224S" + | "225" + | "225N" + | "225S" + | "226" + | "226N" + | "226S" + | "227" + | "227N" + | "227S" + | "228" + | "228N" + | "228S" + | "229" + | "229N" + | "229S" + | "230" + | "230N" + | "230S" + | "231" + | "231N" + | "231S" + | "232" + | "232N" + | "232S" + | "233" + | "233N" + | "233S" + | "234" + | "234N" + | "234S" + | "235" + | "235N" + | "235S" + | "236" + | "236N" + | "236S" + | "237" + | "237N" + | "237S" + | "238" + | "238N" + | "238S" + | "239" + | "239N" + | "239S" + | "241" + | "241N" + | "241S" + | "242" + | "242N" + | "242S" + | "243" + | "243N" + | "243S" + | "244" + | "244N" + | "244S" + | "245" + | "245N" + | "245S" + | "246" + | "246N" + | "246S" + | "247" + | "247N" + | "247S" + | "248" + | "248N" + | "248S" + | "249" + | "249N" + | "249S" + | "250" + | "250N" + | "250S" + | "251" + | "251N" + | "251S" + | "252" + | "252N" + | "252S" + | "253" + | "253N" + | "253S" + | "254" + | "254N" + | "254S" + | "255" + | "255N" + | "255S" + | "256" + | "256N" + | "256S" + | "257" + | "257N" + | "257S" + | "301" + | "301N" + | "301S" + | "302" + | "302N" + | "302S" + | "401" + | "401N" + | "401S" + | "402" + | "402N" + | "402S" + | "405" + | "405N" + | "405S" + | "406" + | "406N" + | "406S" + | "407" + | "407N" + | "407S" + | "408" + | "408N" + | "408S" + | "409" + | "409N" + | "409S" + | "410" + | "410N" + | "410S" + | "411" + | "411N" + | "411S" + | "412" + | "412N" + | "412S" + | "413" + | "413N" + | "413S" + | "414" + | "414N" + | "414S" + | "415" + | "415N" + | "415S" + | "416" + | "416N" + | "416S" + | "418" + | "418N" + | "418S" + | "419" + | "419N" + | "419S" + | "420" + | "420N" + | "420S" + | "423" + | "423N" + | "423S" + | "501" + | "501N" + | "501S" + | "502" + | "502N" + | "502S" + | "503" + | "503N" + | "503S" + | "504" + | "504N" + | "504S" + | "505" + | "505N" + | "505S" + | "601" + | "601N" + | "601S" + | "602" + | "602N" + | "602S" + | "603" + | "603N" + | "603S" + | "604" + | "604N" + | "604S" + | "606" + | "606N" + | "606S" + | "607" + | "607N" + | "607S" + | "608" + | "608N" + | "608S" + | "609" + | "609N" + | "609S" + | "610" + | "610N" + | "610S" + | "611" + | "611N" + | "611S" + | "612" + | "612N" + | "612S" + | "613" + | "613N" + | "613S" + | "614" + | "614N" + | "614S" + | "615" + | "615N" + | "615S" + | "616" + | "616N" + | "616S" + | "617" + | "617N" + | "617S" + | "618" + | "618N" + | "618S" + | "619" + | "619N" + | "619S" + | "621" + | "621N" + | "621S" + | "622" + | "622N" + | "622S" + | "623" + | "623N" + | "623S" + | "624" + | "624N" + | "624S" + | "625" + | "625N" + | "625S" + | "626" + | "626N" + | "626S" + | "627" + | "627N" + | "627S" + | "628" + | "628N" + | "628S" + | "629" + | "629N" + | "629S" + | "630" + | "630N" + | "630S" + | "631" + | "631N" + | "631S" + | "632" + | "632N" + | "632S" + | "633" + | "633N" + | "633S" + | "634" + | "634N" + | "634S" + | "635" + | "635N" + | "635S" + | "636" + | "636N" + | "636S" + | "637" + | "637N" + | "637S" + | "638" + | "638N" + | "638S" + | "639" + | "639N" + | "639S" + | "640" + | "640N" + | "640S" + | "701" + | "701N" + | "701S" + | "702" + | "702N" + | "702S" + | "705" + | "705N" + | "705S" + | "706" + | "706N" + | "706S" + | "707" + | "707N" + | "707S" + | "708" + | "708N" + | "708S" + | "709" + | "709N" + | "709S" + | "710" + | "710N" + | "710S" + | "711" + | "711N" + | "711S" + | "712" + | "712N" + | "712S" + | "713" + | "713N" + | "713S" + | "714" + | "714N" + | "714S" + | "715" + | "715N" + | "715S" + | "716" + | "716N" + | "716S" + | "718" + | "718N" + | "718S" + | "719" + | "719N" + | "719S" + | "720" + | "720N" + | "720S" + | "721" + | "721N" + | "721S" + | "723" + | "723N" + | "723S" + | "724" + | "724N" + | "724S" + | "725" + | "725N" + | "725S" + | "726" + | "726N" + | "726S" + | "901" + | "901N" + | "901S" + | "902" + | "902N" + | "902S" + | "A02" + | "A02N" + | "A02S" + | "A03" + | "A03N" + | "A03S" + | "A05" + | "A05N" + | "A05S" + | "A06" + | "A06N" + | "A06S" + | "A07" + | "A07N" + | "A07S" + | "A09" + | "A09N" + | "A09S" + | "A10" + | "A10N" + | "A10S" + | "A11" + | "A11N" + | "A11S" + | "A12" + | "A12N" + | "A12S" + | "A14" + | "A14N" + | "A14S" + | "A15" + | "A15N" + | "A15S" + | "A16" + | "A16N" + | "A16S" + | "A17" + | "A17N" + | "A17S" + | "A18" + | "A18N" + | "A18S" + | "A19" + | "A19N" + | "A19S" + | "A20" + | "A20N" + | "A20S" + | "A21" + | "A21N" + | "A21S" + | "A22" + | "A22N" + | "A22S" + | "A24" + | "A24N" + | "A24S" + | "A25" + | "A25N" + | "A25S" + | "A27" + | "A27N" + | "A27S" + | "A28" + | "A28N" + | "A28S" + | "A30" + | "A30N" + | "A30S" + | "A31" + | "A31N" + | "A31S" + | "A32" + | "A32N" + | "A32S" + | "A33" + | "A33N" + | "A33S" + | "A34" + | "A34N" + | "A34S" + | "A36" + | "A36N" + | "A36S" + | "A38" + | "A38N" + | "A38S" + | "A40" + | "A40N" + | "A40S" + | "A41" + | "A41N" + | "A41S" + | "A42" + | "A42N" + | "A42S" + | "A43" + | "A43N" + | "A43S" + | "A44" + | "A44N" + | "A44S" + | "A45" + | "A45N" + | "A45S" + | "A46" + | "A46N" + | "A46S" + | "A47" + | "A47N" + | "A47S" + | "A48" + | "A48N" + | "A48S" + | "A49" + | "A49N" + | "A49S" + | "A50" + | "A50N" + | "A50S" + | "A51" + | "A51N" + | "A51S" + | "A52" + | "A52N" + | "A52S" + | "A53" + | "A53N" + | "A53S" + | "A54" + | "A54N" + | "A54S" + | "A55" + | "A55N" + | "A55S" + | "A57" + | "A57N" + | "A57S" + | "A59" + | "A59N" + | "A59S" + | "A60" + | "A60N" + | "A60S" + | "A61" + | "A61N" + | "A61S" + | "A63" + | "A63N" + | "A63S" + | "A64" + | "A64N" + | "A64S" + | "A65" + | "A65N" + | "A65S" + | "B04" + | "B04N" + | "B04S" + | "B06" + | "B06N" + | "B06S" + | "B08" + | "B08N" + | "B08S" + | "B10" + | "B10N" + | "B10S" + | "B12" + | "B12N" + | "B12S" + | "B13" + | "B13N" + | "B13S" + | "B14" + | "B14N" + | "B14S" + | "B15" + | "B15N" + | "B15S" + | "B16" + | "B16N" + | "B16S" + | "B17" + | "B17N" + | "B17S" + | "B18" + | "B18N" + | "B18S" + | "B19" + | "B19N" + | "B19S" + | "B20" + | "B20N" + | "B20S" + | "B21" + | "B21N" + | "B21S" + | "B22" + | "B22N" + | "B22S" + | "B23" + | "B23N" + | "B23S" + | "D01" + | "D01N" + | "D01S" + | "D03" + | "D03N" + | "D03S" + | "D04" + | "D04N" + | "D04S" + | "D05" + | "D05N" + | "D05S" + | "D06" + | "D06N" + | "D06S" + | "D07" + | "D07N" + | "D07S" + | "D08" + | "D08N" + | "D08S" + | "D09" + | "D09N" + | "D09S" + | "D10" + | "D10N" + | "D10S" + | "D11" + | "D11N" + | "D11S" + | "D12" + | "D12N" + | "D12S" + | "D13" + | "D13N" + | "D13S" + | "D14" + | "D14N" + | "D14S" + | "D15" + | "D15N" + | "D15S" + | "D16" + | "D16N" + | "D16S" + | "D17" + | "D17N" + | "D17S" + | "D18" + | "D18N" + | "D18S" + | "D19" + | "D19N" + | "D19S" + | "D20" + | "D20N" + | "D20S" + | "D21" + | "D21N" + | "D21S" + | "D22" + | "D22N" + | "D22S" + | "D24" + | "D24N" + | "D24S" + | "D25" + | "D25N" + | "D25S" + | "D26" + | "D26N" + | "D26S" + | "D27" + | "D27N" + | "D27S" + | "D28" + | "D28N" + | "D28S" + | "D29" + | "D29N" + | "D29S" + | "D30" + | "D30N" + | "D30S" + | "D31" + | "D31N" + | "D31S" + | "D32" + | "D32N" + | "D32S" + | "D33" + | "D33N" + | "D33S" + | "D34" + | "D34N" + | "D34S" + | "D35" + | "D35N" + | "D35S" + | "D37" + | "D37N" + | "D37S" + | "D38" + | "D38N" + | "D38S" + | "D39" + | "D39N" + | "D39S" + | "D40" + | "D40N" + | "D40S" + | "D41" + | "D41N" + | "D41S" + | "D42" + | "D42N" + | "D42S" + | "D43" + | "D43N" + | "D43S" + | "E01" + | "E01N" + | "E01S" + | "F01" + | "F01N" + | "F01S" + | "F02" + | "F02N" + | "F02S" + | "F03" + | "F03N" + | "F03S" + | "F04" + | "F04N" + | "F04S" + | "F05" + | "F05N" + | "F05S" + | "F06" + | "F06N" + | "F06S" + | "F07" + | "F07N" + | "F07S" + | "F09" + | "F09N" + | "F09S" + | "F11" + | "F11N" + | "F11S" + | "F12" + | "F12N" + | "F12S" + | "F14" + | "F14N" + | "F14S" + | "F15" + | "F15N" + | "F15S" + | "F16" + | "F16N" + | "F16S" + | "F18" + | "F18N" + | "F18S" + | "F20" + | "F20N" + | "F20S" + | "F21" + | "F21N" + | "F21S" + | "F22" + | "F22N" + | "F22S" + | "F23" + | "F23N" + | "F23S" + | "F24" + | "F24N" + | "F24S" + | "F25" + | "F25N" + | "F25S" + | "F26" + | "F26N" + | "F26S" + | "F27" + | "F27N" + | "F27S" + | "F29" + | "F29N" + | "F29S" + | "F30" + | "F30N" + | "F30S" + | "F31" + | "F31N" + | "F31S" + | "F32" + | "F32N" + | "F32S" + | "F33" + | "F33N" + | "F33S" + | "F34" + | "F34N" + | "F34S" + | "F35" + | "F35N" + | "F35S" + | "F36" + | "F36N" + | "F36S" + | "F38" + | "F38N" + | "F38S" + | "F39" + | "F39N" + | "F39S" + | "G05" + | "G05N" + | "G05S" + | "G06" + | "G06N" + | "G06S" + | "G07" + | "G07N" + | "G07S" + | "G08" + | "G08N" + | "G08S" + | "G09" + | "G09N" + | "G09S" + | "G10" + | "G10N" + | "G10S" + | "G11" + | "G11N" + | "G11S" + | "G12" + | "G12N" + | "G12S" + | "G13" + | "G13N" + | "G13S" + | "G14" + | "G14N" + | "G14S" + | "G15" + | "G15N" + | "G15S" + | "G16" + | "G16N" + | "G16S" + | "G18" + | "G18N" + | "G18S" + | "G19" + | "G19N" + | "G19S" + | "G20" + | "G20N" + | "G20S" + | "G21" + | "G21N" + | "G21S" + | "G22" + | "G22N" + | "G22S" + | "G24" + | "G24N" + | "G24S" + | "G26" + | "G26N" + | "G26S" + | "G28" + | "G28N" + | "G28S" + | "G29" + | "G29N" + | "G29S" + | "G30" + | "G30N" + | "G30S" + | "G31" + | "G31N" + | "G31S" + | "G32" + | "G32N" + | "G32S" + | "G33" + | "G33N" + | "G33S" + | "G34" + | "G34N" + | "G34S" + | "G35" + | "G35N" + | "G35S" + | "G36" + | "G36N" + | "G36S" + | "H01" + | "H01N" + | "H01S" + | "H02" + | "H02N" + | "H02S" + | "H03" + | "H03N" + | "H03S" + | "H04" + | "H04N" + | "H04S" + | "H06" + | "H06N" + | "H06S" + | "H07" + | "H07N" + | "H07S" + | "H08" + | "H08N" + | "H08S" + | "H09" + | "H09N" + | "H09S" + | "H10" + | "H10N" + | "H10S" + | "H11" + | "H11N" + | "H11S" + | "H12" + | "H12N" + | "H12S" + | "H13" + | "H13N" + | "H13S" + | "H14" + | "H14N" + | "H14S" + | "H15" + | "H15N" + | "H15S" + | "J12" + | "J12N" + | "J12S" + | "J13" + | "J13N" + | "J13S" + | "J14" + | "J14N" + | "J14S" + | "J15" + | "J15N" + | "J15S" + | "J16" + | "J16N" + | "J16S" + | "J17" + | "J17N" + | "J17S" + | "J19" + | "J19N" + | "J19S" + | "J20" + | "J20N" + | "J20S" + | "J21" + | "J21N" + | "J21S" + | "J22" + | "J22N" + | "J22S" + | "J23" + | "J23N" + | "J23S" + | "J24" + | "J24N" + | "J24S" + | "J27" + | "J27N" + | "J27S" + | "J28" + | "J28N" + | "J28S" + | "J29" + | "J29N" + | "J29S" + | "J30" + | "J30N" + | "J30S" + | "J31" + | "J31N" + | "J31S" + | "L01" + | "L01N" + | "L01S" + | "L02" + | "L02N" + | "L02S" + | "L03" + | "L03N" + | "L03S" + | "L05" + | "L05N" + | "L05S" + | "L06" + | "L06N" + | "L06S" + | "L08" + | "L08N" + | "L08S" + | "L10" + | "L10N" + | "L10S" + | "L11" + | "L11N" + | "L11S" + | "L12" + | "L12N" + | "L12S" + | "L13" + | "L13N" + | "L13S" + | "L14" + | "L14N" + | "L14S" + | "L15" + | "L15N" + | "L15S" + | "L16" + | "L16N" + | "L16S" + | "L17" + | "L17N" + | "L17S" + | "L19" + | "L19N" + | "L19S" + | "L20" + | "L20N" + | "L20S" + | "L21" + | "L21N" + | "L21S" + | "L22" + | "L22N" + | "L22S" + | "L24" + | "L24N" + | "L24S" + | "L25" + | "L25N" + | "L25S" + | "L26" + | "L26N" + | "L26S" + | "L27" + | "L27N" + | "L27S" + | "L28" + | "L28N" + | "L28S" + | "L29" + | "L29N" + | "L29S" + | "M01" + | "M01N" + | "M01S" + | "M04" + | "M04N" + | "M04S" + | "M05" + | "M05N" + | "M05S" + | "M06" + | "M06N" + | "M06S" + | "M08" + | "M08N" + | "M08S" + | "M09" + | "M09N" + | "M09S" + | "M10" + | "M10N" + | "M10S" + | "M11" + | "M11N" + | "M11S" + | "M12" + | "M12N" + | "M12S" + | "M13" + | "M13N" + | "M13S" + | "M14" + | "M14N" + | "M14S" + | "M16" + | "M16N" + | "M16S" + | "M18" + | "M18N" + | "M18S" + | "M19" + | "M19N" + | "M19S" + | "M20" + | "M20N" + | "M20S" + | "M21" + | "M21N" + | "M21S" + | "M22" + | "M22N" + | "M22S" + | "M23" + | "M23N" + | "M23S" + | "N02" + | "N02N" + | "N02S" + | "N03" + | "N03N" + | "N03S" + | "N04" + | "N04N" + | "N04S" + | "N05" + | "N05N" + | "N05S" + | "N06" + | "N06N" + | "N06S" + | "N07" + | "N07N" + | "N07S" + | "N08" + | "N08N" + | "N08S" + | "N09" + | "N09N" + | "N09S" + | "N10" + | "N10N" + | "N10S" + | "Q01" + | "Q01N" + | "Q01S" + | "Q03" + | "Q03N" + | "Q03S" + | "Q04" + | "Q04N" + | "Q04S" + | "Q05" + | "Q05N" + | "Q05S" + | "R01" + | "R01N" + | "R01S" + | "R03" + | "R03N" + | "R03S" + | "R04" + | "R04N" + | "R04S" + | "R05" + | "R05N" + | "R05S" + | "R06" + | "R06N" + | "R06S" + | "R08" + | "R08N" + | "R08S" + | "R09" + | "R09N" + | "R09S" + | "R11" + | "R11N" + | "R11S" + | "R13" + | "R13N" + | "R13S" + | "R14" + | "R14N" + | "R14S" + | "R15" + | "R15N" + | "R15S" + | "R16" + | "R16N" + | "R16S" + | "R17" + | "R17N" + | "R17S" + | "R18" + | "R18N" + | "R18S" + | "R19" + | "R19N" + | "R19S" + | "R20" + | "R20N" + | "R20S" + | "R21" + | "R21N" + | "R21S" + | "R22" + | "R22N" + | "R22S" + | "R23" + | "R23N" + | "R23S" + | "R24" + | "R24N" + | "R24S" + | "R25" + | "R25N" + | "R25S" + | "R26" + | "R26N" + | "R26S" + | "R27" + | "R27N" + | "R27S" + | "R28" + | "R28N" + | "R28S" + | "R29" + | "R29N" + | "R29S" + | "R30" + | "R30N" + | "R30S" + | "R31" + | "R31N" + | "R31S" + | "R32" + | "R32N" + | "R32S" + | "R33" + | "R33N" + | "R33S" + | "R34" + | "R34N" + | "R34S" + | "R35" + | "R35N" + | "R35S" + | "R36" + | "R36N" + | "R36S" + | "R39" + | "R39N" + | "R39S" + | "R40" + | "R40N" + | "R40S" + | "R41" + | "R41N" + | "R41S" + | "R42" + | "R42N" + | "R42S" + | "R43" + | "R43N" + | "R43S" + | "R44" + | "R44N" + | "R44S" + | "R45" + | "R45N" + | "R45S" + | "S01" + | "S01N" + | "S01S" + | "S03" + | "S03N" + | "S03S" + | "S04" + | "S04N" + | "S04S" + | "S09" + | "S09N" + | "S09S" + | "S11" + | "S11N" + | "S11S" + | "S13" + | "S13N" + | "S13S" + | "S14" + | "S14N" + | "S14S" + | "S15" + | "S15N" + | "S15S" + | "S16" + | "S16N" + | "S16S" + | "S17" + | "S17N" + | "S17S" + | "S18" + | "S18N" + | "S18S" + | "S19" + | "S19N" + | "S19S" + | "S20" + | "S20N" + | "S20S" + | "S21" + | "S21N" + | "S21S" + | "S22" + | "S22N" + | "S22S" + | "S23" + | "S23N" + | "S23S" + | "S24" + | "S24N" + | "S24S" + | "S25" + | "S25N" + | "S25S" + | "S26" + | "S26N" + | "S26S" + | "S27" + | "S27N" + | "S27S" + | "S28" + | "S28N" + | "S28S" + | "S29" + | "S29N" + | "S29S" + | "S30" + | "S30N" + | "S30S" + | "S31" + | "S31N" + | "S31S" + +export type KnownBusStopId = + "101014" + | "101015" + | "101017" + | "101018" + | "101066" + | "101069" + | "101074" + | "102209" + | "103772" + | "104075" + | "104630" + | "400001" + | "400003" + | "400007" + | "400008" + | "400018" + | "400019" + | "400021" + | "400023" + | "400024" + | "400026" + | "400027" + | "400028" + | "400029" + | "400030" + | "400031" + | "400032" + | "400033" + | "400034" + | "400036" + | "400037" + | "400038" + | "400039" + | "400041" + | "400042" + | "400043" + | "400044" + | "400045" + | "400046" + | "400047" + | "400048" + | "400051" + | "400053" + | "400054" + | "400055" + | "400056" + | "400057" + | "400059" + | "400060" + | "400061" + | "400062" + | "400065" + | "400066" + | "400067" + | "400070" + | "400080" + | "400081" + | "400085" + | "400086" + | "400087" + | "400088" + | "400089" + | "400091" + | "400092" + | "400093" + | "400094" + | "400095" + | "400096" + | "400097" + | "400098" + | "400099" + | "400102" + | "400103" + | "400105" + | "400107" + | "400108" + | "400109" + | "400110" + | "400111" + | "400115" + | "400116" + | "400117" + | "400118" + | "400119" + | "400120" + | "400121" + | "400122" + | "400123" + | "400124" + | "400125" + | "400126" + | "400127" + | "400128" + | "400129" + | "400131" + | "400133" + | "400135" + | "400153" + | "400154" + | "400155" + | "400157" + | "400162" + | "400166" + | "400168" + | "400170" + | "400176" + | "400190" + | "400191" + | "400224" + | "400225" + | "400226" + | "400227" + | "400228" + | "400230" + | "400231" + | "400233" + | "400234" + | "400235" + | "400236" + | "400237" + | "400238" + | "400239" + | "400240" + | "400241" + | "400242" + | "400248" + | "400249" + | "400250" + | "400251" + | "400252" + | "400258" + | "400259" + | "400263" + | "400264" + | "400265" + | "400266" + | "400267" + | "400268" + | "400271" + | "400272" + | "400274" + | "400275" + | "400276" + | "400277" + | "400278" + | "400279" + | "400280" + | "400281" + | "400282" + | "400283" + | "400284" + | "400285" + | "400287" + | "400288" + | "400289" + | "400290" + | "400292" + | "400316" + | "400322" + | "400323" + | "400324" + | "400325" + | "400327" + | "400329" + | "400330" + | "400331" + | "400333" + | "400334" + | "400335" + | "400336" + | "400337" + | "400352" + | "400353" + | "400354" + | "400358" + | "400359" + | "400360" + | "400362" + | "400363" + | "400364" + | "400390" + | "400394" + | "400395" + | "400396" + | "400397" + | "400398" + | "400399" + | "400400" + | "400401" + | "400403" + | "400404" + | "400405" + | "400406" + | "400408" + | "400409" + | "400418" + | "400419" + | "400422" + | "400423" + | "400426" + | "400448" + | "400449" + | "400452" + | "400453" + | "400454" + | "400457" + | "400461" + | "400462" + | "400467" + | "400468" + | "400469" + | "400470" + | "400471" + | "400472" + | "400473" + | "400474" + | "400475" + | "400476" + | "400477" + | "400479" + | "400482" + | "400483" + | "400484" + | "400485" + | "400486" + | "400512" + | "400514" + | "400515" + | "400516" + | "400518" + | "400519" + | "400561" + | "400595" + | "400596" + | "400597" + | "400598" + | "400599" + | "400602" + | "400609" + | "400610" + | "400611" + | "400612" + | "400613" + | "400614" + | "400615" + | "400616" + | "400617" + | "400618" + | "400619" + | "400620" + | "400621" + | "400622" + | "400623" + | "400624" + | "400626" + | "400627" + | "400628" + | "400629" + | "400630" + | "400631" + | "400632" + | "400633" + | "400634" + | "400635" + | "400636" + | "400639" + | "400640" + | "400641" + | "400642" + | "400643" + | "400644" + | "400645" + | "400646" + | "400647" + | "400648" + | "400649" + | "400655" + | "400656" + | "400657" + | "400658" + | "400659" + | "400661" + | "400662" + | "400663" + | "400676" + | "400677" + | "400678" + | "400716" + | "400719" + | "400722" + | "400723" + | "400724" + | "400725" + | "400731" + | "400732" + | "400744" + | "400745" + | "400747" + | "400750" + | "400751" + | "400752" + | "400755" + | "400756" + | "400759" + | "400760" + | "400761" + | "400762" + | "400764" + | "400768" + | "400769" + | "400771" + | "400772" + | "400796" + | "400798" + | "400799" + | "400808" + | "400809" + | "400810" + | "400811" + | "400812" + | "400814" + | "400815" + | "400816" + | "400834" + | "400835" + | "400836" + | "400837" + | "400838" + | "400840" + | "400841" + | "400843" + | "400846" + | "400847" + | "400848" + | "400849" + | "400851" + | "400852" + | "400853" + | "400856" + | "400858" + | "400860" + | "400861" + | "400890" + | "400903" + | "400910" + | "400913" + | "400916" + | "400917" + | "400919" + | "400929" + | "400933" + | "400936" + | "400938" + | "400940" + | "400941" + | "400943" + | "400948" + | "400950" + | "400988" + | "401014" + | "401015" + | "401016" + | "401021" + | "401022" + | "401023" + | "401024" + | "401025" + | "401026" + | "401027" + | "401029" + | "401030" + | "401031" + | "401032" + | "401033" + | "401034" + | "401035" + | "401036" + | "401037" + | "401038" + | "401039" + | "401044" + | "401045" + | "401047" + | "401051" + | "401052" + | "401055" + | "401056" + | "401069" + | "401070" + | "401074" + | "401078" + | "401079" + | "401084" + | "401085" + | "401086" + | "401087" + | "401088" + | "401090" + | "401091" + | "401092" + | "401093" + | "401094" + | "401096" + | "401099" + | "401100" + | "401101" + | "401139" + | "401140" + | "401141" + | "401142" + | "401147" + | "401149" + | "401150" + | "401168" + | "401169" + | "401182" + | "401183" + | "401191" + | "401192" + | "401193" + | "401194" + | "401195" + | "401202" + | "401206" + | "401208" + | "401209" + | "401210" + | "401220" + | "401223" + | "401224" + | "401225" + | "401226" + | "401227" + | "401229" + | "401231" + | "401232" + | "401239" + | "401248" + | "401250" + | "401252" + | "401253" + | "401254" + | "401255" + | "401256" + | "401257" + | "401258" + | "401259" + | "401261" + | "401262" + | "401263" + | "401264" + | "401265" + | "401267" + | "401268" + | "401269" + | "401270" + | "401271" + | "401272" + | "401274" + | "401275" + | "401276" + | "401277" + | "401279" + | "401281" + | "401282" + | "401286" + | "401287" + | "401288" + | "401294" + | "401301" + | "401302" + | "401305" + | "401306" + | "401307" + | "401308" + | "401310" + | "401311" + | "401312" + | "401313" + | "401314" + | "401315" + | "401317" + | "401318" + | "401324" + | "401326" + | "401327" + | "401328" + | "401329" + | "401330" + | "401331" + | "401333" + | "401334" + | "401335" + | "401336" + | "401337" + | "401338" + | "401339" + | "401341" + | "401342" + | "401343" + | "401344" + | "401345" + | "401348" + | "401359" + | "401360" + | "401361" + | "401363" + | "401364" + | "401366" + | "401371" + | "401372" + | "401373" + | "401374" + | "401375" + | "401377" + | "401379" + | "401380" + | "401381" + | "401386" + | "401387" + | "401388" + | "401393" + | "401398" + | "401400" + | "401401" + | "401402" + | "401404" + | "401407" + | "401408" + | "401409" + | "401410" + | "401411" + | "401412" + | "401413" + | "401414" + | "401416" + | "401417" + | "401435" + | "401436" + | "401438" + | "401440" + | "401441" + | "401442" + | "401443" + | "401444" + | "401446" + | "401447" + | "401448" + | "401450" + | "401453" + | "401458" + | "401459" + | "401462" + | "401463" + | "401464" + | "401465" + | "401466" + | "401467" + | "401469" + | "401470" + | "401489" + | "401490" + | "401491" + | "401492" + | "401493" + | "401495" + | "401496" + | "401497" + | "401500" + | "401501" + | "401502" + | "401503" + | "401506" + | "401507" + | "401528" + | "401529" + | "401531" + | "401532" + | "401533" + | "401535" + | "401536" + | "401538" + | "401543" + | "401544" + | "401545" + | "401547" + | "401548" + | "401549" + | "401552" + | "401553" + | "401554" + | "401555" + | "401556" + | "401557" + | "401558" + | "401561" + | "401562" + | "401563" + | "401564" + | "401565" + | "401566" + | "401567" + | "401568" + | "401569" + | "401570" + | "401575" + | "401577" + | "401587" + | "401589" + | "401595" + | "401596" + | "401599" + | "401600" + | "401608" + | "401609" + | "401610" + | "401624" + | "401625" + | "401626" + | "401630" + | "401633" + | "401657" + | "401659" + | "401664" + | "401665" + | "401666" + | "401669" + | "401670" + | "401675" + | "401679" + | "401681" + | "401685" + | "401686" + | "401687" + | "401688" + | "401689" + | "401690" + | "401694" + | "401696" + | "401697" + | "401698" + | "401699" + | "401701" + | "401702" + | "401703" + | "401704" + | "401706" + | "401707" + | "401708" + | "401709" + | "401710" + | "401712" + | "401715" + | "401716" + | "401718" + | "401721" + | "401722" + | "401725" + | "401726" + | "401727" + | "401729" + | "401730" + | "401731" + | "401732" + | "401738" + | "401739" + | "401740" + | "401741" + | "401742" + | "401746" + | "401747" + | "401748" + | "401754" + | "401755" + | "401756" + | "401760" + | "401761" + | "401762" + | "401763" + | "401764" + | "401765" + | "401768" + | "401769" + | "401771" + | "401772" + | "401774" + | "401775" + | "401778" + | "401779" + | "401780" + | "401781" + | "401782" + | "401784" + | "401785" + | "401786" + | "401787" + | "401791" + | "401793" + | "401797" + | "401802" + | "401806" + | "401808" + | "401809" + | "401811" + | "401812" + | "401813" + | "401814" + | "401818" + | "401819" + | "401821" + | "401822" + | "401824" + | "401826" + | "401827" + | "401832" + | "401833" + | "401840" + | "401842" + | "401847" + | "401848" + | "401850" + | "401851" + | "401852" + | "401853" + | "401857" + | "401858" + | "401867" + | "401869" + | "401870" + | "401874" + | "401875" + | "401876" + | "401877" + | "401878" + | "401880" + | "401881" + | "401882" + | "401883" + | "401884" + | "401887" + | "401889" + | "401890" + | "401893" + | "401897" + | "401898" + | "401899" + | "401900" + | "401901" + | "401903" + | "401905" + | "401906" + | "401908" + | "401910" + | "401916" + | "401917" + | "401919" + | "401920" + | "401921" + | "401922" + | "401924" + | "401925" + | "401926" + | "401927" + | "401929" + | "401930" + | "401933" + | "401934" + | "401935" + | "401936" + | "401937" + | "401939" + | "401941" + | "401942" + | "401943" + | "401946" + | "401947" + | "401948" + | "401950" + | "401951" + | "401954" + | "401955" + | "401957" + | "401958" + | "401960" + | "401961" + | "401964" + | "401965" + | "401968" + | "401969" + | "401970" + | "401971" + | "401973" + | "401977" + | "401988" + | "401989" + | "401990" + | "401993" + | "401994" + | "401999" + | "402000" + | "402001" + | "402003" + | "402004" + | "402005" + | "402006" + | "402016" + | "402017" + | "402018" + | "402022" + | "402023" + | "402024" + | "402027" + | "402028" + | "402029" + | "402032" + | "402033" + | "402034" + | "402036" + | "402037" + | "402038" + | "402039" + | "402042" + | "402043" + | "402048" + | "402052" + | "402054" + | "402055" + | "402056" + | "402057" + | "402067" + | "402068" + | "402071" + | "402082" + | "402085" + | "402088" + | "402090" + | "402091" + | "402092" + | "402093" + | "402094" + | "402095" + | "402096" + | "402097" + | "402100" + | "402102" + | "402103" + | "402104" + | "402105" + | "402106" + | "402107" + | "402108" + | "402109" + | "402110" + | "402111" + | "402112" + | "402113" + | "402118" + | "402119" + | "402124" + | "402125" + | "402126" + | "402127" + | "402128" + | "402130" + | "402134" + | "402142" + | "402143" + | "402144" + | "402145" + | "402152" + | "402153" + | "402154" + | "402155" + | "402157" + | "402160" + | "402161" + | "402162" + | "402163" + | "402164" + | "402165" + | "402166" + | "402167" + | "402169" + | "402171" + | "402172" + | "402173" + | "402174" + | "402175" + | "402183" + | "402185" + | "402186" + | "402188" + | "402189" + | "402191" + | "402194" + | "402195" + | "402205" + | "402211" + | "402214" + | "402215" + | "402216" + | "402217" + | "402218" + | "402221" + | "402222" + | "402223" + | "402224" + | "402228" + | "402229" + | "402233" + | "402269" + | "402290" + | "402292" + | "402293" + | "402294" + | "402295" + | "402296" + | "402298" + | "402299" + | "402300" + | "402301" + | "402303" + | "402328" + | "402330" + | "402331" + | "402334" + | "402335" + | "402336" + | "402338" + | "402339" + | "402345" + | "402346" + | "402347" + | "402348" + | "402349" + | "402351" + | "402355" + | "402446" + | "402458" + | "402460" + | "402461" + | "402498" + | "402502" + | "402503" + | "402504" + | "402505" + | "402506" + | "402507" + | "402508" + | "402509" + | "402510" + | "402517" + | "402518" + | "402519" + | "402520" + | "402521" + | "402522" + | "402525" + | "402526" + | "402535" + | "402634" + | "402638" + | "402639" + | "402641" + | "402642" + | "402643" + | "402644" + | "402645" + | "402646" + | "402647" + | "402653" + | "402656" + | "402657" + | "402658" + | "402659" + | "402660" + | "402661" + | "402662" + | "402666" + | "402670" + | "402673" + | "402674" + | "402677" + | "402678" + | "402679" + | "402680" + | "402681" + | "402682" + | "402687" + | "402688" + | "402689" + | "402691" + | "402692" + | "402694" + | "402696" + | "402697" + | "402704" + | "402705" + | "402707" + | "402723" + | "402740" + | "402741" + | "402744" + | "402745" + | "402748" + | "402749" + | "402753" + | "402755" + | "402762" + | "402764" + | "402766" + | "402767" + | "402769" + | "402772" + | "402773" + | "402774" + | "402805" + | "402809" + | "402811" + | "402816" + | "402819" + | "402826" + | "402829" + | "402831" + | "402835" + | "402838" + | "402839" + | "402843" + | "402845" + | "402851" + | "402853" + | "402854" + | "402856" + | "402857" + | "402858" + | "402861" + | "402862" + | "402863" + | "402864" + | "402865" + | "402867" + | "402868" + | "402869" + | "402870" + | "403036" + | "403037" + | "403038" + | "403047" + | "403076" + | "403103" + | "403104" + | "403105" + | "403106" + | "403107" + | "403109" + | "403110" + | "403111" + | "403112" + | "403114" + | "403115" + | "403116" + | "403117" + | "403118" + | "403119" + | "403122" + | "403125" + | "403126" + | "403132" + | "403139" + | "403142" + | "403144" + | "403145" + | "403147" + | "403148" + | "403149" + | "403150" + | "403151" + | "403152" + | "403153" + | "403154" + | "403155" + | "403158" + | "403159" + | "403162" + | "403163" + | "403164" + | "403165" + | "403166" + | "403167" + | "403168" + | "403169" + | "403171" + | "403192" + | "403216" + | "403238" + | "403239" + | "403240" + | "403241" + | "403242" + | "403245" + | "403247" + | "403248" + | "403249" + | "403251" + | "403252" + | "403253" + | "403257" + | "403264" + | "403266" + | "403267" + | "403271" + | "403276" + | "403292" + | "403297" + | "403303" + | "403304" + | "403305" + | "403306" + | "403307" + | "403311" + | "403312" + | "403313" + | "403316" + | "403317" + | "403318" + | "403319" + | "403320" + | "403323" + | "403326" + | "403338" + | "403342" + | "403343" + | "403350" + | "403359" + | "403362" + | "403367" + | "403369" + | "403372" + | "403373" + | "403374" + | "403375" + | "403376" + | "403377" + | "403380" + | "403383" + | "403392" + | "403397" + | "403399" + | "403415" + | "403416" + | "403417" + | "403418" + | "403419" + | "403421" + | "403422" + | "403424" + | "403425" + | "403427" + | "403432" + | "403433" + | "403434" + | "403436" + | "403439" + | "403440" + | "403443" + | "403444" + | "403447" + | "403456" + | "403457" + | "403458" + | "403459" + | "403461" + | "403462" + | "403465" + | "403466" + | "403472" + | "403475" + | "403480" + | "403483" + | "403486" + | "403487" + | "403488" + | "403489" + | "403491" + | "403492" + | "403494" + | "403503" + | "403504" + | "403505" + | "403506" + | "403510" + | "403512" + | "403513" + | "403518" + | "403522" + | "403523" + | "403525" + | "403526" + | "403528" + | "403530" + | "403537" + | "403545" + | "403547" + | "403552" + | "403555" + | "403556" + | "403557" + | "403560" + | "403562" + | "403563" + | "403573" + | "403590" + | "403601" + | "403604" + | "403606" + | "403608" + | "403610" + | "403611" + | "403612" + | "403617" + | "403620" + | "403621" + | "403626" + | "403632" + | "403639" + | "403647" + | "403670" + | "403671" + | "403672" + | "403673" + | "403674" + | "403676" + | "403677" + | "403711" + | "403726" + | "403731" + | "403732" + | "403733" + | "403736" + | "403749" + | "403757" + | "403760" + | "403763" + | "403765" + | "403766" + | "403769" + | "403772" + | "403776" + | "403777" + | "403779" + | "403781" + | "403782" + | "403786" + | "403787" + | "403791" + | "403797" + | "403802" + | "403805" + | "403808" + | "403821" + | "403822" + | "403826" + | "403829" + | "403830" + | "403832" + | "403837" + | "403846" + | "403847" + | "403851" + | "403853" + | "403854" + | "403858" + | "403870" + | "403871" + | "403876" + | "403878" + | "403886" + | "403887" + | "403893" + | "403894" + | "403895" + | "403896" + | "403897" + | "403902" + | "403903" + | "403906" + | "403907" + | "403910" + | "403913" + | "403914" + | "403942" + | "403953" + | "403954" + | "403955" + | "403956" + | "403975" + | "403976" + | "403978" + | "403979" + | "403980" + | "403981" + | "403982" + | "403984" + | "403986" + | "403987" + | "403989" + | "403992" + | "403993" + | "403994" + | "403995" + | "403996" + | "403997" + | "404008" + | "404010" + | "404011" + | "404012" + | "404013" + | "404014" + | "404015" + | "404017" + | "404018" + | "404019" + | "404024" + | "404029" + | "404030" + | "404031" + | "404032" + | "404035" + | "404037" + | "404039" + | "404040" + | "404043" + | "404049" + | "404052" + | "404054" + | "404056" + | "404058" + | "404066" + | "404075" + | "404076" + | "404077" + | "404079" + | "404080" + | "404081" + | "404085" + | "404087" + | "404092" + | "404099" + | "404100" + | "404101" + | "404104" + | "404105" + | "404106" + | "404108" + | "404116" + | "404120" + | "404122" + | "404124" + | "404125" + | "404129" + | "404130" + | "404131" + | "404132" + | "404133" + | "404134" + | "404135" + | "404136" + | "404137" + | "404138" + | "404142" + | "404147" + | "404148" + | "404153" + | "404155" + | "404160" + | "404161" + | "404168" + | "404171" + | "404180" + | "404190" + | "404191" + | "404194" + | "404211" + | "404219" + | "404224" + | "404225" + | "404232" + | "404244" + | "404245" + | "404251" + | "404253" + | "404254" + | "404255" + | "404258" + | "404259" + | "404260" + | "404262" + | "404264" + | "404266" + | "404271" + | "404274" + | "404278" + | "404279" + | "404280" + | "404283" + | "404284" + | "404286" + | "404287" + | "404289" + | "404290" + | "404308" + | "404309" + | "404320" + | "404321" + | "404325" + | "404327" + | "404333" + | "404334" + | "404335" + | "404336" + | "404337" + | "404338" + | "404339" + | "404341" + | "404350" + | "404351" + | "404352" + | "404353" + | "404354" + | "404355" + | "404356" + | "404357" + | "404362" + | "404681" + | "404821" + | "404822" + | "404823" + | "404824" + | "404825" + | "404826" + | "404833" + | "404834" + | "404837" + | "404838" + | "404843" + | "404844" + | "404846" + | "404847" + | "404850" + | "404853" + | "404854" + | "404855" + | "404856" + | "404857" + | "404858" + | "404859" + | "404860" + | "404863" + | "404864" + | "404865" + | "404870" + | "404871" + | "404876" + | "404881" + | "404895" + | "404905" + | "404909" + | "404911" + | "404915" + | "404916" + | "404918" + | "404920" + | "404921" + | "404922" + | "404926" + | "404927" + | "404936" + | "404947" + | "404948" + | "404949" + | "404950" + | "404963" + | "404964" + | "404972" + | "404973" + | "404976" + | "404977" + | "404978" + | "404979" + | "404980" + | "404983" + | "404986" + | "404987" + | "404988" + | "404990" + | "404991" + | "404992" + | "404994" + | "404995" + | "405003" + | "405006" + | "405014" + | "405015" + | "405016" + | "405024" + | "405026" + | "405053" + | "405054" + | "405056" + | "405057" + | "405061" + | "405062" + | "405063" + | "405065" + | "405066" + | "405067" + | "405068" + | "405069" + | "405070" + | "405071" + | "405072" + | "405073" + | "405075" + | "405076" + | "405077" + | "405078" + | "405079" + | "405083" + | "405084" + | "405086" + | "405087" + | "405091" + | "405092" + | "405093" + | "405098" + | "405100" + | "405102" + | "405103" + | "405111" + | "405112" + | "405118" + | "405120" + | "405124" + | "405125" + | "405133" + | "405135" + | "405138" + | "405140" + | "405150" + | "405151" + | "405152" + | "405154" + | "405155" + | "405157" + | "405159" + | "405165" + | "405167" + | "405169" + | "405172" + | "405179" + | "405181" + | "405182" + | "405185" + | "405186" + | "405193" + | "405227" + | "405230" + | "405231" + | "405234" + | "405237" + | "405241" + | "405247" + | "405248" + | "405249" + | "405265" + | "405266" + | "405269" + | "405279" + | "405284" + | "405285" + | "405286" + | "405289" + | "405290" + | "405291" + | "405292" + | "405293" + | "405294" + | "405295" + | "405297" + | "405298" + | "405299" + | "405308" + | "405311" + | "405312" + | "405313" + | "405315" + | "405316" + | "405318" + | "405319" + | "405320" + | "405321" + | "405322" + | "405323" + | "405325" + | "405328" + | "405329" + | "405331" + | "405333" + | "405336" + | "405339" + | "405340" + | "405341" + | "405342" + | "405343" + | "405346" + | "405348" + | "405349" + | "405350" + | "405352" + | "405353" + | "405358" + | "405359" + | "405361" + | "405368" + | "405370" + | "405372" + | "405373" + | "405374" + | "405375" + | "405376" + | "405380" + | "405382" + | "405383" + | "405386" + | "405387" + | "405390" + | "405393" + | "405394" + | "405396" + | "405406" + | "405409" + | "405412" + | "405414" + | "405415" + | "405416" + | "405417" + | "405419" + | "405420" + | "405421" + | "405422" + | "405424" + | "405426" + | "405444" + | "405447" + | "405450" + | "405451" + | "405452" + | "405455" + | "405456" + | "405457" + | "405458" + | "405459" + | "405460" + | "405464" + | "405466" + | "405467" + | "405468" + | "405470" + | "405471" + | "405472" + | "405473" + | "405474" + | "405477" + | "405480" + | "405485" + | "405488" + | "405489" + | "405490" + | "405491" + | "405492" + | "405493" + | "405494" + | "405495" + | "405496" + | "405499" + | "405505" + | "405506" + | "405508" + | "405514" + | "405516" + | "405517" + | "405519" + | "405521" + | "405523" + | "405525" + | "405527" + | "405530" + | "405531" + | "405537" + | "405540" + | "405541" + | "405542" + | "405543" + | "405548" + | "405549" + | "405555" + | "405558" + | "405561" + | "405562" + | "405564" + | "405565" + | "405575" + | "405576" + | "405577" + | "405579" + | "405580" + | "405583" + | "405585" + | "405586" + | "405587" + | "405588" + | "405592" + | "405593" + | "405609" + | "405612" + | "405620" + | "405622" + | "405627" + | "405631" + | "405635" + | "405641" + | "405643" + | "405645" + | "405648" + | "405650" + | "405652" + | "405653" + | "450045" + | "450102" + | "450104" + | "450123" + | "450180" + | "450228" + | "450331" + | "450367" + | "450422" + | "450424" + | "450492" + | "503357" + | "503848" + | "503853" + | "503855" + | "503870" + | "503876" + | "504007" + | "504023" + | "504417" + | "504423" + | "504517" + | "505254" + | "803002" + | "803003" + | "803024" + | "803034" + | "803054" + | "803056" + | "803057" + | "803058" + | "803059" + | "803066" + | "803067" + | "803081" + | "803082" + | "803094" + | "803108" + | "803115" + | "803120" + | "803131" + | "803151" + | "803153" + | "803154" + | "803166" + | "803194" + | "803195" + | "803215" + | "803243" + | "840115" + | "901342" + | "903002" + | "903003" + | "903004" + | "903007" + | "903025" + | "903027" + | "903030" + | "903042" + | "903046" + | "903049" + | "903063" + | "903074" + | "903075" + | "903079" + | "903082" + | "903088" + | "903092" + | "903093" + | "903105" + | "903280" + | "903286" + | "903290" + | "903302" + | "903325" + | "903340" + | "903341" + | "903352" + | "903355" + | "903358" + | "903360" + | "903363" + | "903365" + | "903370" + | "903371" + | "903372" + | "904242" + | "904246" + | "904918" + | "904920" + | "904987" + | "940010" + | "940040" diff --git a/src/types.ts b/src/types.ts index 2caf14d..0db264b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,3 +1,23 @@ +import type { + KnownBusRoute, + KnownBusStopId, + KnownRoute, + KnownStopId, + KnownSubwayRoute, + KnownSubwayStopId, +} from "./generated"; + +export type AutocompleteString = + | TKnown + | (string & {}); + +export type RouteId = AutocompleteString; +export type SubwayRoute = AutocompleteString; +export type BusRoute = AutocompleteString; +export type StopId = AutocompleteString; +export type SubwayStopId = AutocompleteString; +export type BusStopId = AutocompleteString; + export type TransitMode = "subway" | "bus" | "lirr" | "metro-north"; export type Direction = "north" | "south" | "east" | "west" | "unknown"; @@ -171,22 +191,22 @@ export interface Alert { } export interface SubwayArrivalQuery { - stopId: string; - route?: string; + stopId: SubwayStopId; + route?: SubwayRoute; direction?: Direction | "uptown" | "downtown"; limit?: number; includeRaw?: boolean; } export interface BusArrivalQuery { - stopId: string; - route?: string; + stopId: BusStopId; + route?: BusRoute; limit?: number; includeRaw?: boolean; } export interface BusVehicleQuery { - route?: string; + route?: BusRoute; vehicleId?: string; limit?: number; includeRaw?: boolean; @@ -194,8 +214,8 @@ export interface BusVehicleQuery { export interface AlertQuery { mode?: TransitMode; - route?: string; - stopId?: string; + route?: RouteId; + stopId?: StopId; includeRaw?: boolean; } @@ -203,7 +223,7 @@ export interface StopsNearQuery { lat: number; lon: number; modes?: TransitMode[]; - route?: string; + route?: RouteId; includeRoutes?: boolean; radiusMeters?: number; limit?: number; From 3debc79e1ce4c082362433d546cce30382fc2cc7 Mon Sep 17 00:00:00 2001 From: Gary Tokman Date: Tue, 26 May 2026 20:25:02 -0400 Subject: [PATCH 2/2] fix: address generated route type review fix: require snapshot URL for type generation --- README.md | 6 +- scripts/generate-known-types.ts | 98 ++++- src/generated.ts | 622 +++++++++++++++++++++++++++++++- 3 files changed, 719 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 28d125d..4c5237d 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,11 @@ imports. Route and stop inputs include generated autocomplete for known MTA values while remaining permissive for future route and stop additions. Refresh the generated -types from the hosted stops snapshot with `bun run generate:types`. +types from the hosted stops snapshot by setting `MTA_STOPS_SNAPSHOT_URL` or +`NEXT_PUBLIC_MTA_STOPS_SNAPSHOT_URL` and running `bun run generate:types`. Bus +route autocomplete is generated from public MTA borough GTFS route files by +default; set `MTA_BUS_GTFS_URLS` to a comma-separated list of GTFS zip URLs to +override them. ## Endpoints diff --git a/scripts/generate-known-types.ts b/scripts/generate-known-types.ts index 391937a..96439fc 100644 --- a/scripts/generate-known-types.ts +++ b/scripts/generate-known-types.ts @@ -1,12 +1,31 @@ -import { writeFileSync } from "node:fs" +import { parse } from "csv-parse/sync" +import { unzipSync } from "fflate" + +const defaultBusGtfsUrls = [ + "https://rrgtfsfeeds.s3.amazonaws.com/gtfs_b.zip", + "https://rrgtfsfeeds.s3.amazonaws.com/gtfs_bx.zip", + "https://rrgtfsfeeds.s3.amazonaws.com/gtfs_m.zip", + "https://rrgtfsfeeds.s3.amazonaws.com/gtfs_q.zip", + "https://rrgtfsfeeds.s3.amazonaws.com/gtfs_si.zip", +] const snapshotUrl = process.env.MTA_STOPS_SNAPSHOT_URL ?? process.env.NEXT_PUBLIC_MTA_STOPS_SNAPSHOT_URL if (!snapshotUrl) { - throw new Error("MTA_STOPS_SNAPSHOT_URL is required to generate known MTA types.") + throw new Error( + "MTA_STOPS_SNAPSHOT_URL or NEXT_PUBLIC_MTA_STOPS_SNAPSHOT_URL is required to generate known MTA types.", + ) } +const busGtfsUrls = ( + process.env.MTA_BUS_GTFS_URLS ?? + process.env.MTA_BUS_GTFS_URL ?? + defaultBusGtfsUrls.join(",") +) + .split(",") + .map((url) => url.trim()) + .filter(Boolean) type SnapshotStop = { id: string @@ -28,6 +47,15 @@ type Snapshot = { } } +type GtfsRoute = { + route_id: string + route_short_name?: string + route_long_name?: string + route_type?: string + route_color?: string + route_text_color?: string +} + const snapshot = (await fetch(snapshotUrl).then((response) => { if (!response.ok) { throw new Error(`Unable to fetch stops snapshot: ${response.status} ${response.statusText}`) @@ -40,6 +68,14 @@ const routeEntries = Object.entries(snapshot.indexes?.routesToStops ?? {}) const routeMetadata = new Map() const routeTypes = new Map() +for (const route of await loadBusGtfsRoutes(busGtfsUrls)) { + for (const id of [route.id, route.shortName]) { + if (!id) continue + routeMetadata.set(id, route) + routeTypes.set(id, 3) + } +} + for (const routes of Object.values(snapshot.stopRoutes ?? {})) { for (const route of routes) { for (const id of [route.id, route.shortName]) { @@ -76,13 +112,65 @@ function looksLikeSubwayRoute(routeId: string) { return /^[A-Z0-9]{1,2}$/.test(routeId) } -const routeIds = routeEntries.flatMap(([routeId]) => aliasesForRoute(routeId)) -const subwayRoutes = routeIds.filter((routeId) => routeType(routeId) === 1 || looksLikeSubwayRoute(routeId)) +const subwayRouteAliases = new Set(["SI", "SIR"]) + +const routeIds = [ + ...new Set([ + ...routeEntries.flatMap(([routeId]) => aliasesForRoute(routeId)), + ...[...routeMetadata.keys()].flatMap((routeId) => aliasesForRoute(routeId)), + ]), +] +const subwayRoutes = routeIds.filter( + (routeId) => + routeType(routeId) === 1 || + looksLikeSubwayRoute(routeId) || + subwayRouteAliases.has(routeId), +) const busRoutes = routeIds.filter((routeId) => routeType(routeId) === 3) const stopIds = stops.map((stop) => stop.id) const subwayStopIds = stops.filter((stop) => stop.mode === "subway").map((stop) => stop.id) const busStopIds = stops.filter((stop) => stop.mode === "bus").map((stop) => stop.id) +async function loadBusGtfsRoutes(urls: string[]) { + const routes: SnapshotRoute[] = [] + + await Promise.all( + urls.map(async (url) => { + const response = await fetch(url) + if (!response.ok) { + throw new Error(`Unable to fetch bus GTFS routes from ${url}: ${response.status} ${response.statusText}`) + } + + const files = unzipSync(new Uint8Array(await response.arrayBuffer())) + const rows = parseGtfsFile(files, "routes.txt") + + routes.push( + ...rows.map((route) => ({ + id: route.route_id, + shortName: route.route_short_name || route.route_id, + longName: route.route_long_name || undefined, + type: Number(route.route_type || 3), + color: route.route_color || undefined, + textColor: route.route_text_color || undefined, + })), + ) + }), + ) + + return routes +} + +function parseGtfsFile(files: Record, name: string) { + const bytes = files[name] + if (!bytes) return [] + + return parse(new TextDecoder().decode(bytes), { + bom: true, + columns: true, + skip_empty_lines: true, + }) as T[] +} + function uniqueSorted(values: string[]) { return [...new Set(values)].sort((a, b) => a.localeCompare(b, "en", { numeric: true })) } @@ -99,7 +187,7 @@ function union(name: string, values: string[]) { const generated = `// Generated by scripts/generate-known-types.ts from the hosted stops snapshot.\n// Snapshot generated at: ${snapshot.generatedAt ?? "unknown"}\n// Do not edit by hand.\n\n${union("KnownRoute", routeIds)}\n${union("KnownSubwayRoute", subwayRoutes)}\n${union("KnownBusRoute", busRoutes)}\n${union("KnownStopId", stopIds)}\n${union("KnownSubwayStopId", subwayStopIds)}\n${union("KnownBusStopId", busStopIds)}` -writeFileSync(new URL("../src/generated.ts", import.meta.url), generated) +await Bun.write(new URL("../src/generated.ts", import.meta.url), generated) console.log( `Generated src/generated.ts with ${uniqueSorted(routeIds).length} routes and ${uniqueSorted(stopIds).length} stops.`, ) diff --git a/src/generated.ts b/src/generated.ts index 265f98e..4344b85 100644 --- a/src/generated.ts +++ b/src/generated.ts @@ -14,17 +14,192 @@ export type KnownRoute = | "7X" | "A" | "B" + | "B1" + | "B2" + | "B3" + | "B4" + | "B6" + | "B7" + | "B8" + | "B9" + | "B11" + | "B12" + | "B13" + | "B14" + | "B15" + | "B16" + | "B17" + | "B20" + | "B24" + | "B25" + | "B26" + | "B31" + | "B32" + | "B35" + | "B36" + | "B37" + | "B38" + | "B39" + | "B41" + | "B42" + | "B43" + | "B44" + | "B44-SBS" + | "B44+" + | "B45" + | "B46" + | "B46-SBS" + | "B46+" + | "B47" + | "B48" + | "B49" + | "B52" + | "B54" + | "B57" + | "B60" + | "B61" + | "B62" + | "B63" + | "B64" + | "B65" + | "B67" + | "B68" + | "B69" + | "B70" + | "B74" + | "B82" + | "B82-SBS" + | "B82+" + | "B83" + | "B84" + | "B90" + | "B93" + | "B94" + | "B96" + | "B98" + | "B99" + | "B101" + | "B102" + | "B106" + | "B111" + | "BEDLOOP" + | "BJ-MW" + | "Bx1" + | "BX1" + | "Bx2" + | "BX2" + | "Bx3" + | "BX3" + | "Bx4" + | "BX4" + | "Bx4A" + | "BX4A" + | "Bx5" + | "BX5" + | "Bx6" + | "BX6" + | "Bx6-SBS" + | "BX6+" + | "Bx7" + | "BX7" + | "Bx8" + | "BX8" + | "Bx9" + | "BX9" + | "Bx10" + | "BX10" + | "Bx11" + | "BX11" + | "Bx12" + | "BX12" + | "Bx12-SBS" + | "BX12+" + | "Bx13" + | "BX13" + | "Bx15" + | "BX15" + | "Bx16" + | "BX16" + | "Bx17" + | "BX17" + | "Bx18A" + | "BX18A" + | "Bx18B" + | "BX18B" + | "Bx19" + | "BX19" + | "Bx20" + | "BX20" + | "Bx21" + | "BX21" + | "Bx22" + | "BX22" + | "Bx24" + | "BX24" + | "Bx25" + | "BX25" + | "Bx26" + | "BX26" + | "Bx27" + | "BX27" + | "Bx28" + | "BX28" + | "Bx29" + | "BX29" + | "Bx30" + | "BX30" + | "Bx31" + | "BX31" + | "Bx32" + | "BX32" + | "Bx33" + | "BX33" + | "Bx34" + | "BX34" + | "Bx35" + | "BX35" + | "Bx36" + | "BX36" + | "Bx38" + | "BX38" + | "Bx39" + | "BX39" + | "Bx40" + | "BX40" + | "Bx41" + | "BX41" + | "Bx41-SBS" + | "BX41+" + | "Bx42" + | "BX42" + | "Bx46" + | "BX46" + | "Bx90" + | "BX90" + | "BX92" + | "BX95" | "C" | "D" + | "D90" + | "D99" | "E" | "F" + | "F1" | "FS" | "FX" | "G" | "GS" | "H" | "J" + | "J90" + | "J99" | "L" + | "L90" + | "L91" + | "L92" + | "L0202" + | "L0719" + | "L1227" | "M" | "M1" | "M2" @@ -75,8 +250,10 @@ export type KnownRoute = | "M86" | "M86-SBS" | "M86+" + | "M90" | "M96" | "M98" + | "M100" | "M101" | "M102" | "M103" @@ -84,13 +261,145 @@ export type KnownRoute = | "M106" | "M116" | "M125" + | "M191" + | "MW-ML" | "N" | "Q" + | "Q1" + | "Q2" + | "Q3" + | "Q4" + | "Q5" + | "Q12" + | "Q13" + | "Q14" + | "Q15" + | "Q16" + | "Q17" + | "Q20" + | "Q24" + | "Q27" + | "Q29" + | "Q30" + | "Q31" + | "Q36" + | "Q38" + | "Q39" + | "Q42" + | "Q43" + | "Q44" + | "Q44-SBS" + | "Q44+" + | "Q45" + | "Q46" + | "Q48" + | "Q54" + | "Q55" + | "Q56" + | "Q58" + | "Q59" + | "Q61" + | "Q67" + | "Q75" + | "Q76" + | "Q77" + | "Q82" + | "Q83" + | "Q84" + | "Q85" + | "Q86" + | "Q87" + | "Q88" + | "Q89" + | "Q90" + | "Q92" + | "Q93" + | "Q96" + | "Q97" + | "Q98" + | "Q107" + | "Q108" + | "Q109" + | "Q121" + | "QM63" + | "QM64" + | "QM68" | "R" | "S" + | "S40" + | "S42" + | "S44" + | "S46" + | "S48" + | "S51" + | "S52" + | "S53" + | "S54" + | "S55" + | "S56" + | "S57" + | "S59" + | "S61" + | "S62" + | "S66" + | "S74" + | "S76" + | "S78" + | "S79" + | "S79-SBS" + | "S79+" + | "S81" + | "S84" + | "S86" + | "S89" + | "S90" + | "S91" + | "S92" + | "S93" + | "S94" + | "S96" + | "S96B1" + | "S96B2" + | "S96B3" + | "S98" | "SI" + | "SIM1" + | "SIM1C" + | "SIM2" + | "SIM3" + | "SIM3C" + | "SIM4" + | "SIM4C" + | "SIM4X" + | "SIM5" + | "SIM6" + | "SIM7" + | "SIM8" + | "SIM8X" + | "SIM9" + | "SIM10" + | "SIM11" + | "SIM15" + | "SIM22" + | "SIM23" + | "SIM24" + | "SIM25" + | "SIM26" + | "SIM30" + | "SIM31" + | "SIM32" + | "SIM33" + | "SIM33C" + | "SIM34" + | "SIM35" | "SIR" + | "T113" + | "T426" | "W" + | "X27" + | "X28" + | "X37" + | "X38" | "Z" export type KnownSubwayRoute = @@ -121,11 +430,188 @@ export type KnownSubwayRoute = | "Q" | "R" | "S" + | "SI" + | "SIR" | "W" | "Z" export type KnownBusRoute = - "M1" + "B1" + | "B2" + | "B3" + | "B4" + | "B6" + | "B7" + | "B8" + | "B9" + | "B11" + | "B12" + | "B13" + | "B14" + | "B15" + | "B16" + | "B17" + | "B20" + | "B24" + | "B25" + | "B26" + | "B31" + | "B32" + | "B35" + | "B36" + | "B37" + | "B38" + | "B39" + | "B41" + | "B42" + | "B43" + | "B44" + | "B44-SBS" + | "B44+" + | "B45" + | "B46" + | "B46-SBS" + | "B46+" + | "B47" + | "B48" + | "B49" + | "B52" + | "B54" + | "B57" + | "B60" + | "B61" + | "B62" + | "B63" + | "B64" + | "B65" + | "B67" + | "B68" + | "B69" + | "B70" + | "B74" + | "B82" + | "B82-SBS" + | "B82+" + | "B83" + | "B84" + | "B90" + | "B93" + | "B94" + | "B96" + | "B98" + | "B99" + | "B101" + | "B102" + | "B106" + | "B111" + | "BEDLOOP" + | "BJ-MW" + | "Bx1" + | "BX1" + | "Bx2" + | "BX2" + | "Bx3" + | "BX3" + | "Bx4" + | "BX4" + | "Bx4A" + | "BX4A" + | "Bx5" + | "BX5" + | "Bx6" + | "BX6" + | "Bx6-SBS" + | "BX6+" + | "Bx7" + | "BX7" + | "Bx8" + | "BX8" + | "Bx9" + | "BX9" + | "Bx10" + | "BX10" + | "Bx11" + | "BX11" + | "Bx12" + | "BX12" + | "Bx12-SBS" + | "BX12+" + | "Bx13" + | "BX13" + | "Bx15" + | "BX15" + | "Bx16" + | "BX16" + | "Bx17" + | "BX17" + | "Bx18A" + | "BX18A" + | "Bx18B" + | "BX18B" + | "Bx19" + | "BX19" + | "Bx20" + | "BX20" + | "Bx21" + | "BX21" + | "Bx22" + | "BX22" + | "Bx24" + | "BX24" + | "Bx25" + | "BX25" + | "Bx26" + | "BX26" + | "Bx27" + | "BX27" + | "Bx28" + | "BX28" + | "Bx29" + | "BX29" + | "Bx30" + | "BX30" + | "Bx31" + | "BX31" + | "Bx32" + | "BX32" + | "Bx33" + | "BX33" + | "Bx34" + | "BX34" + | "Bx35" + | "BX35" + | "Bx36" + | "BX36" + | "Bx38" + | "BX38" + | "Bx39" + | "BX39" + | "Bx40" + | "BX40" + | "Bx41" + | "BX41" + | "Bx41-SBS" + | "BX41+" + | "Bx42" + | "BX42" + | "Bx46" + | "BX46" + | "Bx90" + | "BX90" + | "BX92" + | "BX95" + | "D90" + | "D99" + | "F1" + | "J90" + | "J99" + | "L90" + | "L91" + | "L92" + | "L0202" + | "L0719" + | "L1227" + | "M1" | "M2" | "M3" | "M4" @@ -174,8 +660,10 @@ export type KnownBusRoute = | "M86" | "M86-SBS" | "M86+" + | "M90" | "M96" | "M98" + | "M100" | "M101" | "M102" | "M103" @@ -183,6 +671,138 @@ export type KnownBusRoute = | "M106" | "M116" | "M125" + | "M191" + | "MW-ML" + | "Q1" + | "Q2" + | "Q3" + | "Q4" + | "Q5" + | "Q12" + | "Q13" + | "Q14" + | "Q15" + | "Q16" + | "Q17" + | "Q20" + | "Q24" + | "Q27" + | "Q29" + | "Q30" + | "Q31" + | "Q36" + | "Q38" + | "Q39" + | "Q42" + | "Q43" + | "Q44" + | "Q44-SBS" + | "Q44+" + | "Q45" + | "Q46" + | "Q48" + | "Q54" + | "Q55" + | "Q56" + | "Q58" + | "Q59" + | "Q61" + | "Q67" + | "Q75" + | "Q76" + | "Q77" + | "Q82" + | "Q83" + | "Q84" + | "Q85" + | "Q86" + | "Q87" + | "Q88" + | "Q89" + | "Q90" + | "Q92" + | "Q93" + | "Q96" + | "Q97" + | "Q98" + | "Q107" + | "Q108" + | "Q109" + | "Q121" + | "QM63" + | "QM64" + | "QM68" + | "S40" + | "S42" + | "S44" + | "S46" + | "S48" + | "S51" + | "S52" + | "S53" + | "S54" + | "S55" + | "S56" + | "S57" + | "S59" + | "S61" + | "S62" + | "S66" + | "S74" + | "S76" + | "S78" + | "S79" + | "S79-SBS" + | "S79+" + | "S81" + | "S84" + | "S86" + | "S89" + | "S90" + | "S91" + | "S92" + | "S93" + | "S94" + | "S96" + | "S96B1" + | "S96B2" + | "S96B3" + | "S98" + | "SIM1" + | "SIM1C" + | "SIM2" + | "SIM3" + | "SIM3C" + | "SIM4" + | "SIM4C" + | "SIM4X" + | "SIM5" + | "SIM6" + | "SIM7" + | "SIM8" + | "SIM8X" + | "SIM9" + | "SIM10" + | "SIM11" + | "SIM15" + | "SIM22" + | "SIM23" + | "SIM24" + | "SIM25" + | "SIM26" + | "SIM30" + | "SIM31" + | "SIM32" + | "SIM33" + | "SIM33C" + | "SIM34" + | "SIM35" + | "T113" + | "T426" + | "X27" + | "X28" + | "X37" + | "X38" export type KnownStopId = "101"