Skip to main content

rumdl_lib/
linguist_data.rs

1//! GitHub Linguist language data
2//!
3//! Auto-generated from GitHub Linguist languages.yml
4//! Linguist commit: e51c2270 (2026-01-14)
5//!
6//! The `KNOWN_EXTENSIONS` and `SOURCE_CODE_EXTENSIONS` sets are generated by
7//! the committed `scripts/gen_linguist_extensions.py` from the same pinned
8//! languages.yml.
9//! The alias maps predate that script; their generator was not committed, so
10//! regenerating them means rewriting it (and folding the manual additions
11//! below back in or bumping the pin past them).
12//!
13//! Manual addition on top of the e51c2270 generation: `py` and `py3` as aliases
14//! for Python in both `ALIAS_TO_CANONICAL` and `CANONICAL_TO_ALIASES`. Upstream
15//! added these in commit 6fc1cc65b3 ("Add `py` and `py3` to Python aliases",
16//! PR #7791, merged 2026-03-02), after the e51c2270 pin (2026-01-14), so a
17//! regeneration from that pinned commit alone would not include them.
18
19use std::collections::{HashMap, HashSet};
20use std::sync::LazyLock;
21
22/// Linguist commit hash this data was generated from
23pub const LINGUIST_VERSION: &str = "e51c2270";
24
25/// Linguist commit date
26pub const LINGUIST_DATE: &str = "2026-01-14";
27
28/// Maps lowercase alias -> canonical language name
29pub static ALIAS_TO_CANONICAL: LazyLock<HashMap<&'static str, &'static str>> = LazyLock::new(|| {
30    let mut m = HashMap::with_capacity(1210);
31    m.insert("1c enterprise", "1C Enterprise");
32    m.insert("2-dimensional array", "2-Dimensional Array");
33    m.insert("4d", "4D");
34    m.insert("abap", "ABAP");
35    m.insert("abap cds", "ABAP CDS");
36    m.insert("abl", "OpenEdge ABL");
37    m.insert("abnf", "ABNF");
38    m.insert("abuild", "Shell");
39    m.insert("acfm", "Adobe Font Metrics");
40    m.insert("ackrc", "Option List");
41    m.insert("aconf", "ApacheConf");
42    m.insert("actionscript", "ActionScript");
43    m.insert("actionscript 3", "ActionScript");
44    m.insert("actionscript3", "ActionScript");
45    m.insert("ad block", "Adblock Filter List");
46    m.insert("ad block filters", "Adblock Filter List");
47    m.insert("ada", "Ada");
48    m.insert("ada2005", "Ada");
49    m.insert("ada95", "Ada");
50    m.insert("adb", "Adblock Filter List");
51    m.insert("adblock", "Adblock Filter List");
52    m.insert("adblock filter list", "Adblock Filter List");
53    m.insert("adobe composite font metrics", "Adobe Font Metrics");
54    m.insert("adobe font metrics", "Adobe Font Metrics");
55    m.insert("adobe multiple font metrics", "Adobe Font Metrics");
56    m.insert("advpl", "xBase");
57    m.insert("afdko", "OpenType Feature File");
58    m.insert("agda", "Agda");
59    m.insert("ags", "AGS Script");
60    m.insert("ags script", "AGS Script");
61    m.insert("ahk", "AutoHotkey");
62    m.insert("aidl", "AIDL");
63    m.insert("aiken", "Aiken");
64    m.insert("al", "AL");
65    m.insert("algol", "ALGOL");
66    m.insert("alloy", "Alloy");
67    m.insert("alpine abuild", "Shell");
68    m.insert("altium", "Altium Designer");
69    m.insert("altium designer", "Altium Designer");
70    m.insert("amfm", "Adobe Font Metrics");
71    m.insert("ampl", "AMPL");
72    m.insert("amusewiki", "Muse");
73    m.insert("angelscript", "AngelScript");
74    m.insert("answer set programming", "Answer Set Programming");
75    m.insert("ant build system", "Ant Build System");
76    m.insert("antlers", "Antlers");
77    m.insert("antlr", "ANTLR");
78    m.insert("apache", "ApacheConf");
79    m.insert("apacheconf", "ApacheConf");
80    m.insert("apex", "Apex");
81    m.insert("api blueprint", "API Blueprint");
82    m.insert("apkbuild", "Shell");
83    m.insert("apl", "APL");
84    m.insert("apollo guidance computer", "Assembly");
85    m.insert("applescript", "AppleScript");
86    m.insert("arc", "Arc");
87    m.insert("arexx", "REXX");
88    m.insert("as3", "ActionScript");
89    m.insert("ascii stl", "STL");
90    m.insert("asciidoc", "AsciiDoc");
91    m.insert("asl", "ASL");
92    m.insert("asm", "Assembly");
93    m.insert("asn.1", "ASN.1");
94    m.insert("asp", "Classic ASP");
95    m.insert("asp.net", "ASP.NET");
96    m.insert("aspectj", "AspectJ");
97    m.insert("aspx", "ASP.NET");
98    m.insert("aspx-vb", "ASP.NET");
99    m.insert("assembly", "Assembly");
100    m.insert("astro", "Astro");
101    m.insert("asymptote", "Asymptote");
102    m.insert("ats", "ATS");
103    m.insert("ats2", "ATS");
104    m.insert("au3", "AutoIt");
105    m.insert("augeas", "Augeas");
106    m.insert("autoconf", "M4");
107    m.insert("autohotkey", "AutoHotkey");
108    m.insert("autoit", "AutoIt");
109    m.insert("autoit3", "AutoIt");
110    m.insert("autoitscript", "AutoIt");
111    m.insert("avro idl", "Avro IDL");
112    m.insert("awk", "Awk");
113    m.insert("b (formal method)", "B (Formal Method)");
114    m.insert("b3d", "BlitzBasic");
115    m.insert("b4x", "B4X");
116    m.insert("ballerina", "Ballerina");
117    m.insert("bash", "Shell");
118    m.insert("bash session", "ShellSession");
119    m.insert("basic", "BASIC");
120    m.insert("basic for android", "B4X");
121    m.insert("bat", "Batchfile");
122    m.insert("batch", "Batchfile");
123    m.insert("batchfile", "Batchfile");
124    m.insert("bazel", "Starlark");
125    m.insert("be", "Berry");
126    m.insert("beef", "Beef");
127    m.insert("befunge", "Befunge");
128    m.insert("berry", "Berry");
129    m.insert("bh", "Bluespec");
130    m.insert("bibtex", "TeX");
131    m.insert("bibtex style", "BibTeX Style");
132    m.insert("bicep", "Bicep");
133    m.insert("bikeshed", "Bikeshed");
134    m.insert("bison", "Yacc");
135    m.insert("bitbake", "BitBake");
136    m.insert("blade", "Blade");
137    m.insert("blitz3d", "BlitzBasic");
138    m.insert("blitzbasic", "BlitzBasic");
139    m.insert("blitzmax", "BlitzMax");
140    m.insert("blitzplus", "BlitzBasic");
141    m.insert("bluespec", "Bluespec");
142    m.insert("bluespec bh", "Bluespec");
143    m.insert("bluespec bsv", "Bluespec");
144    m.insert("bluespec classic", "Bluespec");
145    m.insert("bmax", "BlitzMax");
146    m.insert("boo", "Boo");
147    m.insert("boogie", "Boogie");
148    m.insert("bplus", "BlitzBasic");
149    m.insert("bqn", "BQN");
150    m.insert("brainfuck", "Brainfuck");
151    m.insert("brighterscript", "BrighterScript");
152    m.insert("brightscript", "Brightscript");
153    m.insert("bro", "Zeek");
154    m.insert("browserslist", "Browserslist");
155    m.insert("bru", "Bru");
156    m.insert("bsdmake", "Makefile");
157    m.insert("bsv", "Bluespec");
158    m.insert("buildstream", "BuildStream");
159    m.insert("byond", "DM");
160    m.insert("bzl", "Starlark");
161    m.insert("c", "C");
162    m.insert("c#", "C#");
163    m.insert("c++", "C++");
164    m.insert("c++-objdump", "Cpp-ObjDump");
165    m.insert("c-objdump", "C-ObjDump");
166    m.insert("c2hs", "Haskell");
167    m.insert("c2hs haskell", "Haskell");
168    m.insert("c3", "C3");
169    m.insert("cabal", "Cabal Config");
170    m.insert("cabal config", "Cabal Config");
171    m.insert("caddy", "Caddyfile");
172    m.insert("caddyfile", "Caddyfile");
173    m.insert("cadence", "Cadence");
174    m.insert("cairo", "Cairo");
175    m.insert("cairo zero", "Cairo");
176    m.insert("cake", "C#");
177    m.insert("cakescript", "C#");
178    m.insert("cameligo", "LigoLANG");
179    m.insert("cangjie", "Cangjie");
180    m.insert("cap cds", "CAP CDS");
181    m.insert("cap'n proto", "Cap'n Proto");
182    m.insert("carbon", "Carbon");
183    m.insert("carto", "CartoCSS");
184    m.insert("cartocss", "CartoCSS");
185    m.insert("cds", "CAP CDS");
186    m.insert("ceylon", "Ceylon");
187    m.insert("cfc", "ColdFusion");
188    m.insert("cfm", "ColdFusion");
189    m.insert("cfml", "ColdFusion");
190    m.insert("chapel", "Chapel");
191    m.insert("charity", "Charity");
192    m.insert("checksum", "Checksums");
193    m.insert("checksums", "Checksums");
194    m.insert("chpl", "Chapel");
195    m.insert("chuck", "ChucK");
196    m.insert("cil", "CIL");
197    m.insert("circom", "Circom");
198    m.insert("cirru", "Cirru");
199    m.insert("clarion", "Clarion");
200    m.insert("clarity", "Clarity");
201    m.insert("classic asp", "Classic ASP");
202    m.insert("classic qbasic", "QuickBASIC");
203    m.insert("classic quickbasic", "QuickBASIC");
204    m.insert("classic visual basic", "Visual Basic 6.0");
205    m.insert("clean", "Clean");
206    m.insert("click", "Click");
207    m.insert("clipper", "xBase");
208    m.insert("clips", "CLIPS");
209    m.insert("clojure", "Clojure");
210    m.insert("closure templates", "Closure Templates");
211    m.insert("cloud firestore security rules", "Cloud Firestore Security Rules");
212    m.insert("clue", "Clue");
213    m.insert("cmake", "CMake");
214    m.insert("cobol", "COBOL");
215    m.insert("coccinelle", "SmPL");
216    m.insert("codeowners", "CODEOWNERS");
217    m.insert("codeql", "CodeQL");
218    m.insert("coffee", "CoffeeScript");
219    m.insert("coffee-script", "CoffeeScript");
220    m.insert("coffeescript", "CoffeeScript");
221    m.insert("coldfusion", "ColdFusion");
222    m.insert("coldfusion cfc", "ColdFusion");
223    m.insert("coldfusion html", "ColdFusion");
224    m.insert("collada", "COLLADA");
225    m.insert("commit", "Git Commit");
226    m.insert("common lisp", "Common Lisp");
227    m.insert("common workflow language", "Common Workflow Language");
228    m.insert("component pascal", "Component Pascal");
229    m.insert("conll", "CoNLL-U");
230    m.insert("conll-u", "CoNLL-U");
231    m.insert("conll-x", "CoNLL-U");
232    m.insert("console", "ShellSession");
233    m.insert("containerfile", "Dockerfile");
234    m.insert("cooklang", "Cooklang");
235    m.insert("cool", "Cool");
236    m.insert("coq", "Rocq Prover");
237    m.insert("cperl", "Perl");
238    m.insert("cpp", "C++");
239    m.insert("cpp-objdump", "Cpp-ObjDump");
240    m.insert("cql", "CQL");
241    m.insert("creole", "Creole");
242    m.insert("cron", "crontab");
243    m.insert("cron table", "crontab");
244    m.insert("crontab", "crontab");
245    m.insert("crystal", "Crystal");
246    m.insert("csharp", "C#");
247    m.insert("cson", "CSON");
248    m.insert("csound", "Csound");
249    m.insert("csound document", "Csound Document");
250    m.insert("csound score", "Csound Score");
251    m.insert("csound-csd", "Csound Document");
252    m.insert("csound-orc", "Csound");
253    m.insert("csound-sco", "Csound Score");
254    m.insert("css", "CSS");
255    m.insert("csv", "CSV");
256    m.insert("cucumber", "Gherkin");
257    m.insert("cuda", "Cuda");
258    m.insert("cue", "CUE");
259    m.insert("cue sheet", "Cue Sheet");
260    m.insert("curl config", "INI");
261    m.insert("curlrc", "INI");
262    m.insert("curry", "Curry");
263    m.insert("cweb", "CWeb");
264    m.insert("cwl", "Common Workflow Language");
265    m.insert("cycript", "Cycript");
266    m.insert("cylc", "INI");
267    m.insert("cypher", "Cypher");
268    m.insert("cython", "Cython");
269    m.insert("d", "D");
270    m.insert("d-objdump", "D-ObjDump");
271    m.insert("d2", "D2");
272    m.insert("d2lang", "D2");
273    m.insert("dafny", "Dafny");
274    m.insert("darcs patch", "Darcs Patch");
275    m.insert("dart", "Dart");
276    m.insert("daslang", "Daslang");
277    m.insert("dataweave", "DataWeave");
278    m.insert("dcl", "DIGITAL Command Language");
279    m.insert("debian package control file", "Debian Package Control File");
280    m.insert("delphi", "Pascal");
281    m.insert("denizenscript", "DenizenScript");
282    m.insert("desktop", "desktop");
283    m.insert("dhall", "Dhall");
284    m.insert("diff", "Diff");
285    m.insert("digital command language", "DIGITAL Command Language");
286    m.insert("dircolors", "dircolors");
287    m.insert("directx 3d file", "DirectX 3D File");
288    m.insert("django", "Jinja");
289    m.insert("dlang", "D");
290    m.insert("dm", "DM");
291    m.insert("dns zone", "DNS Zone");
292    m.insert("dockerfile", "Dockerfile");
293    m.insert("dogescript", "Dogescript");
294    m.insert("dosbatch", "Batchfile");
295    m.insert("dosini", "INI");
296    m.insert("dotenv", "Dotenv");
297    m.insert("dpatch", "Darcs Patch");
298    m.insert("dtrace", "DTrace");
299    m.insert("dtrace-script", "DTrace");
300    m.insert("dune", "Dune");
301    m.insert("dylan", "Dylan");
302    m.insert("e", "E");
303    m.insert("e-mail", "E-mail");
304    m.insert("eagle", "Eagle");
305    m.insert("earthfile", "Earthly");
306    m.insert("earthly", "Earthly");
307    m.insert("easybuild", "Python");
308    m.insert("ebnf", "EBNF");
309    m.insert("ec", "eC");
310    m.insert("ecere projects", "JavaScript");
311    m.insert("ecl", "ECL");
312    m.insert("eclipse", "Prolog");
313    m.insert("ecmarkdown", "HTML");
314    m.insert("ecmarkup", "HTML");
315    m.insert("ecr", "HTML");
316    m.insert("edge", "Edge");
317    m.insert("edgeql", "EdgeQL");
318    m.insert("editor-config", "INI");
319    m.insert("editorconfig", "INI");
320    m.insert("edje data collection", "Edje Data Collection");
321    m.insert("edn", "edn");
322    m.insert("eeschema schematic", "KiCad Schematic");
323    m.insert("eex", "HTML");
324    m.insert("eiffel", "Eiffel");
325    m.insert("ejs", "EJS");
326    m.insert("electronic business card", "vCard");
327    m.insert("elisp", "Emacs Lisp");
328    m.insert("elixir", "Elixir");
329    m.insert("elm", "Elm");
330    m.insert("elvish", "Elvish");
331    m.insert("elvish transcript", "Elvish");
332    m.insert("emacs", "Emacs Lisp");
333    m.insert("emacs lisp", "Emacs Lisp");
334    m.insert("emacs muse", "Muse");
335    m.insert("email", "E-mail");
336    m.insert("emberscript", "EmberScript");
337    m.insert("eml", "E-mail");
338    m.insert("envrc", "Shell");
339    m.insert("eq", "EQ");
340    m.insert("erb", "HTML");
341    m.insert("erlang", "Erlang");
342    m.insert("esdl", "EdgeQL");
343    m.insert("euphoria", "Euphoria");
344    m.insert("f#", "F#");
345    m.insert("f*", "F*");
346    m.insert("factor", "Factor");
347    m.insert("fancy", "Fancy");
348    m.insert("fantom", "Fantom");
349    m.insert("faust", "Faust");
350    m.insert("fb", "FreeBASIC");
351    m.insert("fennel", "Fennel");
352    m.insert("figfont", "FIGlet Font");
353    m.insert("figlet font", "FIGlet Font");
354    m.insert("filebench wml", "Filebench WML");
355    m.insert("filterscript", "RenderScript");
356    m.insert("firrtl", "FIRRTL");
357    m.insert("fish", "Shell");
358    m.insert("flex", "Lex");
359    m.insert("flix", "Flix");
360    m.insert("fluent", "Fluent");
361    m.insert("flux", "FLUX");
362    m.insert("formatted", "Formatted");
363    m.insert("forth", "Forth");
364    m.insert("fortran", "Fortran");
365    m.insert("fortran free form", "Fortran");
366    m.insert("foxpro", "xBase");
367    m.insert("freebasic", "FreeBASIC");
368    m.insert("freemarker", "FreeMarker");
369    m.insert("frege", "Frege");
370    m.insert("fsharp", "F#");
371    m.insert("fstar", "F*");
372    m.insert("ftl", "FreeMarker");
373    m.insert("fundamental", "Text");
374    m.insert("futhark", "Futhark");
375    m.insert("g-code", "G-code");
376    m.insert("game maker language", "Game Maker Language");
377    m.insert("gaml", "GAML");
378    m.insert("gams", "GAMS");
379    m.insert("gap", "GAP");
380    m.insert("gas", "Assembly");
381    m.insert("gcc machine description", "GCC Machine Description");
382    m.insert("gdb", "GDB");
383    m.insert("gdscript", "GDScript");
384    m.insert("gdshader", "GDShader");
385    m.insert("gedcom", "GEDCOM");
386    m.insert("gemfile.lock", "Gemfile.lock");
387    m.insert("gemini", "Gemini");
388    m.insert("gemtext", "Gemini");
389    m.insert("genero 4gl", "Genero 4gl");
390    m.insert("genero per", "Genero per");
391    m.insert("genie", "Genie");
392    m.insert("genshi", "Genshi");
393    m.insert("gentoo ebuild", "Shell");
394    m.insert("gentoo eclass", "Shell");
395    m.insert("geojson", "JSON");
396    m.insert("gerber image", "Gerber Image");
397    m.insert("gettext catalog", "Gettext Catalog");
398    m.insert("gf", "Grammatical Framework");
399    m.insert("gherkin", "Gherkin");
400    m.insert("git attributes", "Git Attributes");
401    m.insert("git blame ignore revs", "Git Revision List");
402    m.insert("git commit", "Git Commit");
403    m.insert("git config", "INI");
404    m.insert("git revision list", "Git Revision List");
405    m.insert("git-ignore", "Ignore List");
406    m.insert("gitattributes", "Git Attributes");
407    m.insert("gitconfig", "INI");
408    m.insert("gitignore", "Ignore List");
409    m.insert("gitmodules", "INI");
410    m.insert("gjs", "JavaScript");
411    m.insert("gleam", "Gleam");
412    m.insert("glimmer js", "JavaScript");
413    m.insert("glimmer ts", "TypeScript");
414    m.insert("glsl", "GLSL");
415    m.insert("glyph", "Glyph");
416    m.insert("glyph bitmap distribution format", "Glyph Bitmap Distribution Format");
417    m.insert("gn", "GN");
418    m.insert("gnu asm", "Assembly");
419    m.insert("gnuplot", "Gnuplot");
420    m.insert("go", "Go");
421    m.insert("go checksums", "Go Checksums");
422    m.insert("go mod", "Go Module");
423    m.insert("go module", "Go Module");
424    m.insert("go sum", "Go Checksums");
425    m.insert("go template", "Go Template");
426    m.insert("go work", "Go Workspace");
427    m.insert("go work sum", "Go Checksums");
428    m.insert("go workspace", "Go Workspace");
429    m.insert("go.mod", "Go Module");
430    m.insert("go.sum", "Go Checksums");
431    m.insert("go.work", "Go Workspace");
432    m.insert("go.work.sum", "Go Checksums");
433    m.insert("godot resource", "Godot Resource");
434    m.insert("golang", "Go");
435    m.insert("golo", "Golo");
436    m.insert("gosu", "Gosu");
437    m.insert("gotmpl", "Go Template");
438    m.insert("grace", "Grace");
439    m.insert("gradle", "Gradle");
440    m.insert("gradle kotlin dsl", "Gradle");
441    m.insert("grammatical framework", "Grammatical Framework");
442    m.insert("graph modeling language", "Graph Modeling Language");
443    m.insert("graphql", "GraphQL");
444    m.insert("graphviz (dot)", "Graphviz (DOT)");
445    m.insert("groff", "Roff");
446    m.insert("groovy", "Groovy");
447    m.insert("groovy server pages", "Groovy");
448    m.insert("gsc", "GSC");
449    m.insert("gsp", "Groovy");
450    m.insert("gts", "TypeScript");
451    m.insert("hack", "Hack");
452    m.insert("haml", "Haml");
453    m.insert("handlebars", "Handlebars");
454    m.insert("haproxy", "HAProxy");
455    m.insert("harbour", "Harbour");
456    m.insert("hare", "Hare");
457    m.insert("hash", "Checksums");
458    m.insert("hashes", "Checksums");
459    m.insert("hashicorp configuration language", "HCL");
460    m.insert("haskell", "Haskell");
461    m.insert("haxe", "Haxe");
462    m.insert("hbs", "Handlebars");
463    m.insert("hcl", "HCL");
464    m.insert("heex", "HTML");
465    m.insert("help", "Vim Help File");
466    m.insert("hip", "HIP");
467    m.insert("hiveql", "HiveQL");
468    m.insert("hls playlist", "M3U");
469    m.insert("hlsl", "HLSL");
470    m.insert("hocon", "HOCON");
471    m.insert("holyc", "HolyC");
472    m.insert("hoon", "hoon");
473    m.insert("hosts", "Hosts File");
474    m.insert("hosts file", "Hosts File");
475    m.insert("html", "HTML");
476    m.insert("html+django", "Jinja");
477    m.insert("html+ecr", "HTML");
478    m.insert("html+eex", "HTML");
479    m.insert("html+erb", "HTML");
480    m.insert("html+jinja", "Jinja");
481    m.insert("html+php", "HTML");
482    m.insert("html+razor", "HTML");
483    m.insert("html+ruby", "HTML");
484    m.insert("htmlbars", "Handlebars");
485    m.insert("htmldjango", "Jinja");
486    m.insert("http", "HTTP");
487    m.insert("hurl", "Hurl");
488    m.insert("hxml", "HXML");
489    m.insert("hy", "Hy");
490    m.insert("hylang", "Hy");
491    m.insert("hyphy", "HyPhy");
492    m.insert("i7", "Inform 7");
493    m.insert("ical", "iCalendar");
494    m.insert("icalendar", "iCalendar");
495    m.insert("idl", "IDL");
496    m.insert("idris", "Idris");
497    m.insert("ignore", "Ignore List");
498    m.insert("ignore list", "Ignore List");
499    m.insert("igor", "IGOR Pro");
500    m.insert("igor pro", "IGOR Pro");
501    m.insert("igorpro", "IGOR Pro");
502    m.insert("ijm", "ImageJ Macro");
503    m.insert("ile rpg", "RPGLE");
504    m.insert("imagej macro", "ImageJ Macro");
505    m.insert("imba", "Imba");
506    m.insert("inc", "PHP");
507    m.insert("inform 7", "Inform 7");
508    m.insert("inform7", "Inform 7");
509    m.insert("ini", "INI");
510    m.insert("ink", "Ink");
511    m.insert("inno setup", "Inno Setup");
512    m.insert("inputrc", "INI");
513    m.insert("io", "Io");
514    m.insert("ioke", "Ioke");
515    m.insert("ipython notebook", "Jupyter Notebook");
516    m.insert("irc", "IRC log");
517    m.insert("irc log", "IRC log");
518    m.insert("irc logs", "IRC log");
519    m.insert("isabelle", "Isabelle");
520    m.insert("isabelle root", "Isabelle");
521    m.insert("ispc", "ISPC");
522    m.insert("j", "J");
523    m.insert("jac", "Jac");
524    m.insert("jai", "Jai");
525    m.insert("janet", "Janet");
526    m.insert("jar manifest", "JAR Manifest");
527    m.insert("jasmin", "Jasmin");
528    m.insert("java", "Java");
529    m.insert("java properties", "Java Properties");
530    m.insert("java server page", "Groovy");
531    m.insert("java server pages", "Java");
532    m.insert("java template engine", "Java");
533    m.insert("javascript", "JavaScript");
534    m.insert("javascript+erb", "JavaScript");
535    m.insert("jcl", "JCL");
536    m.insert("jest snapshot", "Jest Snapshot");
537    m.insert("jetbrains mps", "JetBrains MPS");
538    m.insert("jflex", "Lex");
539    m.insert("jinja", "Jinja");
540    m.insert("jison", "Yacc");
541    m.insert("jison lex", "Lex");
542    m.insert("jolie", "Jolie");
543    m.insert("jq", "jq");
544    m.insert("jruby", "Ruby");
545    m.insert("js", "JavaScript");
546    m.insert("json", "JSON");
547    m.insert("json with comments", "JSON");
548    m.insert("json5", "JSON5");
549    m.insert("jsonc", "JSON");
550    m.insert("jsoniq", "JSONiq");
551    m.insert("jsonl", "JSON");
552    m.insert("jsonld", "JSONLD");
553    m.insert("jsonnet", "Jsonnet");
554    m.insert("jsp", "Java");
555    m.insert("jte", "Java");
556    m.insert("julia", "Julia");
557    m.insert("julia repl", "Julia");
558    m.insert("jupyter notebook", "Jupyter Notebook");
559    m.insert("just", "Just");
560    m.insert("justfile", "Just");
561    m.insert("kaitai struct", "Kaitai Struct");
562    m.insert("kak", "KakouneScript");
563    m.insert("kakounescript", "KakouneScript");
564    m.insert("kakscript", "KakouneScript");
565    m.insert("kcl", "KCL");
566    m.insert("kdl", "KDL");
567    m.insert("kerboscript", "KerboScript");
568    m.insert("keyvalues", "Valve Data Format");
569    m.insert("kframework", "KFramework");
570    m.insert("kicad layout", "KiCad Layout");
571    m.insert("kicad legacy layout", "KiCad Legacy Layout");
572    m.insert("kicad schematic", "KiCad Schematic");
573    m.insert("kickstart", "Kickstart");
574    m.insert("kit", "Kit");
575    m.insert("koka", "Koka");
576    m.insert("kolmafia ash", "KoLmafia ASH");
577    m.insert("kotlin", "Kotlin");
578    m.insert("krl", "KRL");
579    m.insert("ksy", "Kaitai Struct");
580    m.insert("kusto", "Kusto");
581    m.insert("kvlang", "kvlang");
582    m.insert("labview", "LabVIEW");
583    m.insert("lambdapi", "Lambdapi");
584    m.insert("langium", "Langium");
585    m.insert("lark", "Lark");
586    m.insert("lasso", "Lasso");
587    m.insert("lassoscript", "Lasso");
588    m.insert("latex", "TeX");
589    m.insert("latte", "Latte");
590    m.insert("lean", "Lean");
591    m.insert("lean 4", "Lean");
592    m.insert("lean4", "Lean");
593    m.insert("leex", "HTML");
594    m.insert("leo", "Leo");
595    m.insert("less", "Less");
596    m.insert("less-css", "Less");
597    m.insert("lex", "Lex");
598    m.insert("lfe", "LFE");
599    m.insert("lhaskell", "Haskell");
600    m.insert("lhs", "Haskell");
601    m.insert("ligolang", "LigoLANG");
602    m.insert("lilypond", "LilyPond");
603    m.insert("limbo", "Limbo");
604    m.insert("linear programming", "Linear Programming");
605    m.insert("linker script", "Linker Script");
606    m.insert("linux kernel module", "Linux Kernel Module");
607    m.insert("liquid", "Liquid");
608    m.insert("lisp", "Common Lisp");
609    m.insert("litcoffee", "CoffeeScript");
610    m.insert("literate agda", "Agda");
611    m.insert("literate coffeescript", "CoffeeScript");
612    m.insert("literate haskell", "Haskell");
613    m.insert("live-script", "LiveScript");
614    m.insert("livecode script", "LiveCode Script");
615    m.insert("livescript", "LiveScript");
616    m.insert("llvm", "LLVM");
617    m.insert("logos", "Logos");
618    m.insert("logtalk", "Logtalk");
619    m.insert("lolcode", "LOLCODE");
620    m.insert("lookml", "LookML");
621    m.insert("loomscript", "LoomScript");
622    m.insert("ls", "LiveScript");
623    m.insert("lsl", "LSL");
624    m.insert("ltspice symbol", "LTspice Symbol");
625    m.insert("lua", "Lua");
626    m.insert("luau", "Luau");
627    m.insert("m", "M");
628    m.insert("m2", "Macaulay2");
629    m.insert("m3u", "M3U");
630    m.insert("m3u playlist", "M3U");
631    m.insert("m4", "M4");
632    m.insert("m4sugar", "M4");
633    m.insert("m68k", "Assembly");
634    m.insert("macaulay2", "Macaulay2");
635    m.insert("macruby", "Ruby");
636    m.insert("mail", "E-mail");
637    m.insert("make", "Makefile");
638    m.insert("makefile", "Makefile");
639    m.insert("mako", "Mako");
640    m.insert("man", "Roff");
641    m.insert("man page", "Roff");
642    m.insert("man-page", "Roff");
643    m.insert("manpage", "Roff");
644    m.insert("markdown", "Markdown");
645    m.insert("marko", "Marko");
646    m.insert("markojs", "Marko");
647    m.insert("mask", "Mask");
648    m.insert("mathematica", "Wolfram Language");
649    m.insert("mathematical programming system", "Mathematical Programming System");
650    m.insert("matlab", "MATLAB");
651    m.insert("maven pom", "XML");
652    m.insert("max", "Max");
653    m.insert("max/msp", "Max");
654    m.insert("maxmsp", "Max");
655    m.insert("maxscript", "MAXScript");
656    m.insert("mbox", "E-mail");
657    m.insert("mcfunction", "mcfunction");
658    m.insert("md", "Markdown");
659    m.insert("mdoc", "Roff");
660    m.insert("mdsvex", "mdsvex");
661    m.insert("mdx", "MDX");
662    m.insert("mediawiki", "Wikitext");
663    m.insert("mercury", "Mercury");
664    m.insert("mermaid", "Mermaid");
665    m.insert("mermaid example", "Mermaid");
666    m.insert("meson", "Meson");
667    m.insert("metal", "Metal");
668    m.insert("mf", "Makefile");
669    m.insert(
670        "microsoft developer studio project",
671        "Microsoft Developer Studio Project",
672    );
673    m.insert("microsoft visual studio solution", "Microsoft Visual Studio Solution");
674    m.insert("minid", "MiniD");
675    m.insert("miniyaml", "MiniYAML");
676    m.insert("minizinc", "MiniZinc");
677    m.insert("minizinc data", "MiniZinc Data");
678    m.insert("mint", "Mint");
679    m.insert("mirah", "Mirah");
680    m.insert("mirc script", "mIRC Script");
681    m.insert("mlir", "MLIR");
682    m.insert("mma", "Wolfram Language");
683    m.insert("modelica", "Modelica");
684    m.insert("modula-2", "Modula-2");
685    m.insert("modula-3", "Modula-3");
686    m.insert("module management system", "Module Management System");
687    m.insert("mojo", "Mojo");
688    m.insert("monkey", "Monkey");
689    m.insert("monkey c", "Monkey C");
690    m.insert("moocode", "Moocode");
691    m.insert("moonbit", "MoonBit");
692    m.insert("moonscript", "MoonScript");
693    m.insert("motoko", "Motoko");
694    m.insert("motorola 68k assembly", "Assembly");
695    m.insert("move", "Move");
696    m.insert("mps", "JetBrains MPS");
697    m.insert("mql4", "MQL4");
698    m.insert("mql5", "MQL5");
699    m.insert("mtml", "MTML");
700    m.insert("muf", "Forth");
701    m.insert("mumps", "M");
702    m.insert("mupad", "mupad");
703    m.insert("muse", "Muse");
704    m.insert("mustache", "Mustache");
705    m.insert("myghty", "Myghty");
706    m.insert("nanorc", "INI");
707    m.insert("nargo", "Noir");
708    m.insert("nasal", "Nasal");
709    m.insert("nasl", "NASL");
710    m.insert("nasm", "Assembly");
711    m.insert("ncl", "NCL");
712    m.insert("ne-on", "NEON");
713    m.insert("nearley", "Nearley");
714    m.insert("nemerle", "Nemerle");
715    m.insert("neon", "NEON");
716    m.insert("neosnippet", "Vim Snippet");
717    m.insert("nesc", "nesC");
718    m.insert("netlinx", "NetLinx");
719    m.insert("netlinx+erb", "NetLinx+ERB");
720    m.insert("netlogo", "NetLogo");
721    m.insert("nette object notation", "NEON");
722    m.insert("newlisp", "NewLisp");
723    m.insert("nextflow", "Nextflow");
724    m.insert("nginx", "Nginx");
725    m.insert("nginx configuration file", "Nginx");
726    m.insert("nickel", "Nickel");
727    m.insert("nim", "Nim");
728    m.insert("ninja", "Ninja");
729    m.insert("nit", "Nit");
730    m.insert("nix", "Nix");
731    m.insert("nixos", "Nix");
732    m.insert("njk", "Nunjucks");
733    m.insert("nl", "NL");
734    m.insert("nmodl", "NMODL");
735    m.insert("node", "JavaScript");
736    m.insert("noir", "Noir");
737    m.insert("npm config", "INI");
738    m.insert("npmrc", "INI");
739    m.insert("nroff", "Roff");
740    m.insert("nsis", "NSIS");
741    m.insert("nu", "Nu");
742    m.insert("nu-script", "Nushell");
743    m.insert("numpy", "Python");
744    m.insert("nunjucks", "Nunjucks");
745    m.insert("nush", "Nu");
746    m.insert("nushell", "Nushell");
747    m.insert("nushell-script", "Nushell");
748    m.insert("nvim", "Vim Script");
749    m.insert("nwscript", "NWScript");
750    m.insert("oasv2", "OpenAPI Specification v2");
751    m.insert("oasv2-json", "OpenAPI Specification v2");
752    m.insert("oasv2-yaml", "OpenAPI Specification v2");
753    m.insert("oasv3", "OpenAPI Specification v3");
754    m.insert("oasv3-json", "OpenAPI Specification v3");
755    m.insert("oasv3-yaml", "OpenAPI Specification v3");
756    m.insert("oberon", "Oberon");
757    m.insert("obj-c", "Objective-C");
758    m.insert("obj-c++", "Objective-C++");
759    m.insert("obj-j", "Objective-J");
760    m.insert("objc", "Objective-C");
761    m.insert("objc++", "Objective-C++");
762    m.insert("objdump", "ObjDump");
763    m.insert("object data instance notation", "Object Data Instance Notation");
764    m.insert("objective-c", "Objective-C");
765    m.insert("objective-c++", "Objective-C++");
766    m.insert("objective-j", "Objective-J");
767    m.insert("objectivec", "Objective-C");
768    m.insert("objectivec++", "Objective-C++");
769    m.insert("objectivej", "Objective-J");
770    m.insert("objectpascal", "Pascal");
771    m.insert("objectscript", "ObjectScript");
772    m.insert("objj", "Objective-J");
773    m.insert("ocaml", "OCaml");
774    m.insert("octave", "MATLAB");
775    m.insert("odin", "Odin");
776    m.insert("odin-lang", "Odin");
777    m.insert("odinlang", "Odin");
778    m.insert("omgrofl", "Omgrofl");
779    m.insert("omnet++ msg", "OMNeT++ MSG");
780    m.insert("omnet++ ned", "OMNeT++ NED");
781    m.insert("omnetpp-msg", "OMNeT++ MSG");
782    m.insert("omnetpp-ned", "OMNeT++ NED");
783    m.insert("oncrpc", "RPC");
784    m.insert("ooc", "ooc");
785    m.insert("opa", "Opa");
786    m.insert("opal", "Opal");
787    m.insert("open policy agent", "Open Policy Agent");
788    m.insert("openapi specification v2", "OpenAPI Specification v2");
789    m.insert("openapi specification v3", "OpenAPI Specification v3");
790    m.insert("opencl", "C");
791    m.insert("openedge", "OpenEdge ABL");
792    m.insert("openedge abl", "OpenEdge ABL");
793    m.insert("openqasm", "OpenQASM");
794    m.insert("openrc", "Shell");
795    m.insert("openrc runscript", "Shell");
796    m.insert("openscad", "OpenSCAD");
797    m.insert("openstep property list", "OpenStep Property List");
798    m.insert("opentofu", "HCL");
799    m.insert("opentype feature file", "OpenType Feature File");
800    m.insert("option list", "Option List");
801    m.insert("opts", "Option List");
802    m.insert("org", "Org");
803    m.insert("osascript", "AppleScript");
804    m.insert("overpassql", "OverpassQL");
805    m.insert("ox", "Ox");
806    m.insert("oxygene", "Oxygene");
807    m.insert("oz", "Oz");
808    m.insert("p4", "P4");
809    m.insert("pact", "Pact");
810    m.insert("pan", "Pan");
811    m.insert("pandoc", "Markdown");
812    m.insert("papyrus", "Papyrus");
813    m.insert("parrot", "Parrot");
814    m.insert("parrot assembly", "Parrot");
815    m.insert("parrot internal representation", "Parrot");
816    m.insert("pascal", "Pascal");
817    m.insert("pasm", "Parrot");
818    m.insert("pawn", "Pawn");
819    m.insert("pcbnew", "KiCad Layout");
820    m.insert("pddl", "PDDL");
821    m.insert("peg.js", "PEG.js");
822    m.insert("pep8", "Pep8");
823    m.insert("perl", "Perl");
824    m.insert("perl-6", "Raku");
825    m.insert("perl6", "Raku");
826    m.insert("php", "PHP");
827    m.insert("pic", "Roff");
828    m.insert("pickle", "Pickle");
829    m.insert("picolisp", "PicoLisp");
830    m.insert("piglatin", "PigLatin");
831    m.insert("pikchr", "Roff");
832    m.insert("pike", "Pike");
833    m.insert("pip requirements", "Pip Requirements");
834    m.insert("pir", "Parrot");
835    m.insert("pkl", "Pkl");
836    m.insert("plain text", "Text");
837    m.insert("plantuml", "PlantUML");
838    m.insert("plpgsql", "PLpgSQL");
839    m.insert("plsql", "PLSQL");
840    m.insert("pod", "Pod");
841    m.insert("pod 6", "Pod 6");
842    m.insert("pogoscript", "PogoScript");
843    m.insert("polar", "Polar");
844    m.insert("pony", "Pony");
845    m.insert("portugol", "Portugol");
846    m.insert("posh", "PowerShell");
847    m.insert("postcss", "CSS");
848    m.insert("postscr", "PostScript");
849    m.insert("postscript", "PostScript");
850    m.insert("pot", "Gettext Catalog");
851    m.insert("pov-ray", "POV-Ray SDL");
852    m.insert("pov-ray sdl", "POV-Ray SDL");
853    m.insert("povray", "POV-Ray SDL");
854    m.insert("powerbuilder", "PowerBuilder");
855    m.insert("powershell", "PowerShell");
856    m.insert("praat", "Praat");
857    m.insert("prisma", "Prisma");
858    m.insert("processing", "Processing");
859    m.insert("procfile", "Procfile");
860    m.insert("progress", "OpenEdge ABL");
861    m.insert("proguard", "Proguard");
862    m.insert("prolog", "Prolog");
863    m.insert("promela", "Promela");
864    m.insert("propeller spin", "Propeller Spin");
865    m.insert("proto", "Protocol Buffer");
866    m.insert("protobuf", "Protocol Buffer");
867    m.insert("protobuf text format", "Protocol Buffer Text Format");
868    m.insert("protocol buffer", "Protocol Buffer");
869    m.insert("protocol buffer text format", "Protocol Buffer Text Format");
870    m.insert("protocol buffers", "Protocol Buffer");
871    m.insert("public key", "Public Key");
872    m.insert("pug", "Pug");
873    m.insert("puppet", "Puppet");
874    m.insert("pure data", "Pure Data");
875    m.insert("purebasic", "PureBasic");
876    m.insert("purescript", "PureScript");
877    m.insert("pwsh", "PowerShell");
878    m.insert("py", "Python");
879    m.insert("py3", "Python");
880    m.insert("pycon", "Python");
881    m.insert("pyret", "Pyret");
882    m.insert("pyrex", "Cython");
883    m.insert("python", "Python");
884    m.insert("python console", "Python");
885    m.insert("python traceback", "Python");
886    m.insert("python3", "Python");
887    m.insert("q", "q");
888    m.insert("q#", "Q#");
889    m.insert("qb", "QuickBASIC");
890    m.insert("qb64", "QuickBASIC");
891    m.insert("qbasic", "QuickBASIC");
892    m.insert("ql", "CodeQL");
893    m.insert("qmake", "QMake");
894    m.insert("qml", "QML");
895    m.insert("qsharp", "Q#");
896    m.insert("qt script", "Qt Script");
897    m.insert("quake", "Quake");
898    m.insert("quakec", "QuakeC");
899    m.insert("quickbasic", "QuickBASIC");
900    m.insert("r", "R");
901    m.insert("racket", "Racket");
902    m.insert("ragel", "Ragel");
903    m.insert("ragel-rb", "Ragel");
904    m.insert("ragel-ruby", "Ragel");
905    m.insert("rake", "Ruby");
906    m.insert("raku", "Raku");
907    m.insert("raml", "RAML");
908    m.insert("rascal", "Rascal");
909    m.insert("rascript", "RAScript");
910    m.insert("raw", "Raw token data");
911    m.insert("raw token data", "Raw token data");
912    m.insert("razor", "HTML");
913    m.insert("rb", "Ruby");
914    m.insert("rbs", "Ruby");
915    m.insert("rbx", "Ruby");
916    m.insert("rdoc", "RDoc");
917    m.insert("readline", "INI");
918    m.insert("readline config", "INI");
919    m.insert("realbasic", "REALbasic");
920    m.insert("reason", "Reason");
921    m.insert("reasonligo", "LigoLANG");
922    m.insert("rebol", "Rebol");
923    m.insert("record jar", "Record Jar");
924    m.insert("red", "Red");
925    m.insert("red/system", "Red");
926    m.insert("redcode", "Redcode");
927    m.insert("redirect rules", "Redirect Rules");
928    m.insert("redirects", "Redirect Rules");
929    m.insert("regex", "Regular Expression");
930    m.insert("regexp", "Regular Expression");
931    m.insert("regular expression", "Regular Expression");
932    m.insert("ren'py", "Ren'Py");
933    m.insert("renderscript", "RenderScript");
934    m.insert("renpy", "Ren'Py");
935    m.insert("rescript", "ReScript");
936    m.insert("restructuredtext", "reStructuredText");
937    m.insert("rexx", "REXX");
938    m.insert("rez", "Rez");
939    m.insert("rhtml", "HTML");
940    m.insert("rich text format", "Rich Text Format");
941    m.insert("ring", "Ring");
942    m.insert("riot", "Riot");
943    m.insert("rmarkdown", "RMarkdown");
944    m.insert("robotframework", "RobotFramework");
945    m.insert("robots", "robots.txt");
946    m.insert("robots txt", "robots.txt");
947    m.insert("robots.txt", "robots.txt");
948    m.insert("roc", "Roc");
949    m.insert("rocq", "Rocq Prover");
950    m.insert("rocq prover", "Rocq Prover");
951    m.insert("roff", "Roff");
952    m.insert("roff manpage", "Roff");
953    m.insert("ron", "RON");
954    m.insert("ros interface", "ROS Interface");
955    m.insert("rosmsg", "ROS Interface");
956    m.insert("rouge", "Rouge");
957    m.insert("routeros script", "RouterOS Script");
958    m.insert("rpc", "RPC");
959    m.insert("rpcgen", "RPC");
960    m.insert("rpgle", "RPGLE");
961    m.insert("rpm spec", "RPM Spec");
962    m.insert("rs", "Rust");
963    m.insert("rs-274x", "Gerber Image");
964    m.insert("rscript", "R");
965    m.insert("rss", "XML");
966    m.insert("rst", "reStructuredText");
967    m.insert("ruby", "Ruby");
968    m.insert("runoff", "RUNOFF");
969    m.insert("rust", "Rust");
970    m.insert("rusthon", "Python");
971    m.insert("sage", "Sage");
972    m.insert("sail", "Sail");
973    m.insert("salt", "SaltStack");
974    m.insert("saltstack", "SaltStack");
975    m.insert("saltstate", "SaltStack");
976    m.insert("sarif", "JSON");
977    m.insert("sas", "SAS");
978    m.insert("sass", "Sass");
979    m.insert("scala", "Scala");
980    m.insert("scaml", "Scaml");
981    m.insert("scenic", "Scenic");
982    m.insert("scheme", "Scheme");
983    m.insert("scilab", "Scilab");
984    m.insert("scss", "SCSS");
985    m.insert("sdc", "Tcl");
986    m.insert("sed", "sed");
987    m.insert("self", "Self");
988    m.insert("selinux kernel policy language", "SELinux Policy");
989    m.insert("selinux policy", "SELinux Policy");
990    m.insert("sepolicy", "SELinux Policy");
991    m.insert("sfv", "Checksums");
992    m.insert("sh", "Shell");
993    m.insert("shaderlab", "ShaderLab");
994    m.insert("shell", "Shell");
995    m.insert("shell-script", "Shell");
996    m.insert("shellcheck config", "ShellCheck Config");
997    m.insert("shellcheckrc", "ShellCheck Config");
998    m.insert("shellsession", "ShellSession");
999    m.insert("shen", "Shen");
1000    m.insert("sieve", "Sieve");
1001    m.insert("simple file verification", "Checksums");
1002    m.insert("singularity", "Singularity");
1003    m.insert("slang", "Slang");
1004    m.insert("slash", "Slash");
1005    m.insert("slice", "Slice");
1006    m.insert("slim", "Slim");
1007    m.insert("slint", "Slint");
1008    m.insert("smali", "Smali");
1009    m.insert("smalltalk", "Smalltalk");
1010    m.insert("smarty", "Smarty");
1011    m.insert("smithy", "Smithy");
1012    m.insert("sml", "Standard ML");
1013    m.insert("smpl", "SmPL");
1014    m.insert("smt", "SMT");
1015    m.insert("snakefile", "Python");
1016    m.insert("snakemake", "Python");
1017    m.insert("snipmate", "Vim Snippet");
1018    m.insert("snippet", "YASnippet");
1019    m.insert("solidity", "Solidity");
1020    m.insert("soong", "Soong");
1021    m.insert("sourcemod", "SourcePawn");
1022    m.insert("sourcepawn", "SourcePawn");
1023    m.insert("soy", "Closure Templates");
1024    m.insert("sparql", "SPARQL");
1025    m.insert("specfile", "RPM Spec");
1026    m.insert("spline font database", "Spline Font Database");
1027    m.insert("splus", "R");
1028    m.insert("sqf", "SQF");
1029    m.insert("sql", "SQL");
1030    m.insert("sqlpl", "SQLPL");
1031    m.insert("sqlrpgle", "RPGLE");
1032    m.insert("squeak", "Smalltalk");
1033    m.insert("squirrel", "Squirrel");
1034    m.insert("srecode template", "SRecode Template");
1035    m.insert("ssh config", "INI");
1036    m.insert("ssh_config", "INI");
1037    m.insert("sshconfig", "INI");
1038    m.insert("sshd_config", "INI");
1039    m.insert("sshdconfig", "INI");
1040    m.insert("stan", "Stan");
1041    m.insert("standard ml", "Standard ML");
1042    m.insert("star", "STAR");
1043    m.insert("starlark", "Starlark");
1044    m.insert("stata", "Stata");
1045    m.insert("stl", "STL");
1046    m.insert("stla", "STL");
1047    m.insert("ston", "Smalltalk");
1048    m.insert("stringtemplate", "StringTemplate");
1049    m.insert("stylus", "Stylus");
1050    m.insert("subrip text", "SubRip Text");
1051    m.insert("sugarss", "SugarSS");
1052    m.insert("sum", "Checksums");
1053    m.insert("sums", "Checksums");
1054    m.insert("supercollider", "SuperCollider");
1055    m.insert("surql", "SurrealQL");
1056    m.insert("surrealql", "SurrealQL");
1057    m.insert("survex data", "Survex data");
1058    m.insert("svelte", "Svelte");
1059    m.insert("svg", "SVG");
1060    m.insert("sway", "Sway");
1061    m.insert("sweave", "Sweave");
1062    m.insert("swift", "Swift");
1063    m.insert("swig", "SWIG");
1064    m.insert("systemverilog", "SystemVerilog");
1065    m.insert("tab-seperated values", "TSV");
1066    m.insert("tabular model definition language", "TMDL");
1067    m.insert("tact", "Tact");
1068    m.insert("talon", "Talon");
1069    m.insert("tcl", "Tcl");
1070    m.insert("tcsh", "Shell");
1071    m.insert("tea", "Tea");
1072    m.insert("teal", "Teal");
1073    m.insert("templ", "templ");
1074    m.insert("terra", "Terra");
1075    m.insert("terraform", "HCL");
1076    m.insert("terraform template", "HCL");
1077    m.insert("tex", "TeX");
1078    m.insert("texinfo", "Texinfo");
1079    m.insert("text", "Text");
1080    m.insert("text proto", "Protocol Buffer Text Format");
1081    m.insert("textgrid", "TextGrid");
1082    m.insert("textile", "Textile");
1083    m.insert("textmate properties", "TextMate Properties");
1084    m.insert("thrift", "Thrift");
1085    m.insert("ti program", "TI Program");
1086    m.insert("tl", "Type Language");
1087    m.insert("tl-verilog", "TL-Verilog");
1088    m.insert("tla", "TLA");
1089    m.insert("tm-properties", "TextMate Properties");
1090    m.insert("tmdl", "TMDL");
1091    m.insert("toit", "Toit");
1092    m.insert("toml", "TOML");
1093    m.insert("topojson", "JSON");
1094    m.insert("tor config", "Tor Config");
1095    m.insert("torrc", "Tor Config");
1096    m.insert("traveling salesman problem", "TSPLIB data");
1097    m.insert("travelling salesman problem", "TSPLIB data");
1098    m.insert("tree-sitter query", "Tree-sitter Query");
1099    m.insert("troff", "Roff");
1100    m.insert("ts", "TypeScript");
1101    m.insert("tsp", "TypeSpec");
1102    m.insert("tsplib data", "TSPLIB data");
1103    m.insert("tsq", "Tree-sitter Query");
1104    m.insert("tsql", "TSQL");
1105    m.insert("tsv", "TSV");
1106    m.insert("tsx", "TypeScript");
1107    m.insert("turing", "Turing");
1108    m.insert("turtle", "Turtle");
1109    m.insert("twig", "Twig");
1110    m.insert("txl", "TXL");
1111    m.insert("typ", "Typst");
1112    m.insert("type language", "Type Language");
1113    m.insert("typescript", "TypeScript");
1114    m.insert("typespec", "TypeSpec");
1115    m.insert("typst", "Typst");
1116    m.insert("udiff", "Diff");
1117    m.insert("ultisnip", "Vim Snippet");
1118    m.insert("ultisnips", "Vim Snippet");
1119    m.insert("unified parallel c", "C");
1120    m.insert("unity3d asset", "Unity3D Asset");
1121    m.insert("unix asm", "Assembly");
1122    m.insert("unix assembly", "Assembly");
1123    m.insert("uno", "Uno");
1124    m.insert("unrealscript", "UnrealScript");
1125    m.insert("untyped plutus core", "Untyped Plutus Core");
1126    m.insert("ur", "UrWeb");
1127    m.insert("ur/web", "UrWeb");
1128    m.insert("urweb", "UrWeb");
1129    m.insert("v", "V");
1130    m.insert("vala", "Vala");
1131    m.insert("valve data format", "Valve Data Format");
1132    m.insert("vb .net", "Visual Basic .NET");
1133    m.insert("vb 6", "Visual Basic 6.0");
1134    m.insert("vb.net", "Visual Basic .NET");
1135    m.insert("vb6", "Visual Basic 6.0");
1136    m.insert("vba", "VBA");
1137    m.insert("vbnet", "Visual Basic .NET");
1138    m.insert("vbscript", "VBScript");
1139    m.insert("vcard", "vCard");
1140    m.insert("vcl", "VCL");
1141    m.insert("vdf", "Valve Data Format");
1142    m.insert("velocity", "Velocity Template Language");
1143    m.insert("velocity template language", "Velocity Template Language");
1144    m.insert("vento", "Vento");
1145    m.insert("verilog", "Verilog");
1146    m.insert("vhdl", "VHDL");
1147    m.insert("vim", "Vim Script");
1148    m.insert("vim help file", "Vim Help File");
1149    m.insert("vim script", "Vim Script");
1150    m.insert("vim snippet", "Vim Snippet");
1151    m.insert("vimhelp", "Vim Help File");
1152    m.insert("viml", "Vim Script");
1153    m.insert("vimscript", "Vim Script");
1154    m.insert("virtual contact file", "vCard");
1155    m.insert("visual basic", "Visual Basic .NET");
1156    m.insert("visual basic .net", "Visual Basic .NET");
1157    m.insert("visual basic 6", "Visual Basic 6.0");
1158    m.insert("visual basic 6.0", "Visual Basic 6.0");
1159    m.insert("visual basic classic", "Visual Basic 6.0");
1160    m.insert("visual basic for applications", "VBA");
1161    m.insert("vlang", "V");
1162    m.insert("volt", "Volt");
1163    m.insert("vtl", "Velocity Template Language");
1164    m.insert("vtt", "WebVTT");
1165    m.insert("vue", "Vue");
1166    m.insert("vyper", "Vyper");
1167    m.insert("wasm", "WebAssembly");
1168    m.insert("wast", "WebAssembly");
1169    m.insert("wavefront material", "Wavefront Material");
1170    m.insert("wavefront object", "Wavefront Object");
1171    m.insert("wdl", "WDL");
1172    m.insert("web ontology language", "Web Ontology Language");
1173    m.insert("webassembly", "WebAssembly");
1174    m.insert("webassembly interface type", "WebAssembly Interface Type");
1175    m.insert("webidl", "WebIDL");
1176    m.insert("webvtt", "WebVTT");
1177    m.insert("wget config", "INI");
1178    m.insert("wgetrc", "INI");
1179    m.insert("wgsl", "WGSL");
1180    m.insert("whiley", "Whiley");
1181    m.insert("wiki", "Wikitext");
1182    m.insert("wikitext", "Wikitext");
1183    m.insert("win32 message file", "Win32 Message File");
1184    m.insert("winbatch", "Batchfile");
1185    m.insert("windows registry entries", "Windows Registry Entries");
1186    m.insert("wisp", "wisp");
1187    m.insert("wit", "WebAssembly Interface Type");
1188    m.insert("witcher script", "Witcher Script");
1189    m.insert("wl", "Wolfram Language");
1190    m.insert("wolfram", "Wolfram Language");
1191    m.insert("wolfram lang", "Wolfram Language");
1192    m.insert("wolfram language", "Wolfram Language");
1193    m.insert("wollok", "Wollok");
1194    m.insert("workflow description language", "WDL");
1195    m.insert("world of warcraft addon data", "World of Warcraft Addon Data");
1196    m.insert("wren", "Wren");
1197    m.insert("wrenlang", "Wren");
1198    m.insert("wsdl", "XML");
1199    m.insert("x bitmap", "C");
1200    m.insert("x font directory index", "X Font Directory Index");
1201    m.insert("x pixmap", "C");
1202    m.insert("x10", "X10");
1203    m.insert("xbase", "xBase");
1204    m.insert("xbm", "C");
1205    m.insert("xc", "XC");
1206    m.insert("xcompose", "XCompose");
1207    m.insert("xdc", "Tcl");
1208    m.insert("xdr", "RPC");
1209    m.insert("xhtml", "HTML");
1210    m.insert("xmake", "Xmake");
1211    m.insert("xml", "XML");
1212    m.insert("xml property list", "XML");
1213    m.insert("xml+genshi", "Genshi");
1214    m.insert("xml+kid", "Genshi");
1215    m.insert("xojo", "Xojo");
1216    m.insert("xonsh", "Xonsh");
1217    m.insert("xpages", "XPages");
1218    m.insert("xpm", "C");
1219    m.insert("xproc", "XProc");
1220    m.insert("xquery", "XQuery");
1221    m.insert("xs", "XS");
1222    m.insert("xsd", "XML");
1223    m.insert("xsl", "XSLT");
1224    m.insert("xslt", "XSLT");
1225    m.insert("xten", "X10");
1226    m.insert("xtend", "Xtend");
1227    m.insert("yacc", "Yacc");
1228    m.insert("yaml", "YAML");
1229    m.insert("yang", "YANG");
1230    m.insert("yara", "YARA");
1231    m.insert("yas", "YASnippet");
1232    m.insert("yasnippet", "YASnippet");
1233    m.insert("yml", "YAML");
1234    m.insert("yul", "Yul");
1235    m.insert("zap", "ZAP");
1236    m.insert("zeek", "Zeek");
1237    m.insert("zenscript", "ZenScript");
1238    m.insert("zephir", "Zephir");
1239    m.insert("zig", "Zig");
1240    m.insert("zil", "ZIL");
1241    m.insert("zimpl", "Zimpl");
1242    m.insert("zmodel", "Zmodel");
1243    m.insert("zsh", "Shell");
1244    m
1245});
1246
1247/// Maps canonical language name -> all valid aliases (for validation)
1248pub static CANONICAL_TO_ALIASES: LazyLock<HashMap<&'static str, HashSet<&'static str>>> = LazyLock::new(|| {
1249    let mut m = HashMap::with_capacity(720);
1250    m.insert("1C Enterprise", HashSet::from(["1c enterprise"]));
1251    m.insert("2-Dimensional Array", HashSet::from(["2-dimensional array"]));
1252    m.insert("4D", HashSet::from(["4d"]));
1253    m.insert("ABAP", HashSet::from(["abap"]));
1254    m.insert("ABAP CDS", HashSet::from(["abap cds"]));
1255    m.insert("ABNF", HashSet::from(["abnf"]));
1256    m.insert("AGS Script", HashSet::from(["ags", "ags script"]));
1257    m.insert("AIDL", HashSet::from(["aidl"]));
1258    m.insert("AL", HashSet::from(["al"]));
1259    m.insert("ALGOL", HashSet::from(["algol"]));
1260    m.insert("AMPL", HashSet::from(["ampl"]));
1261    m.insert("ANTLR", HashSet::from(["antlr"]));
1262    m.insert("API Blueprint", HashSet::from(["api blueprint"]));
1263    m.insert("APL", HashSet::from(["apl"]));
1264    m.insert("ASL", HashSet::from(["asl"]));
1265    m.insert("ASN.1", HashSet::from(["asn.1"]));
1266    m.insert("ASP.NET", HashSet::from(["asp.net", "aspx", "aspx-vb"]));
1267    m.insert("ATS", HashSet::from(["ats", "ats2"]));
1268    m.insert(
1269        "ActionScript",
1270        HashSet::from(["actionscript", "actionscript 3", "actionscript3", "as3"]),
1271    );
1272    m.insert("Ada", HashSet::from(["ada", "ada2005", "ada95"]));
1273    m.insert(
1274        "Adblock Filter List",
1275        HashSet::from(["ad block", "ad block filters", "adb", "adblock", "adblock filter list"]),
1276    );
1277    m.insert(
1278        "Adobe Font Metrics",
1279        HashSet::from([
1280            "acfm",
1281            "adobe composite font metrics",
1282            "adobe font metrics",
1283            "adobe multiple font metrics",
1284            "amfm",
1285        ]),
1286    );
1287    m.insert("Agda", HashSet::from(["agda", "literate agda"]));
1288    m.insert("Aiken", HashSet::from(["aiken"]));
1289    m.insert("Alloy", HashSet::from(["alloy"]));
1290    m.insert("Altium Designer", HashSet::from(["altium", "altium designer"]));
1291    m.insert("AngelScript", HashSet::from(["angelscript"]));
1292    m.insert("Answer Set Programming", HashSet::from(["answer set programming"]));
1293    m.insert("Ant Build System", HashSet::from(["ant build system"]));
1294    m.insert("Antlers", HashSet::from(["antlers"]));
1295    m.insert("ApacheConf", HashSet::from(["aconf", "apache", "apacheconf"]));
1296    m.insert("Apex", HashSet::from(["apex"]));
1297    m.insert("AppleScript", HashSet::from(["applescript", "osascript"]));
1298    m.insert("Arc", HashSet::from(["arc"]));
1299    m.insert("AsciiDoc", HashSet::from(["asciidoc"]));
1300    m.insert("AspectJ", HashSet::from(["aspectj"]));
1301    m.insert(
1302        "Assembly",
1303        HashSet::from([
1304            "apollo guidance computer",
1305            "asm",
1306            "assembly",
1307            "gas",
1308            "gnu asm",
1309            "m68k",
1310            "motorola 68k assembly",
1311            "nasm",
1312            "unix asm",
1313            "unix assembly",
1314        ]),
1315    );
1316    m.insert("Astro", HashSet::from(["astro"]));
1317    m.insert("Asymptote", HashSet::from(["asymptote"]));
1318    m.insert("Augeas", HashSet::from(["augeas"]));
1319    m.insert("AutoHotkey", HashSet::from(["ahk", "autohotkey"]));
1320    m.insert("AutoIt", HashSet::from(["au3", "autoit", "autoit3", "autoitscript"]));
1321    m.insert("Avro IDL", HashSet::from(["avro idl"]));
1322    m.insert("Awk", HashSet::from(["awk"]));
1323    m.insert("B (Formal Method)", HashSet::from(["b (formal method)"]));
1324    m.insert("B4X", HashSet::from(["b4x", "basic for android"]));
1325    m.insert("BASIC", HashSet::from(["basic"]));
1326    m.insert("BQN", HashSet::from(["bqn"]));
1327    m.insert("Ballerina", HashSet::from(["ballerina"]));
1328    m.insert(
1329        "Batchfile",
1330        HashSet::from(["bat", "batch", "batchfile", "dosbatch", "winbatch"]),
1331    );
1332    m.insert("Beef", HashSet::from(["beef"]));
1333    m.insert("Befunge", HashSet::from(["befunge"]));
1334    m.insert("Berry", HashSet::from(["be", "berry"]));
1335    m.insert("BibTeX Style", HashSet::from(["bibtex style"]));
1336    m.insert("Bicep", HashSet::from(["bicep"]));
1337    m.insert("Bikeshed", HashSet::from(["bikeshed"]));
1338    m.insert("BitBake", HashSet::from(["bitbake"]));
1339    m.insert("Blade", HashSet::from(["blade"]));
1340    m.insert(
1341        "BlitzBasic",
1342        HashSet::from(["b3d", "blitz3d", "blitzbasic", "blitzplus", "bplus"]),
1343    );
1344    m.insert("BlitzMax", HashSet::from(["blitzmax", "bmax"]));
1345    m.insert(
1346        "Bluespec",
1347        HashSet::from([
1348            "bh",
1349            "bluespec",
1350            "bluespec bh",
1351            "bluespec bsv",
1352            "bluespec classic",
1353            "bsv",
1354        ]),
1355    );
1356    m.insert("Boo", HashSet::from(["boo"]));
1357    m.insert("Boogie", HashSet::from(["boogie"]));
1358    m.insert("Brainfuck", HashSet::from(["brainfuck"]));
1359    m.insert("BrighterScript", HashSet::from(["brighterscript"]));
1360    m.insert("Brightscript", HashSet::from(["brightscript"]));
1361    m.insert("Browserslist", HashSet::from(["browserslist"]));
1362    m.insert("Bru", HashSet::from(["bru"]));
1363    m.insert("BuildStream", HashSet::from(["buildstream"]));
1364    m.insert(
1365        "C",
1366        HashSet::from([
1367            "c",
1368            "opencl",
1369            "unified parallel c",
1370            "x bitmap",
1371            "x pixmap",
1372            "xbm",
1373            "xpm",
1374        ]),
1375    );
1376    m.insert("C#", HashSet::from(["c#", "cake", "cakescript", "csharp"]));
1377    m.insert("C++", HashSet::from(["c++", "cpp"]));
1378    m.insert("C-ObjDump", HashSet::from(["c-objdump"]));
1379    m.insert("C3", HashSet::from(["c3"]));
1380    m.insert("CAP CDS", HashSet::from(["cap cds", "cds"]));
1381    m.insert("CIL", HashSet::from(["cil"]));
1382    m.insert("CLIPS", HashSet::from(["clips"]));
1383    m.insert("CMake", HashSet::from(["cmake"]));
1384    m.insert("COBOL", HashSet::from(["cobol"]));
1385    m.insert("CODEOWNERS", HashSet::from(["codeowners"]));
1386    m.insert("COLLADA", HashSet::from(["collada"]));
1387    m.insert("CQL", HashSet::from(["cql"]));
1388    m.insert("CSON", HashSet::from(["cson"]));
1389    m.insert("CSS", HashSet::from(["css", "postcss"]));
1390    m.insert("CSV", HashSet::from(["csv"]));
1391    m.insert("CUE", HashSet::from(["cue"]));
1392    m.insert("CWeb", HashSet::from(["cweb"]));
1393    m.insert("Cabal Config", HashSet::from(["cabal", "cabal config"]));
1394    m.insert("Caddyfile", HashSet::from(["caddy", "caddyfile"]));
1395    m.insert("Cadence", HashSet::from(["cadence"]));
1396    m.insert("Cairo", HashSet::from(["cairo", "cairo zero"]));
1397    m.insert("Cangjie", HashSet::from(["cangjie"]));
1398    m.insert("Cap'n Proto", HashSet::from(["cap'n proto"]));
1399    m.insert("Carbon", HashSet::from(["carbon"]));
1400    m.insert("CartoCSS", HashSet::from(["carto", "cartocss"]));
1401    m.insert("Ceylon", HashSet::from(["ceylon"]));
1402    m.insert("Chapel", HashSet::from(["chapel", "chpl"]));
1403    m.insert("Charity", HashSet::from(["charity"]));
1404    m.insert(
1405        "Checksums",
1406        HashSet::from([
1407            "checksum",
1408            "checksums",
1409            "hash",
1410            "hashes",
1411            "sfv",
1412            "simple file verification",
1413            "sum",
1414            "sums",
1415        ]),
1416    );
1417    m.insert("ChucK", HashSet::from(["chuck"]));
1418    m.insert("Circom", HashSet::from(["circom"]));
1419    m.insert("Cirru", HashSet::from(["cirru"]));
1420    m.insert("Clarion", HashSet::from(["clarion"]));
1421    m.insert("Clarity", HashSet::from(["clarity"]));
1422    m.insert("Classic ASP", HashSet::from(["asp", "classic asp"]));
1423    m.insert("Clean", HashSet::from(["clean"]));
1424    m.insert("Click", HashSet::from(["click"]));
1425    m.insert("Clojure", HashSet::from(["clojure"]));
1426    m.insert("Closure Templates", HashSet::from(["closure templates", "soy"]));
1427    m.insert(
1428        "Cloud Firestore Security Rules",
1429        HashSet::from(["cloud firestore security rules"]),
1430    );
1431    m.insert("Clue", HashSet::from(["clue"]));
1432    m.insert("CoNLL-U", HashSet::from(["conll", "conll-u", "conll-x"]));
1433    m.insert("CodeQL", HashSet::from(["codeql", "ql"]));
1434    m.insert(
1435        "CoffeeScript",
1436        HashSet::from([
1437            "coffee",
1438            "coffee-script",
1439            "coffeescript",
1440            "litcoffee",
1441            "literate coffeescript",
1442        ]),
1443    );
1444    m.insert(
1445        "ColdFusion",
1446        HashSet::from(["cfc", "cfm", "cfml", "coldfusion", "coldfusion cfc", "coldfusion html"]),
1447    );
1448    m.insert("Common Lisp", HashSet::from(["common lisp", "lisp"]));
1449    m.insert(
1450        "Common Workflow Language",
1451        HashSet::from(["common workflow language", "cwl"]),
1452    );
1453    m.insert("Component Pascal", HashSet::from(["component pascal"]));
1454    m.insert("Cooklang", HashSet::from(["cooklang"]));
1455    m.insert("Cool", HashSet::from(["cool"]));
1456    m.insert("Cpp-ObjDump", HashSet::from(["c++-objdump", "cpp-objdump"]));
1457    m.insert("Creole", HashSet::from(["creole"]));
1458    m.insert("Crystal", HashSet::from(["crystal"]));
1459    m.insert("Csound", HashSet::from(["csound", "csound-orc"]));
1460    m.insert("Csound Document", HashSet::from(["csound document", "csound-csd"]));
1461    m.insert("Csound Score", HashSet::from(["csound score", "csound-sco"]));
1462    m.insert("Cuda", HashSet::from(["cuda"]));
1463    m.insert("Cue Sheet", HashSet::from(["cue sheet"]));
1464    m.insert("Curry", HashSet::from(["curry"]));
1465    m.insert("Cycript", HashSet::from(["cycript"]));
1466    m.insert("Cypher", HashSet::from(["cypher"]));
1467    m.insert("Cython", HashSet::from(["cython", "pyrex"]));
1468    m.insert("D", HashSet::from(["d", "dlang"]));
1469    m.insert("D-ObjDump", HashSet::from(["d-objdump"]));
1470    m.insert("D2", HashSet::from(["d2", "d2lang"]));
1471    m.insert(
1472        "DIGITAL Command Language",
1473        HashSet::from(["dcl", "digital command language"]),
1474    );
1475    m.insert("DM", HashSet::from(["byond", "dm"]));
1476    m.insert("DNS Zone", HashSet::from(["dns zone"]));
1477    m.insert("DTrace", HashSet::from(["dtrace", "dtrace-script"]));
1478    m.insert("Dafny", HashSet::from(["dafny"]));
1479    m.insert("Darcs Patch", HashSet::from(["darcs patch", "dpatch"]));
1480    m.insert("Dart", HashSet::from(["dart"]));
1481    m.insert("Daslang", HashSet::from(["daslang"]));
1482    m.insert("DataWeave", HashSet::from(["dataweave"]));
1483    m.insert(
1484        "Debian Package Control File",
1485        HashSet::from(["debian package control file"]),
1486    );
1487    m.insert("DenizenScript", HashSet::from(["denizenscript"]));
1488    m.insert("Dhall", HashSet::from(["dhall"]));
1489    m.insert("Diff", HashSet::from(["diff", "udiff"]));
1490    m.insert("DirectX 3D File", HashSet::from(["directx 3d file"]));
1491    m.insert("Dockerfile", HashSet::from(["containerfile", "dockerfile"]));
1492    m.insert("Dogescript", HashSet::from(["dogescript"]));
1493    m.insert("Dotenv", HashSet::from(["dotenv"]));
1494    m.insert("Dune", HashSet::from(["dune"]));
1495    m.insert("Dylan", HashSet::from(["dylan"]));
1496    m.insert("E", HashSet::from(["e"]));
1497    m.insert("E-mail", HashSet::from(["e-mail", "email", "eml", "mail", "mbox"]));
1498    m.insert("EBNF", HashSet::from(["ebnf"]));
1499    m.insert("ECL", HashSet::from(["ecl"]));
1500    m.insert("EJS", HashSet::from(["ejs"]));
1501    m.insert("EQ", HashSet::from(["eq"]));
1502    m.insert("Eagle", HashSet::from(["eagle"]));
1503    m.insert("Earthly", HashSet::from(["earthfile", "earthly"]));
1504    m.insert("Edge", HashSet::from(["edge"]));
1505    m.insert("EdgeQL", HashSet::from(["edgeql", "esdl"]));
1506    m.insert("Edje Data Collection", HashSet::from(["edje data collection"]));
1507    m.insert("Eiffel", HashSet::from(["eiffel"]));
1508    m.insert("Elixir", HashSet::from(["elixir"]));
1509    m.insert("Elm", HashSet::from(["elm"]));
1510    m.insert("Elvish", HashSet::from(["elvish", "elvish transcript"]));
1511    m.insert("Emacs Lisp", HashSet::from(["elisp", "emacs", "emacs lisp"]));
1512    m.insert("EmberScript", HashSet::from(["emberscript"]));
1513    m.insert("Erlang", HashSet::from(["erlang"]));
1514    m.insert("Euphoria", HashSet::from(["euphoria"]));
1515    m.insert("F#", HashSet::from(["f#", "fsharp"]));
1516    m.insert("F*", HashSet::from(["f*", "fstar"]));
1517    m.insert("FIGlet Font", HashSet::from(["figfont", "figlet font"]));
1518    m.insert("FIRRTL", HashSet::from(["firrtl"]));
1519    m.insert("FLUX", HashSet::from(["flux"]));
1520    m.insert("Factor", HashSet::from(["factor"]));
1521    m.insert("Fancy", HashSet::from(["fancy"]));
1522    m.insert("Fantom", HashSet::from(["fantom"]));
1523    m.insert("Faust", HashSet::from(["faust"]));
1524    m.insert("Fennel", HashSet::from(["fennel"]));
1525    m.insert("Filebench WML", HashSet::from(["filebench wml"]));
1526    m.insert("Flix", HashSet::from(["flix"]));
1527    m.insert("Fluent", HashSet::from(["fluent"]));
1528    m.insert("Formatted", HashSet::from(["formatted"]));
1529    m.insert("Forth", HashSet::from(["forth", "muf"]));
1530    m.insert("Fortran", HashSet::from(["fortran", "fortran free form"]));
1531    m.insert("FreeBASIC", HashSet::from(["fb", "freebasic"]));
1532    m.insert("FreeMarker", HashSet::from(["freemarker", "ftl"]));
1533    m.insert("Frege", HashSet::from(["frege"]));
1534    m.insert("Futhark", HashSet::from(["futhark"]));
1535    m.insert("G-code", HashSet::from(["g-code"]));
1536    m.insert("GAML", HashSet::from(["gaml"]));
1537    m.insert("GAMS", HashSet::from(["gams"]));
1538    m.insert("GAP", HashSet::from(["gap"]));
1539    m.insert("GCC Machine Description", HashSet::from(["gcc machine description"]));
1540    m.insert("GDB", HashSet::from(["gdb"]));
1541    m.insert("GDScript", HashSet::from(["gdscript"]));
1542    m.insert("GDShader", HashSet::from(["gdshader"]));
1543    m.insert("GEDCOM", HashSet::from(["gedcom"]));
1544    m.insert("GLSL", HashSet::from(["glsl"]));
1545    m.insert("GN", HashSet::from(["gn"]));
1546    m.insert("GSC", HashSet::from(["gsc"]));
1547    m.insert("Game Maker Language", HashSet::from(["game maker language"]));
1548    m.insert("Gemfile.lock", HashSet::from(["gemfile.lock"]));
1549    m.insert("Gemini", HashSet::from(["gemini", "gemtext"]));
1550    m.insert("Genero 4gl", HashSet::from(["genero 4gl"]));
1551    m.insert("Genero per", HashSet::from(["genero per"]));
1552    m.insert("Genie", HashSet::from(["genie"]));
1553    m.insert("Genshi", HashSet::from(["genshi", "xml+genshi", "xml+kid"]));
1554    m.insert("Gerber Image", HashSet::from(["gerber image", "rs-274x"]));
1555    m.insert("Gettext Catalog", HashSet::from(["gettext catalog", "pot"]));
1556    m.insert("Gherkin", HashSet::from(["cucumber", "gherkin"]));
1557    m.insert("Git Attributes", HashSet::from(["git attributes", "gitattributes"]));
1558    m.insert("Git Commit", HashSet::from(["commit", "git commit"]));
1559    m.insert(
1560        "Git Revision List",
1561        HashSet::from(["git blame ignore revs", "git revision list"]),
1562    );
1563    m.insert("Gleam", HashSet::from(["gleam"]));
1564    m.insert("Glyph", HashSet::from(["glyph"]));
1565    m.insert(
1566        "Glyph Bitmap Distribution Format",
1567        HashSet::from(["glyph bitmap distribution format"]),
1568    );
1569    m.insert("Gnuplot", HashSet::from(["gnuplot"]));
1570    m.insert("Go", HashSet::from(["go", "golang"]));
1571    m.insert(
1572        "Go Checksums",
1573        HashSet::from(["go checksums", "go sum", "go work sum", "go.sum", "go.work.sum"]),
1574    );
1575    m.insert("Go Module", HashSet::from(["go mod", "go module", "go.mod"]));
1576    m.insert("Go Template", HashSet::from(["go template", "gotmpl"]));
1577    m.insert("Go Workspace", HashSet::from(["go work", "go workspace", "go.work"]));
1578    m.insert("Godot Resource", HashSet::from(["godot resource"]));
1579    m.insert("Golo", HashSet::from(["golo"]));
1580    m.insert("Gosu", HashSet::from(["gosu"]));
1581    m.insert("Grace", HashSet::from(["grace"]));
1582    m.insert("Gradle", HashSet::from(["gradle", "gradle kotlin dsl"]));
1583    m.insert("Grammatical Framework", HashSet::from(["gf", "grammatical framework"]));
1584    m.insert("Graph Modeling Language", HashSet::from(["graph modeling language"]));
1585    m.insert("GraphQL", HashSet::from(["graphql"]));
1586    m.insert("Graphviz (DOT)", HashSet::from(["graphviz (dot)"]));
1587    m.insert(
1588        "Groovy",
1589        HashSet::from(["groovy", "groovy server pages", "gsp", "java server page"]),
1590    );
1591    m.insert("HAProxy", HashSet::from(["haproxy"]));
1592    m.insert(
1593        "HCL",
1594        HashSet::from([
1595            "hashicorp configuration language",
1596            "hcl",
1597            "opentofu",
1598            "terraform",
1599            "terraform template",
1600        ]),
1601    );
1602    m.insert("HIP", HashSet::from(["hip"]));
1603    m.insert("HLSL", HashSet::from(["hlsl"]));
1604    m.insert("HOCON", HashSet::from(["hocon"]));
1605    m.insert(
1606        "HTML",
1607        HashSet::from([
1608            "ecmarkdown",
1609            "ecmarkup",
1610            "ecr",
1611            "eex",
1612            "erb",
1613            "heex",
1614            "html",
1615            "html+ecr",
1616            "html+eex",
1617            "html+erb",
1618            "html+php",
1619            "html+razor",
1620            "html+ruby",
1621            "leex",
1622            "razor",
1623            "rhtml",
1624            "xhtml",
1625        ]),
1626    );
1627    m.insert("HTTP", HashSet::from(["http"]));
1628    m.insert("HXML", HashSet::from(["hxml"]));
1629    m.insert("Hack", HashSet::from(["hack"]));
1630    m.insert("Haml", HashSet::from(["haml"]));
1631    m.insert("Handlebars", HashSet::from(["handlebars", "hbs", "htmlbars"]));
1632    m.insert("Harbour", HashSet::from(["harbour"]));
1633    m.insert("Hare", HashSet::from(["hare"]));
1634    m.insert(
1635        "Haskell",
1636        HashSet::from(["c2hs", "c2hs haskell", "haskell", "lhaskell", "lhs", "literate haskell"]),
1637    );
1638    m.insert("Haxe", HashSet::from(["haxe"]));
1639    m.insert("HiveQL", HashSet::from(["hiveql"]));
1640    m.insert("HolyC", HashSet::from(["holyc"]));
1641    m.insert("Hosts File", HashSet::from(["hosts", "hosts file"]));
1642    m.insert("Hurl", HashSet::from(["hurl"]));
1643    m.insert("Hy", HashSet::from(["hy", "hylang"]));
1644    m.insert("HyPhy", HashSet::from(["hyphy"]));
1645    m.insert("IDL", HashSet::from(["idl"]));
1646    m.insert("IGOR Pro", HashSet::from(["igor", "igor pro", "igorpro"]));
1647    m.insert(
1648        "INI",
1649        HashSet::from([
1650            "curl config",
1651            "curlrc",
1652            "cylc",
1653            "dosini",
1654            "editor-config",
1655            "editorconfig",
1656            "git config",
1657            "gitconfig",
1658            "gitmodules",
1659            "ini",
1660            "inputrc",
1661            "nanorc",
1662            "npm config",
1663            "npmrc",
1664            "readline",
1665            "readline config",
1666            "ssh config",
1667            "ssh_config",
1668            "sshconfig",
1669            "sshd_config",
1670            "sshdconfig",
1671            "wget config",
1672            "wgetrc",
1673        ]),
1674    );
1675    m.insert("IRC log", HashSet::from(["irc", "irc log", "irc logs"]));
1676    m.insert("ISPC", HashSet::from(["ispc"]));
1677    m.insert("Idris", HashSet::from(["idris"]));
1678    m.insert(
1679        "Ignore List",
1680        HashSet::from(["git-ignore", "gitignore", "ignore", "ignore list"]),
1681    );
1682    m.insert("ImageJ Macro", HashSet::from(["ijm", "imagej macro"]));
1683    m.insert("Imba", HashSet::from(["imba"]));
1684    m.insert("Inform 7", HashSet::from(["i7", "inform 7", "inform7"]));
1685    m.insert("Ink", HashSet::from(["ink"]));
1686    m.insert("Inno Setup", HashSet::from(["inno setup"]));
1687    m.insert("Io", HashSet::from(["io"]));
1688    m.insert("Ioke", HashSet::from(["ioke"]));
1689    m.insert("Isabelle", HashSet::from(["isabelle", "isabelle root"]));
1690    m.insert("J", HashSet::from(["j"]));
1691    m.insert("JAR Manifest", HashSet::from(["jar manifest"]));
1692    m.insert("JCL", HashSet::from(["jcl"]));
1693    m.insert(
1694        "JSON",
1695        HashSet::from([
1696            "geojson",
1697            "json",
1698            "json with comments",
1699            "jsonc",
1700            "jsonl",
1701            "sarif",
1702            "topojson",
1703        ]),
1704    );
1705    m.insert("JSON5", HashSet::from(["json5"]));
1706    m.insert("JSONLD", HashSet::from(["jsonld"]));
1707    m.insert("JSONiq", HashSet::from(["jsoniq"]));
1708    m.insert("Jac", HashSet::from(["jac"]));
1709    m.insert("Jai", HashSet::from(["jai"]));
1710    m.insert("Janet", HashSet::from(["janet"]));
1711    m.insert("Jasmin", HashSet::from(["jasmin"]));
1712    m.insert(
1713        "Java",
1714        HashSet::from(["java", "java server pages", "java template engine", "jsp", "jte"]),
1715    );
1716    m.insert("Java Properties", HashSet::from(["java properties"]));
1717    m.insert(
1718        "JavaScript",
1719        HashSet::from([
1720            "ecere projects",
1721            "gjs",
1722            "glimmer js",
1723            "javascript",
1724            "javascript+erb",
1725            "js",
1726            "node",
1727        ]),
1728    );
1729    m.insert("Jest Snapshot", HashSet::from(["jest snapshot"]));
1730    m.insert("JetBrains MPS", HashSet::from(["jetbrains mps", "mps"]));
1731    m.insert(
1732        "Jinja",
1733        HashSet::from(["django", "html+django", "html+jinja", "htmldjango", "jinja"]),
1734    );
1735    m.insert("Jolie", HashSet::from(["jolie"]));
1736    m.insert("Jsonnet", HashSet::from(["jsonnet"]));
1737    m.insert("Julia", HashSet::from(["julia", "julia repl"]));
1738    m.insert(
1739        "Jupyter Notebook",
1740        HashSet::from(["ipython notebook", "jupyter notebook"]),
1741    );
1742    m.insert("Just", HashSet::from(["just", "justfile"]));
1743    m.insert("KCL", HashSet::from(["kcl"]));
1744    m.insert("KDL", HashSet::from(["kdl"]));
1745    m.insert("KFramework", HashSet::from(["kframework"]));
1746    m.insert("KRL", HashSet::from(["krl"]));
1747    m.insert("Kaitai Struct", HashSet::from(["kaitai struct", "ksy"]));
1748    m.insert("KakouneScript", HashSet::from(["kak", "kakounescript", "kakscript"]));
1749    m.insert("KerboScript", HashSet::from(["kerboscript"]));
1750    m.insert("KiCad Layout", HashSet::from(["kicad layout", "pcbnew"]));
1751    m.insert("KiCad Legacy Layout", HashSet::from(["kicad legacy layout"]));
1752    m.insert(
1753        "KiCad Schematic",
1754        HashSet::from(["eeschema schematic", "kicad schematic"]),
1755    );
1756    m.insert("Kickstart", HashSet::from(["kickstart"]));
1757    m.insert("Kit", HashSet::from(["kit"]));
1758    m.insert("KoLmafia ASH", HashSet::from(["kolmafia ash"]));
1759    m.insert("Koka", HashSet::from(["koka"]));
1760    m.insert("Kotlin", HashSet::from(["kotlin"]));
1761    m.insert("Kusto", HashSet::from(["kusto"]));
1762    m.insert("LFE", HashSet::from(["lfe"]));
1763    m.insert("LLVM", HashSet::from(["llvm"]));
1764    m.insert("LOLCODE", HashSet::from(["lolcode"]));
1765    m.insert("LSL", HashSet::from(["lsl"]));
1766    m.insert("LTspice Symbol", HashSet::from(["ltspice symbol"]));
1767    m.insert("LabVIEW", HashSet::from(["labview"]));
1768    m.insert("Lambdapi", HashSet::from(["lambdapi"]));
1769    m.insert("Langium", HashSet::from(["langium"]));
1770    m.insert("Lark", HashSet::from(["lark"]));
1771    m.insert("Lasso", HashSet::from(["lasso", "lassoscript"]));
1772    m.insert("Latte", HashSet::from(["latte"]));
1773    m.insert("Lean", HashSet::from(["lean", "lean 4", "lean4"]));
1774    m.insert("Leo", HashSet::from(["leo"]));
1775    m.insert("Less", HashSet::from(["less", "less-css"]));
1776    m.insert("Lex", HashSet::from(["flex", "jflex", "jison lex", "lex"]));
1777    m.insert("LigoLANG", HashSet::from(["cameligo", "ligolang", "reasonligo"]));
1778    m.insert("LilyPond", HashSet::from(["lilypond"]));
1779    m.insert("Limbo", HashSet::from(["limbo"]));
1780    m.insert("Linear Programming", HashSet::from(["linear programming"]));
1781    m.insert("Linker Script", HashSet::from(["linker script"]));
1782    m.insert("Linux Kernel Module", HashSet::from(["linux kernel module"]));
1783    m.insert("Liquid", HashSet::from(["liquid"]));
1784    m.insert("LiveCode Script", HashSet::from(["livecode script"]));
1785    m.insert("LiveScript", HashSet::from(["live-script", "livescript", "ls"]));
1786    m.insert("Logos", HashSet::from(["logos"]));
1787    m.insert("Logtalk", HashSet::from(["logtalk"]));
1788    m.insert("LookML", HashSet::from(["lookml"]));
1789    m.insert("LoomScript", HashSet::from(["loomscript"]));
1790    m.insert("Lua", HashSet::from(["lua"]));
1791    m.insert("Luau", HashSet::from(["luau"]));
1792    m.insert("M", HashSet::from(["m", "mumps"]));
1793    m.insert("M3U", HashSet::from(["hls playlist", "m3u", "m3u playlist"]));
1794    m.insert("M4", HashSet::from(["autoconf", "m4", "m4sugar"]));
1795    m.insert("MATLAB", HashSet::from(["matlab", "octave"]));
1796    m.insert("MAXScript", HashSet::from(["maxscript"]));
1797    m.insert("MDX", HashSet::from(["mdx"]));
1798    m.insert("MLIR", HashSet::from(["mlir"]));
1799    m.insert("MQL4", HashSet::from(["mql4"]));
1800    m.insert("MQL5", HashSet::from(["mql5"]));
1801    m.insert("MTML", HashSet::from(["mtml"]));
1802    m.insert("Macaulay2", HashSet::from(["m2", "macaulay2"]));
1803    m.insert("Makefile", HashSet::from(["bsdmake", "make", "makefile", "mf"]));
1804    m.insert("Mako", HashSet::from(["mako"]));
1805    m.insert("Markdown", HashSet::from(["markdown", "md", "pandoc"]));
1806    m.insert("Marko", HashSet::from(["marko", "markojs"]));
1807    m.insert("Mask", HashSet::from(["mask"]));
1808    m.insert(
1809        "Mathematical Programming System",
1810        HashSet::from(["mathematical programming system"]),
1811    );
1812    m.insert("Max", HashSet::from(["max", "max/msp", "maxmsp"]));
1813    m.insert("Mercury", HashSet::from(["mercury"]));
1814    m.insert("Mermaid", HashSet::from(["mermaid", "mermaid example"]));
1815    m.insert("Meson", HashSet::from(["meson"]));
1816    m.insert("Metal", HashSet::from(["metal"]));
1817    m.insert(
1818        "Microsoft Developer Studio Project",
1819        HashSet::from(["microsoft developer studio project"]),
1820    );
1821    m.insert(
1822        "Microsoft Visual Studio Solution",
1823        HashSet::from(["microsoft visual studio solution"]),
1824    );
1825    m.insert("MiniD", HashSet::from(["minid"]));
1826    m.insert("MiniYAML", HashSet::from(["miniyaml"]));
1827    m.insert("MiniZinc", HashSet::from(["minizinc"]));
1828    m.insert("MiniZinc Data", HashSet::from(["minizinc data"]));
1829    m.insert("Mint", HashSet::from(["mint"]));
1830    m.insert("Mirah", HashSet::from(["mirah"]));
1831    m.insert("Modelica", HashSet::from(["modelica"]));
1832    m.insert("Modula-2", HashSet::from(["modula-2"]));
1833    m.insert("Modula-3", HashSet::from(["modula-3"]));
1834    m.insert("Module Management System", HashSet::from(["module management system"]));
1835    m.insert("Mojo", HashSet::from(["mojo"]));
1836    m.insert("Monkey", HashSet::from(["monkey"]));
1837    m.insert("Monkey C", HashSet::from(["monkey c"]));
1838    m.insert("Moocode", HashSet::from(["moocode"]));
1839    m.insert("MoonBit", HashSet::from(["moonbit"]));
1840    m.insert("MoonScript", HashSet::from(["moonscript"]));
1841    m.insert("Motoko", HashSet::from(["motoko"]));
1842    m.insert("Move", HashSet::from(["move"]));
1843    m.insert("Muse", HashSet::from(["amusewiki", "emacs muse", "muse"]));
1844    m.insert("Mustache", HashSet::from(["mustache"]));
1845    m.insert("Myghty", HashSet::from(["myghty"]));
1846    m.insert("NASL", HashSet::from(["nasl"]));
1847    m.insert("NCL", HashSet::from(["ncl"]));
1848    m.insert("NEON", HashSet::from(["ne-on", "neon", "nette object notation"]));
1849    m.insert("NL", HashSet::from(["nl"]));
1850    m.insert("NMODL", HashSet::from(["nmodl"]));
1851    m.insert("NSIS", HashSet::from(["nsis"]));
1852    m.insert("NWScript", HashSet::from(["nwscript"]));
1853    m.insert("Nasal", HashSet::from(["nasal"]));
1854    m.insert("Nearley", HashSet::from(["nearley"]));
1855    m.insert("Nemerle", HashSet::from(["nemerle"]));
1856    m.insert("NetLinx", HashSet::from(["netlinx"]));
1857    m.insert("NetLinx+ERB", HashSet::from(["netlinx+erb"]));
1858    m.insert("NetLogo", HashSet::from(["netlogo"]));
1859    m.insert("NewLisp", HashSet::from(["newlisp"]));
1860    m.insert("Nextflow", HashSet::from(["nextflow"]));
1861    m.insert("Nginx", HashSet::from(["nginx", "nginx configuration file"]));
1862    m.insert("Nickel", HashSet::from(["nickel"]));
1863    m.insert("Nim", HashSet::from(["nim"]));
1864    m.insert("Ninja", HashSet::from(["ninja"]));
1865    m.insert("Nit", HashSet::from(["nit"]));
1866    m.insert("Nix", HashSet::from(["nix", "nixos"]));
1867    m.insert("Noir", HashSet::from(["nargo", "noir"]));
1868    m.insert("Nu", HashSet::from(["nu", "nush"]));
1869    m.insert("Nunjucks", HashSet::from(["njk", "nunjucks"]));
1870    m.insert("Nushell", HashSet::from(["nu-script", "nushell", "nushell-script"]));
1871    m.insert("OCaml", HashSet::from(["ocaml"]));
1872    m.insert("OMNeT++ MSG", HashSet::from(["omnet++ msg", "omnetpp-msg"]));
1873    m.insert("OMNeT++ NED", HashSet::from(["omnet++ ned", "omnetpp-ned"]));
1874    m.insert("Oberon", HashSet::from(["oberon"]));
1875    m.insert("ObjDump", HashSet::from(["objdump"]));
1876    m.insert(
1877        "Object Data Instance Notation",
1878        HashSet::from(["object data instance notation"]),
1879    );
1880    m.insert("ObjectScript", HashSet::from(["objectscript"]));
1881    m.insert(
1882        "Objective-C",
1883        HashSet::from(["obj-c", "objc", "objective-c", "objectivec"]),
1884    );
1885    m.insert(
1886        "Objective-C++",
1887        HashSet::from(["obj-c++", "objc++", "objective-c++", "objectivec++"]),
1888    );
1889    m.insert(
1890        "Objective-J",
1891        HashSet::from(["obj-j", "objective-j", "objectivej", "objj"]),
1892    );
1893    m.insert("Odin", HashSet::from(["odin", "odin-lang", "odinlang"]));
1894    m.insert("Omgrofl", HashSet::from(["omgrofl"]));
1895    m.insert("Opa", HashSet::from(["opa"]));
1896    m.insert("Opal", HashSet::from(["opal"]));
1897    m.insert("Open Policy Agent", HashSet::from(["open policy agent"]));
1898    m.insert(
1899        "OpenAPI Specification v2",
1900        HashSet::from(["oasv2", "oasv2-json", "oasv2-yaml", "openapi specification v2"]),
1901    );
1902    m.insert(
1903        "OpenAPI Specification v3",
1904        HashSet::from(["oasv3", "oasv3-json", "oasv3-yaml", "openapi specification v3"]),
1905    );
1906    m.insert(
1907        "OpenEdge ABL",
1908        HashSet::from(["abl", "openedge", "openedge abl", "progress"]),
1909    );
1910    m.insert("OpenQASM", HashSet::from(["openqasm"]));
1911    m.insert("OpenSCAD", HashSet::from(["openscad"]));
1912    m.insert("OpenStep Property List", HashSet::from(["openstep property list"]));
1913    m.insert(
1914        "OpenType Feature File",
1915        HashSet::from(["afdko", "opentype feature file"]),
1916    );
1917    m.insert("Option List", HashSet::from(["ackrc", "option list", "opts"]));
1918    m.insert("Org", HashSet::from(["org"]));
1919    m.insert("OverpassQL", HashSet::from(["overpassql"]));
1920    m.insert("Ox", HashSet::from(["ox"]));
1921    m.insert("Oxygene", HashSet::from(["oxygene"]));
1922    m.insert("Oz", HashSet::from(["oz"]));
1923    m.insert("P4", HashSet::from(["p4"]));
1924    m.insert("PDDL", HashSet::from(["pddl"]));
1925    m.insert("PEG.js", HashSet::from(["peg.js"]));
1926    m.insert("PHP", HashSet::from(["inc", "php"]));
1927    m.insert("PLSQL", HashSet::from(["plsql"]));
1928    m.insert("PLpgSQL", HashSet::from(["plpgsql"]));
1929    m.insert("POV-Ray SDL", HashSet::from(["pov-ray", "pov-ray sdl", "povray"]));
1930    m.insert("Pact", HashSet::from(["pact"]));
1931    m.insert("Pan", HashSet::from(["pan"]));
1932    m.insert("Papyrus", HashSet::from(["papyrus"]));
1933    m.insert(
1934        "Parrot",
1935        HashSet::from([
1936            "parrot",
1937            "parrot assembly",
1938            "parrot internal representation",
1939            "pasm",
1940            "pir",
1941        ]),
1942    );
1943    m.insert("Pascal", HashSet::from(["delphi", "objectpascal", "pascal"]));
1944    m.insert("Pawn", HashSet::from(["pawn"]));
1945    m.insert("Pep8", HashSet::from(["pep8"]));
1946    m.insert("Perl", HashSet::from(["cperl", "perl"]));
1947    m.insert("Pickle", HashSet::from(["pickle"]));
1948    m.insert("PicoLisp", HashSet::from(["picolisp"]));
1949    m.insert("PigLatin", HashSet::from(["piglatin"]));
1950    m.insert("Pike", HashSet::from(["pike"]));
1951    m.insert("Pip Requirements", HashSet::from(["pip requirements"]));
1952    m.insert("Pkl", HashSet::from(["pkl"]));
1953    m.insert("PlantUML", HashSet::from(["plantuml"]));
1954    m.insert("Pod", HashSet::from(["pod"]));
1955    m.insert("Pod 6", HashSet::from(["pod 6"]));
1956    m.insert("PogoScript", HashSet::from(["pogoscript"]));
1957    m.insert("Polar", HashSet::from(["polar"]));
1958    m.insert("Pony", HashSet::from(["pony"]));
1959    m.insert("Portugol", HashSet::from(["portugol"]));
1960    m.insert("PostScript", HashSet::from(["postscr", "postscript"]));
1961    m.insert("PowerBuilder", HashSet::from(["powerbuilder"]));
1962    m.insert("PowerShell", HashSet::from(["posh", "powershell", "pwsh"]));
1963    m.insert("Praat", HashSet::from(["praat"]));
1964    m.insert("Prisma", HashSet::from(["prisma"]));
1965    m.insert("Processing", HashSet::from(["processing"]));
1966    m.insert("Procfile", HashSet::from(["procfile"]));
1967    m.insert("Proguard", HashSet::from(["proguard"]));
1968    m.insert("Prolog", HashSet::from(["eclipse", "prolog"]));
1969    m.insert("Promela", HashSet::from(["promela"]));
1970    m.insert("Propeller Spin", HashSet::from(["propeller spin"]));
1971    m.insert(
1972        "Protocol Buffer",
1973        HashSet::from(["proto", "protobuf", "protocol buffer", "protocol buffers"]),
1974    );
1975    m.insert(
1976        "Protocol Buffer Text Format",
1977        HashSet::from(["protobuf text format", "protocol buffer text format", "text proto"]),
1978    );
1979    m.insert("Public Key", HashSet::from(["public key"]));
1980    m.insert("Pug", HashSet::from(["pug"]));
1981    m.insert("Puppet", HashSet::from(["puppet"]));
1982    m.insert("Pure Data", HashSet::from(["pure data"]));
1983    m.insert("PureBasic", HashSet::from(["purebasic"]));
1984    m.insert("PureScript", HashSet::from(["purescript"]));
1985    m.insert("Pyret", HashSet::from(["pyret"]));
1986    m.insert(
1987        "Python",
1988        HashSet::from([
1989            "easybuild",
1990            "numpy",
1991            "py",
1992            "py3",
1993            "pycon",
1994            "python",
1995            "python console",
1996            "python traceback",
1997            "python3",
1998            "rusthon",
1999            "snakefile",
2000            "snakemake",
2001        ]),
2002    );
2003    m.insert("Q#", HashSet::from(["q#", "qsharp"]));
2004    m.insert("QML", HashSet::from(["qml"]));
2005    m.insert("QMake", HashSet::from(["qmake"]));
2006    m.insert("Qt Script", HashSet::from(["qt script"]));
2007    m.insert("Quake", HashSet::from(["quake"]));
2008    m.insert("QuakeC", HashSet::from(["quakec"]));
2009    m.insert(
2010        "QuickBASIC",
2011        HashSet::from([
2012            "classic qbasic",
2013            "classic quickbasic",
2014            "qb",
2015            "qb64",
2016            "qbasic",
2017            "quickbasic",
2018        ]),
2019    );
2020    m.insert("R", HashSet::from(["r", "rscript", "splus"]));
2021    m.insert("RAML", HashSet::from(["raml"]));
2022    m.insert("RAScript", HashSet::from(["rascript"]));
2023    m.insert("RDoc", HashSet::from(["rdoc"]));
2024    m.insert("REALbasic", HashSet::from(["realbasic"]));
2025    m.insert("REXX", HashSet::from(["arexx", "rexx"]));
2026    m.insert("RMarkdown", HashSet::from(["rmarkdown"]));
2027    m.insert("RON", HashSet::from(["ron"]));
2028    m.insert("ROS Interface", HashSet::from(["ros interface", "rosmsg"]));
2029    m.insert("RPC", HashSet::from(["oncrpc", "rpc", "rpcgen", "xdr"]));
2030    m.insert("RPGLE", HashSet::from(["ile rpg", "rpgle", "sqlrpgle"]));
2031    m.insert("RPM Spec", HashSet::from(["rpm spec", "specfile"]));
2032    m.insert("RUNOFF", HashSet::from(["runoff"]));
2033    m.insert("Racket", HashSet::from(["racket"]));
2034    m.insert("Ragel", HashSet::from(["ragel", "ragel-rb", "ragel-ruby"]));
2035    m.insert("Raku", HashSet::from(["perl-6", "perl6", "raku"]));
2036    m.insert("Rascal", HashSet::from(["rascal"]));
2037    m.insert("Raw token data", HashSet::from(["raw", "raw token data"]));
2038    m.insert("ReScript", HashSet::from(["rescript"]));
2039    m.insert("Reason", HashSet::from(["reason"]));
2040    m.insert("Rebol", HashSet::from(["rebol"]));
2041    m.insert("Record Jar", HashSet::from(["record jar"]));
2042    m.insert("Red", HashSet::from(["red", "red/system"]));
2043    m.insert("Redcode", HashSet::from(["redcode"]));
2044    m.insert("Redirect Rules", HashSet::from(["redirect rules", "redirects"]));
2045    m.insert(
2046        "Regular Expression",
2047        HashSet::from(["regex", "regexp", "regular expression"]),
2048    );
2049    m.insert("Ren'Py", HashSet::from(["ren'py", "renpy"]));
2050    m.insert("RenderScript", HashSet::from(["filterscript", "renderscript"]));
2051    m.insert("Rez", HashSet::from(["rez"]));
2052    m.insert("Rich Text Format", HashSet::from(["rich text format"]));
2053    m.insert("Ring", HashSet::from(["ring"]));
2054    m.insert("Riot", HashSet::from(["riot"]));
2055    m.insert("RobotFramework", HashSet::from(["robotframework"]));
2056    m.insert("Roc", HashSet::from(["roc"]));
2057    m.insert("Rocq Prover", HashSet::from(["coq", "rocq", "rocq prover"]));
2058    m.insert(
2059        "Roff",
2060        HashSet::from([
2061            "groff",
2062            "man",
2063            "man page",
2064            "man-page",
2065            "manpage",
2066            "mdoc",
2067            "nroff",
2068            "pic",
2069            "pikchr",
2070            "roff",
2071            "roff manpage",
2072            "troff",
2073        ]),
2074    );
2075    m.insert("Rouge", HashSet::from(["rouge"]));
2076    m.insert("RouterOS Script", HashSet::from(["routeros script"]));
2077    m.insert(
2078        "Ruby",
2079        HashSet::from(["jruby", "macruby", "rake", "rb", "rbs", "rbx", "ruby"]),
2080    );
2081    m.insert("Rust", HashSet::from(["rs", "rust"]));
2082    m.insert("SAS", HashSet::from(["sas"]));
2083    m.insert("SCSS", HashSet::from(["scss"]));
2084    m.insert(
2085        "SELinux Policy",
2086        HashSet::from(["selinux kernel policy language", "selinux policy", "sepolicy"]),
2087    );
2088    m.insert("SMT", HashSet::from(["smt"]));
2089    m.insert("SPARQL", HashSet::from(["sparql"]));
2090    m.insert("SQF", HashSet::from(["sqf"]));
2091    m.insert("SQL", HashSet::from(["sql"]));
2092    m.insert("SQLPL", HashSet::from(["sqlpl"]));
2093    m.insert("SRecode Template", HashSet::from(["srecode template"]));
2094    m.insert("STAR", HashSet::from(["star"]));
2095    m.insert("STL", HashSet::from(["ascii stl", "stl", "stla"]));
2096    m.insert("SVG", HashSet::from(["svg"]));
2097    m.insert("SWIG", HashSet::from(["swig"]));
2098    m.insert("Sage", HashSet::from(["sage"]));
2099    m.insert("Sail", HashSet::from(["sail"]));
2100    m.insert("SaltStack", HashSet::from(["salt", "saltstack", "saltstate"]));
2101    m.insert("Sass", HashSet::from(["sass"]));
2102    m.insert("Scala", HashSet::from(["scala"]));
2103    m.insert("Scaml", HashSet::from(["scaml"]));
2104    m.insert("Scenic", HashSet::from(["scenic"]));
2105    m.insert("Scheme", HashSet::from(["scheme"]));
2106    m.insert("Scilab", HashSet::from(["scilab"]));
2107    m.insert("Self", HashSet::from(["self"]));
2108    m.insert("ShaderLab", HashSet::from(["shaderlab"]));
2109    m.insert(
2110        "Shell",
2111        HashSet::from([
2112            "abuild",
2113            "alpine abuild",
2114            "apkbuild",
2115            "bash",
2116            "envrc",
2117            "fish",
2118            "gentoo ebuild",
2119            "gentoo eclass",
2120            "openrc",
2121            "openrc runscript",
2122            "sh",
2123            "shell",
2124            "shell-script",
2125            "tcsh",
2126            "zsh",
2127        ]),
2128    );
2129    m.insert(
2130        "ShellCheck Config",
2131        HashSet::from(["shellcheck config", "shellcheckrc"]),
2132    );
2133    m.insert(
2134        "ShellSession",
2135        HashSet::from(["bash session", "console", "shellsession"]),
2136    );
2137    m.insert("Shen", HashSet::from(["shen"]));
2138    m.insert("Sieve", HashSet::from(["sieve"]));
2139    m.insert("Singularity", HashSet::from(["singularity"]));
2140    m.insert("Slang", HashSet::from(["slang"]));
2141    m.insert("Slash", HashSet::from(["slash"]));
2142    m.insert("Slice", HashSet::from(["slice"]));
2143    m.insert("Slim", HashSet::from(["slim"]));
2144    m.insert("Slint", HashSet::from(["slint"]));
2145    m.insert("SmPL", HashSet::from(["coccinelle", "smpl"]));
2146    m.insert("Smali", HashSet::from(["smali"]));
2147    m.insert("Smalltalk", HashSet::from(["smalltalk", "squeak", "ston"]));
2148    m.insert("Smarty", HashSet::from(["smarty"]));
2149    m.insert("Smithy", HashSet::from(["smithy"]));
2150    m.insert("Solidity", HashSet::from(["solidity"]));
2151    m.insert("Soong", HashSet::from(["soong"]));
2152    m.insert("SourcePawn", HashSet::from(["sourcemod", "sourcepawn"]));
2153    m.insert("Spline Font Database", HashSet::from(["spline font database"]));
2154    m.insert("Squirrel", HashSet::from(["squirrel"]));
2155    m.insert("Stan", HashSet::from(["stan"]));
2156    m.insert("Standard ML", HashSet::from(["sml", "standard ml"]));
2157    m.insert("Starlark", HashSet::from(["bazel", "bzl", "starlark"]));
2158    m.insert("Stata", HashSet::from(["stata"]));
2159    m.insert("StringTemplate", HashSet::from(["stringtemplate"]));
2160    m.insert("Stylus", HashSet::from(["stylus"]));
2161    m.insert("SubRip Text", HashSet::from(["subrip text"]));
2162    m.insert("SugarSS", HashSet::from(["sugarss"]));
2163    m.insert("SuperCollider", HashSet::from(["supercollider"]));
2164    m.insert("SurrealQL", HashSet::from(["surql", "surrealql"]));
2165    m.insert("Survex data", HashSet::from(["survex data"]));
2166    m.insert("Svelte", HashSet::from(["svelte"]));
2167    m.insert("Sway", HashSet::from(["sway"]));
2168    m.insert("Sweave", HashSet::from(["sweave"]));
2169    m.insert("Swift", HashSet::from(["swift"]));
2170    m.insert("SystemVerilog", HashSet::from(["systemverilog"]));
2171    m.insert("TI Program", HashSet::from(["ti program"]));
2172    m.insert("TL-Verilog", HashSet::from(["tl-verilog"]));
2173    m.insert("TLA", HashSet::from(["tla"]));
2174    m.insert("TMDL", HashSet::from(["tabular model definition language", "tmdl"]));
2175    m.insert("TOML", HashSet::from(["toml"]));
2176    m.insert(
2177        "TSPLIB data",
2178        HashSet::from([
2179            "traveling salesman problem",
2180            "travelling salesman problem",
2181            "tsplib data",
2182        ]),
2183    );
2184    m.insert("TSQL", HashSet::from(["tsql"]));
2185    m.insert("TSV", HashSet::from(["tab-seperated values", "tsv"]));
2186    m.insert("TXL", HashSet::from(["txl"]));
2187    m.insert("Tact", HashSet::from(["tact"]));
2188    m.insert("Talon", HashSet::from(["talon"]));
2189    m.insert("Tcl", HashSet::from(["sdc", "tcl", "xdc"]));
2190    m.insert("TeX", HashSet::from(["bibtex", "latex", "tex"]));
2191    m.insert("Tea", HashSet::from(["tea"]));
2192    m.insert("Teal", HashSet::from(["teal"]));
2193    m.insert("Terra", HashSet::from(["terra"]));
2194    m.insert("Texinfo", HashSet::from(["texinfo"]));
2195    m.insert("Text", HashSet::from(["fundamental", "plain text", "text"]));
2196    m.insert("TextGrid", HashSet::from(["textgrid"]));
2197    m.insert(
2198        "TextMate Properties",
2199        HashSet::from(["textmate properties", "tm-properties"]),
2200    );
2201    m.insert("Textile", HashSet::from(["textile"]));
2202    m.insert("Thrift", HashSet::from(["thrift"]));
2203    m.insert("Toit", HashSet::from(["toit"]));
2204    m.insert("Tor Config", HashSet::from(["tor config", "torrc"]));
2205    m.insert("Tree-sitter Query", HashSet::from(["tree-sitter query", "tsq"]));
2206    m.insert("Turing", HashSet::from(["turing"]));
2207    m.insert("Turtle", HashSet::from(["turtle"]));
2208    m.insert("Twig", HashSet::from(["twig"]));
2209    m.insert("Type Language", HashSet::from(["tl", "type language"]));
2210    m.insert(
2211        "TypeScript",
2212        HashSet::from(["glimmer ts", "gts", "ts", "tsx", "typescript"]),
2213    );
2214    m.insert("TypeSpec", HashSet::from(["tsp", "typespec"]));
2215    m.insert("Typst", HashSet::from(["typ", "typst"]));
2216    m.insert("Unity3D Asset", HashSet::from(["unity3d asset"]));
2217    m.insert("Uno", HashSet::from(["uno"]));
2218    m.insert("UnrealScript", HashSet::from(["unrealscript"]));
2219    m.insert("Untyped Plutus Core", HashSet::from(["untyped plutus core"]));
2220    m.insert("UrWeb", HashSet::from(["ur", "ur/web", "urweb"]));
2221    m.insert("V", HashSet::from(["v", "vlang"]));
2222    m.insert("VBA", HashSet::from(["vba", "visual basic for applications"]));
2223    m.insert("VBScript", HashSet::from(["vbscript"]));
2224    m.insert("VCL", HashSet::from(["vcl"]));
2225    m.insert("VHDL", HashSet::from(["vhdl"]));
2226    m.insert("Vala", HashSet::from(["vala"]));
2227    m.insert(
2228        "Valve Data Format",
2229        HashSet::from(["keyvalues", "valve data format", "vdf"]),
2230    );
2231    m.insert(
2232        "Velocity Template Language",
2233        HashSet::from(["velocity", "velocity template language", "vtl"]),
2234    );
2235    m.insert("Vento", HashSet::from(["vento"]));
2236    m.insert("Verilog", HashSet::from(["verilog"]));
2237    m.insert("Vim Help File", HashSet::from(["help", "vim help file", "vimhelp"]));
2238    m.insert(
2239        "Vim Script",
2240        HashSet::from(["nvim", "vim", "vim script", "viml", "vimscript"]),
2241    );
2242    m.insert(
2243        "Vim Snippet",
2244        HashSet::from(["neosnippet", "snipmate", "ultisnip", "ultisnips", "vim snippet"]),
2245    );
2246    m.insert(
2247        "Visual Basic .NET",
2248        HashSet::from(["vb .net", "vb.net", "vbnet", "visual basic", "visual basic .net"]),
2249    );
2250    m.insert(
2251        "Visual Basic 6.0",
2252        HashSet::from([
2253            "classic visual basic",
2254            "vb 6",
2255            "vb6",
2256            "visual basic 6",
2257            "visual basic 6.0",
2258            "visual basic classic",
2259        ]),
2260    );
2261    m.insert("Volt", HashSet::from(["volt"]));
2262    m.insert("Vue", HashSet::from(["vue"]));
2263    m.insert("Vyper", HashSet::from(["vyper"]));
2264    m.insert("WDL", HashSet::from(["wdl", "workflow description language"]));
2265    m.insert("WGSL", HashSet::from(["wgsl"]));
2266    m.insert("Wavefront Material", HashSet::from(["wavefront material"]));
2267    m.insert("Wavefront Object", HashSet::from(["wavefront object"]));
2268    m.insert("Web Ontology Language", HashSet::from(["web ontology language"]));
2269    m.insert("WebAssembly", HashSet::from(["wasm", "wast", "webassembly"]));
2270    m.insert(
2271        "WebAssembly Interface Type",
2272        HashSet::from(["webassembly interface type", "wit"]),
2273    );
2274    m.insert("WebIDL", HashSet::from(["webidl"]));
2275    m.insert("WebVTT", HashSet::from(["vtt", "webvtt"]));
2276    m.insert("Whiley", HashSet::from(["whiley"]));
2277    m.insert("Wikitext", HashSet::from(["mediawiki", "wiki", "wikitext"]));
2278    m.insert("Win32 Message File", HashSet::from(["win32 message file"]));
2279    m.insert("Windows Registry Entries", HashSet::from(["windows registry entries"]));
2280    m.insert("Witcher Script", HashSet::from(["witcher script"]));
2281    m.insert(
2282        "Wolfram Language",
2283        HashSet::from([
2284            "mathematica",
2285            "mma",
2286            "wl",
2287            "wolfram",
2288            "wolfram lang",
2289            "wolfram language",
2290        ]),
2291    );
2292    m.insert("Wollok", HashSet::from(["wollok"]));
2293    m.insert(
2294        "World of Warcraft Addon Data",
2295        HashSet::from(["world of warcraft addon data"]),
2296    );
2297    m.insert("Wren", HashSet::from(["wren", "wrenlang"]));
2298    m.insert("X Font Directory Index", HashSet::from(["x font directory index"]));
2299    m.insert("X10", HashSet::from(["x10", "xten"]));
2300    m.insert("XC", HashSet::from(["xc"]));
2301    m.insert("XCompose", HashSet::from(["xcompose"]));
2302    m.insert(
2303        "XML",
2304        HashSet::from(["maven pom", "rss", "wsdl", "xml", "xml property list", "xsd"]),
2305    );
2306    m.insert("XPages", HashSet::from(["xpages"]));
2307    m.insert("XProc", HashSet::from(["xproc"]));
2308    m.insert("XQuery", HashSet::from(["xquery"]));
2309    m.insert("XS", HashSet::from(["xs"]));
2310    m.insert("XSLT", HashSet::from(["xsl", "xslt"]));
2311    m.insert("Xmake", HashSet::from(["xmake"]));
2312    m.insert("Xojo", HashSet::from(["xojo"]));
2313    m.insert("Xonsh", HashSet::from(["xonsh"]));
2314    m.insert("Xtend", HashSet::from(["xtend"]));
2315    m.insert("YAML", HashSet::from(["yaml", "yml"]));
2316    m.insert("YANG", HashSet::from(["yang"]));
2317    m.insert("YARA", HashSet::from(["yara"]));
2318    m.insert("YASnippet", HashSet::from(["snippet", "yas", "yasnippet"]));
2319    m.insert("Yacc", HashSet::from(["bison", "jison", "yacc"]));
2320    m.insert("Yul", HashSet::from(["yul"]));
2321    m.insert("ZAP", HashSet::from(["zap"]));
2322    m.insert("ZIL", HashSet::from(["zil"]));
2323    m.insert("Zeek", HashSet::from(["bro", "zeek"]));
2324    m.insert("ZenScript", HashSet::from(["zenscript"]));
2325    m.insert("Zephir", HashSet::from(["zephir"]));
2326    m.insert("Zig", HashSet::from(["zig"]));
2327    m.insert("Zimpl", HashSet::from(["zimpl"]));
2328    m.insert("Zmodel", HashSet::from(["zmodel"]));
2329    m.insert("crontab", HashSet::from(["cron", "cron table", "crontab"]));
2330    m.insert("desktop", HashSet::from(["desktop"]));
2331    m.insert("dircolors", HashSet::from(["dircolors"]));
2332    m.insert("eC", HashSet::from(["ec"]));
2333    m.insert("edn", HashSet::from(["edn"]));
2334    m.insert("hoon", HashSet::from(["hoon"]));
2335    m.insert("iCalendar", HashSet::from(["ical", "icalendar"]));
2336    m.insert("jq", HashSet::from(["jq"]));
2337    m.insert("kvlang", HashSet::from(["kvlang"]));
2338    m.insert("mIRC Script", HashSet::from(["mirc script"]));
2339    m.insert("mcfunction", HashSet::from(["mcfunction"]));
2340    m.insert("mdsvex", HashSet::from(["mdsvex"]));
2341    m.insert("mupad", HashSet::from(["mupad"]));
2342    m.insert("nesC", HashSet::from(["nesc"]));
2343    m.insert("ooc", HashSet::from(["ooc"]));
2344    m.insert("q", HashSet::from(["q"]));
2345    m.insert("reStructuredText", HashSet::from(["restructuredtext", "rst"]));
2346    m.insert("robots.txt", HashSet::from(["robots", "robots txt", "robots.txt"]));
2347    m.insert("sed", HashSet::from(["sed"]));
2348    m.insert("templ", HashSet::from(["templ"]));
2349    m.insert(
2350        "vCard",
2351        HashSet::from(["electronic business card", "vcard", "virtual contact file"]),
2352    );
2353    m.insert("wisp", HashSet::from(["wisp"]));
2354    m.insert("xBase", HashSet::from(["advpl", "clipper", "foxpro", "xbase"]));
2355    m
2356});
2357
2358/// Preferred default alias for common languages (curated for widespread usage)
2359pub static DEFAULT_ALIASES: LazyLock<HashMap<&'static str, &'static str>> = LazyLock::new(|| {
2360    let mut m = HashMap::with_capacity(39);
2361    m.insert("C", "c");
2362    m.insert("C#", "csharp");
2363    m.insert("C++", "cpp");
2364    m.insert("CSS", "css");
2365    m.insert("Clojure", "clojure");
2366    m.insert("Dart", "dart");
2367    m.insert("Dockerfile", "dockerfile");
2368    m.insert("Elixir", "elixir");
2369    m.insert("Erlang", "erlang");
2370    m.insert("Go", "go");
2371    m.insert("GraphQL", "graphql");
2372    m.insert("HTML", "html");
2373    m.insert("Haskell", "haskell");
2374    m.insert("JSON", "json");
2375    m.insert("Java", "java");
2376    m.insert("JavaScript", "js");
2377    m.insert("Julia", "julia");
2378    m.insert("Kotlin", "kotlin");
2379    m.insert("Less", "less");
2380    m.insert("Lua", "lua");
2381    m.insert("Makefile", "makefile");
2382    m.insert("Markdown", "markdown");
2383    m.insert("Objective-C", "objc");
2384    m.insert("PHP", "php");
2385    m.insert("Perl", "perl");
2386    m.insert("Python", "python");
2387    m.insert("R", "r");
2388    m.insert("Ruby", "ruby");
2389    m.insert("Rust", "rust");
2390    m.insert("SCSS", "scss");
2391    m.insert("SQL", "sql");
2392    m.insert("Sass", "sass");
2393    m.insert("Scala", "scala");
2394    m.insert("Shell", "bash");
2395    m.insert("Swift", "swift");
2396    m.insert("TOML", "toml");
2397    m.insert("TypeScript", "ts");
2398    m.insert("XML", "xml");
2399    m.insert("YAML", "yaml");
2400    m
2401});
2402
2403/// File extensions (lowercased, leading dot stripped) of every Linguist
2404/// language. GitHub resolves fenced-code labels against names, aliases, AND
2405/// extensions (```pytb highlights via Python traceback's `.pytb` extension,
2406/// with no such alias existing), so "is this label known" must consult this
2407/// set. Extensions are deliberately NOT resolvable to a canonical language:
2408/// many are ambiguous across languages (`.pl` is Perl and Prolog), so they
2409/// participate in existence checks only, never in label rewriting.
2410///
2411/// Generated by scripts/gen_linguist_extensions.py from the pinned
2412/// languages.yml (see LINGUIST_VERSION).
2413pub static KNOWN_EXTENSIONS: LazyLock<HashSet<&'static str>> = LazyLock::new(|| {
2414    let mut s = HashSet::new();
2415    s.insert("1");
2416    s.insert("1in");
2417    s.insert("1m");
2418    s.insert("1x");
2419    s.insert("2");
2420    s.insert("2da");
2421    s.insert("3");
2422    s.insert("3in");
2423    s.insert("3m");
2424    s.insert("3p");
2425    s.insert("3pm");
2426    s.insert("3qt");
2427    s.insert("3x");
2428    s.insert("4");
2429    s.insert("4dform");
2430    s.insert("4dm");
2431    s.insert("4dproject");
2432    s.insert("4gl");
2433    s.insert("4th");
2434    s.insert("5");
2435    s.insert("6");
2436    s.insert("6pl");
2437    s.insert("6pm");
2438    s.insert("7");
2439    s.insert("8");
2440    s.insert("8xp");
2441    s.insert("8xp.txt");
2442    s.insert("9");
2443    s.insert("_coffee");
2444    s.insert("_js");
2445    s.insert("_ls");
2446    s.insert("a51");
2447    s.insert("abap");
2448    s.insert("abnf");
2449    s.insert("action");
2450    s.insert("ada");
2451    s.insert("adb");
2452    s.insert("adml");
2453    s.insert("admx");
2454    s.insert("ado");
2455    s.insert("adoc");
2456    s.insert("adp");
2457    s.insert("ads");
2458    s.insert("afm");
2459    s.insert("agc");
2460    s.insert("agda");
2461    s.insert("ahk");
2462    s.insert("ahkl");
2463    s.insert("aidl");
2464    s.insert("aj");
2465    s.insert("ak");
2466    s.insert("al");
2467    s.insert("alg");
2468    s.insert("als");
2469    s.insert("ampl");
2470    s.insert("angelscript");
2471    s.insert("anim");
2472    s.insert("ant");
2473    s.insert("antlers.html");
2474    s.insert("antlers.php");
2475    s.insert("antlers.xml");
2476    s.insert("apacheconf");
2477    s.insert("apex");
2478    s.insert("apib");
2479    s.insert("apl");
2480    s.insert("app");
2481    s.insert("app.src");
2482    s.insert("applescript");
2483    s.insert("arc");
2484    s.insert("arpa");
2485    s.insert("arr");
2486    s.insert("as");
2487    s.insert("asax");
2488    s.insert("asc");
2489    s.insert("asciidoc");
2490    s.insert("ascx");
2491    s.insert("asd");
2492    s.insert("asddls");
2493    s.insert("ash");
2494    s.insert("ashx");
2495    s.insert("asl");
2496    s.insert("asm");
2497    s.insert("asmx");
2498    s.insert("asn");
2499    s.insert("asn1");
2500    s.insert("asp");
2501    s.insert("aspx");
2502    s.insert("asset");
2503    s.insert("astro");
2504    s.insert("asy");
2505    s.insert("au3");
2506    s.insert("aug");
2507    s.insert("auk");
2508    s.insert("aux");
2509    s.insert("avdl");
2510    s.insert("avsc");
2511    s.insert("aw");
2512    s.insert("awk");
2513    s.insert("axaml");
2514    s.insert("axd");
2515    s.insert("axi");
2516    s.insert("axi.erb");
2517    s.insert("axml");
2518    s.insert("axs");
2519    s.insert("axs.erb");
2520    s.insert("b");
2521    s.insert("bal");
2522    s.insert("bas");
2523    s.insert("bash");
2524    s.insert("bat");
2525    s.insert("bats");
2526    s.insert("bb");
2527    s.insert("bbappend");
2528    s.insert("bbclass");
2529    s.insert("bbx");
2530    s.insert("bdf");
2531    s.insert("bdy");
2532    s.insert("be");
2533    s.insert("befunge");
2534    s.insert("bf");
2535    s.insert("bi");
2536    s.insert("bib");
2537    s.insert("bibtex");
2538    s.insert("bicep");
2539    s.insert("bicepparam");
2540    s.insert("bison");
2541    s.insert("blade");
2542    s.insert("blade.php");
2543    s.insert("bmx");
2544    s.insert("bones");
2545    s.insert("boo");
2546    s.insert("boot");
2547    s.insert("bpl");
2548    s.insert("bqn");
2549    s.insert("brd");
2550    s.insert("bro");
2551    s.insert("brs");
2552    s.insert("bru");
2553    s.insert("bs");
2554    s.insert("bsl");
2555    s.insert("bst");
2556    s.insert("bsv");
2557    s.insert("builder");
2558    s.insert("builds");
2559    s.insert("bzl");
2560    s.insert("c");
2561    s.insert("c++");
2562    s.insert("c++-objdump");
2563    s.insert("c++objdump");
2564    s.insert("c-objdump");
2565    s.insert("c3");
2566    s.insert("cabal");
2567    s.insert("caddyfile");
2568    s.insert("cairo");
2569    s.insert("cake");
2570    s.insert("capnp");
2571    s.insert("carbon");
2572    s.insert("cats");
2573    s.insert("cbl");
2574    s.insert("cbx");
2575    s.insert("cc");
2576    s.insert("ccp");
2577    s.insert("ccproj");
2578    s.insert("ccxml");
2579    s.insert("cdc");
2580    s.insert("cdf");
2581    s.insert("cds");
2582    s.insert("ceylon");
2583    s.insert("cfc");
2584    s.insert("cfg");
2585    s.insert("cfm");
2586    s.insert("cfml");
2587    s.insert("cgi");
2588    s.insert("cginc");
2589    s.insert("ch");
2590    s.insert("chem");
2591    s.insert("chpl");
2592    s.insert("chs");
2593    s.insert("cil");
2594    s.insert("circom");
2595    s.insert("cirru");
2596    s.insert("cj");
2597    s.insert("cjs");
2598    s.insert("cjsx");
2599    s.insert("ck");
2600    s.insert("cl");
2601    s.insert("cl2");
2602    s.insert("clar");
2603    s.insert("click");
2604    s.insert("clixml");
2605    s.insert("clj");
2606    s.insert("cljc");
2607    s.insert("cljs");
2608    s.insert("cljs.hl");
2609    s.insert("cljscm");
2610    s.insert("cljx");
2611    s.insert("clp");
2612    s.insert("cls");
2613    s.insert("clue");
2614    s.insert("clw");
2615    s.insert("cmake");
2616    s.insert("cmake.in");
2617    s.insert("cmd");
2618    s.insert("cmp");
2619    s.insert("cnc");
2620    s.insert("cnf");
2621    s.insert("cob");
2622    s.insert("cobol");
2623    s.insert("cocci");
2624    s.insert("code-snippets");
2625    s.insert("code-workspace");
2626    s.insert("coffee");
2627    s.insert("coffee.md");
2628    s.insert("com");
2629    s.insert("command");
2630    s.insert("conll");
2631    s.insert("conllu");
2632    s.insert("containerfile");
2633    s.insert("cook");
2634    s.insert("coq");
2635    s.insert("cp");
2636    s.insert("cpp");
2637    s.insert("cpp-objdump");
2638    s.insert("cppm");
2639    s.insert("cppobjdump");
2640    s.insert("cproject");
2641    s.insert("cps");
2642    s.insert("cpy");
2643    s.insert("cql");
2644    s.insert("cr");
2645    s.insert("crc32");
2646    s.insert("creole");
2647    s.insert("cs");
2648    s.insert("cs.pp");
2649    s.insert("csc");
2650    s.insert("cscfg");
2651    s.insert("csd");
2652    s.insert("csdef");
2653    s.insert("csh");
2654    s.insert("cshtml");
2655    s.insert("csl");
2656    s.insert("cson");
2657    s.insert("csproj");
2658    s.insert("css");
2659    s.insert("csv");
2660    s.insert("csx");
2661    s.insert("ct");
2662    s.insert("ctl");
2663    s.insert("ctp");
2664    s.insert("cts");
2665    s.insert("cu");
2666    s.insert("cue");
2667    s.insert("cuh");
2668    s.insert("curry");
2669    s.insert("cw");
2670    s.insert("cwl");
2671    s.insert("cxx");
2672    s.insert("cxx-objdump");
2673    s.insert("cy");
2674    s.insert("cylc");
2675    s.insert("cyp");
2676    s.insert("cypher");
2677    s.insert("d");
2678    s.insert("d-objdump");
2679    s.insert("d2");
2680    s.insert("dae");
2681    s.insert("darcspatch");
2682    s.insert("dart");
2683    s.insert("das");
2684    s.insert("dats");
2685    s.insert("db2");
2686    s.insert("dcl");
2687    s.insert("ddl");
2688    s.insert("decls");
2689    s.insert("depproj");
2690    s.insert("desktop");
2691    s.insert("desktop.in");
2692    s.insert("dfm");
2693    s.insert("dfy");
2694    s.insert("dhall");
2695    s.insert("di");
2696    s.insert("diff");
2697    s.insert("dircolors");
2698    s.insert("dita");
2699    s.insert("ditamap");
2700    s.insert("ditaval");
2701    s.insert("djs");
2702    s.insert("dll.config");
2703    s.insert("dlm");
2704    s.insert("dm");
2705    s.insert("do");
2706    s.insert("dockerfile");
2707    s.insert("dof");
2708    s.insert("doh");
2709    s.insert("dot");
2710    s.insert("dotsettings");
2711    s.insert("dpatch");
2712    s.insert("dpr");
2713    s.insert("druby");
2714    s.insert("dsc");
2715    s.insert("dsl");
2716    s.insert("dsp");
2717    s.insert("dsr");
2718    s.insert("dtx");
2719    s.insert("duby");
2720    s.insert("dwl");
2721    s.insert("dyalog");
2722    s.insert("dyl");
2723    s.insert("dylan");
2724    s.insert("dzn");
2725    s.insert("e");
2726    s.insert("eam.fs");
2727    s.insert("eb");
2728    s.insert("ebnf");
2729    s.insert("ebuild");
2730    s.insert("ec");
2731    s.insert("ecl");
2732    s.insert("eclass");
2733    s.insert("eclxml");
2734    s.insert("ecr");
2735    s.insert("ect");
2736    s.insert("edc");
2737    s.insert("edge");
2738    s.insert("edgeql");
2739    s.insert("editorconfig");
2740    s.insert("edn");
2741    s.insert("eh");
2742    s.insert("ejs");
2743    s.insert("ejs.t");
2744    s.insert("el");
2745    s.insert("eliom");
2746    s.insert("eliomi");
2747    s.insert("elm");
2748    s.insert("elv");
2749    s.insert("em");
2750    s.insert("emacs");
2751    s.insert("emacs.desktop");
2752    s.insert("emberscript");
2753    s.insert("eml");
2754    s.insert("env");
2755    s.insert("epj");
2756    s.insert("eps");
2757    s.insert("epsi");
2758    s.insert("eq");
2759    s.insert("erb");
2760    s.insert("erb.deface");
2761    s.insert("erl");
2762    s.insert("es");
2763    s.insert("es6");
2764    s.insert("escript");
2765    s.insert("esdl");
2766    s.insert("ex");
2767    s.insert("exs");
2768    s.insert("eye");
2769    s.insert("f");
2770    s.insert("f03");
2771    s.insert("f08");
2772    s.insert("f77");
2773    s.insert("f90");
2774    s.insert("f95");
2775    s.insert("factor");
2776    s.insert("fan");
2777    s.insert("fancypack");
2778    s.insert("fcgi");
2779    s.insert("fea");
2780    s.insert("feature");
2781    s.insert("filters");
2782    s.insert("fir");
2783    s.insert("fish");
2784    s.insert("flex");
2785    s.insert("flf");
2786    s.insert("flix");
2787    s.insert("flux");
2788    s.insert("fnc");
2789    s.insert("fnl");
2790    s.insert("for");
2791    s.insert("forth");
2792    s.insert("fp");
2793    s.insert("fpp");
2794    s.insert("fr");
2795    s.insert("frag");
2796    s.insert("frg");
2797    s.insert("frm");
2798    s.insert("frt");
2799    s.insert("fs");
2800    s.insert("fsh");
2801    s.insert("fshader");
2802    s.insert("fsi");
2803    s.insert("fsproj");
2804    s.insert("fst");
2805    s.insert("fsti");
2806    s.insert("fsx");
2807    s.insert("fth");
2808    s.insert("ftl");
2809    s.insert("ftlh");
2810    s.insert("fun");
2811    s.insert("fut");
2812    s.insert("fx");
2813    s.insert("fxh");
2814    s.insert("fxml");
2815    s.insert("fy");
2816    s.insert("g");
2817    s.insert("g4");
2818    s.insert("gaml");
2819    s.insert("gap");
2820    s.insert("gawk");
2821    s.insert("gbl");
2822    s.insert("gbo");
2823    s.insert("gbp");
2824    s.insert("gbr");
2825    s.insert("gbs");
2826    s.insert("gco");
2827    s.insert("gcode");
2828    s.insert("gd");
2829    s.insert("gdb");
2830    s.insert("gdbinit");
2831    s.insert("gdnlib");
2832    s.insert("gdns");
2833    s.insert("gdshader");
2834    s.insert("gdshaderinc");
2835    s.insert("ged");
2836    s.insert("gemspec");
2837    s.insert("geo");
2838    s.insert("geojson");
2839    s.insert("geom");
2840    s.insert("gf");
2841    s.insert("gi");
2842    s.insert("gitconfig");
2843    s.insert("gitignore");
2844    s.insert("gjs");
2845    s.insert("gko");
2846    s.insert("glade");
2847    s.insert("gleam");
2848    s.insert("glf");
2849    s.insert("glsl");
2850    s.insert("glslf");
2851    s.insert("glslv");
2852    s.insert("gltf");
2853    s.insert("glyphs");
2854    s.insert("gmi");
2855    s.insert("gml");
2856    s.insert("gms");
2857    s.insert("gmx");
2858    s.insert("gn");
2859    s.insert("gni");
2860    s.insert("gnu");
2861    s.insert("gnuplot");
2862    s.insert("go");
2863    s.insert("god");
2864    s.insert("gohtml");
2865    s.insert("golo");
2866    s.insert("gotmpl");
2867    s.insert("gp");
2868    s.insert("gpb");
2869    s.insert("gpt");
2870    s.insert("gpx");
2871    s.insert("gql");
2872    s.insert("grace");
2873    s.insert("gradle");
2874    s.insert("gradle.kts");
2875    s.insert("graphql");
2876    s.insert("graphqls");
2877    s.insert("groovy");
2878    s.insert("grt");
2879    s.insert("grxml");
2880    s.insert("gs");
2881    s.insert("gsc");
2882    s.insert("gsh");
2883    s.insert("gshader");
2884    s.insert("gsp");
2885    s.insert("gst");
2886    s.insert("gsx");
2887    s.insert("gtl");
2888    s.insert("gto");
2889    s.insert("gtp");
2890    s.insert("gtpl");
2891    s.insert("gts");
2892    s.insert("gv");
2893    s.insert("gvy");
2894    s.insert("gyp");
2895    s.insert("gypi");
2896    s.insert("h");
2897    s.insert("h++");
2898    s.insert("h.in");
2899    s.insert("ha");
2900    s.insert("hack");
2901    s.insert("haml");
2902    s.insert("haml.deface");
2903    s.insert("handlebars");
2904    s.insert("har");
2905    s.insert("hats");
2906    s.insert("hb");
2907    s.insert("hbs");
2908    s.insert("hc");
2909    s.insert("hcl");
2910    s.insert("heex");
2911    s.insert("hh");
2912    s.insert("hhi");
2913    s.insert("hic");
2914    s.insert("hip");
2915    s.insert("hlean");
2916    s.insert("hlsl");
2917    s.insert("hlsli");
2918    s.insert("hocon");
2919    s.insert("hoon");
2920    s.insert("hpp");
2921    s.insert("hqf");
2922    s.insert("hql");
2923    s.insert("hrl");
2924    s.insert("hs");
2925    s.insert("hs-boot");
2926    s.insert("hsc");
2927    s.insert("hta");
2928    s.insert("htm");
2929    s.insert("html");
2930    s.insert("html.eex");
2931    s.insert("html.hl");
2932    s.insert("html.tmpl");
2933    s.insert("http");
2934    s.insert("hurl");
2935    s.insert("hx");
2936    s.insert("hxml");
2937    s.insert("hxsl");
2938    s.insert("hxx");
2939    s.insert("hy");
2940    s.insert("hzp");
2941    s.insert("i");
2942    s.insert("i3");
2943    s.insert("i7x");
2944    s.insert("ical");
2945    s.insert("ice");
2946    s.insert("iced");
2947    s.insert("icl");
2948    s.insert("ics");
2949    s.insert("idc");
2950    s.insert("idr");
2951    s.insert("ig");
2952    s.insert("ihlp");
2953    s.insert("ijm");
2954    s.insert("ijs");
2955    s.insert("ik");
2956    s.insert("ily");
2957    s.insert("imba");
2958    s.insert("iml");
2959    s.insert("inc");
2960    s.insert("ini");
2961    s.insert("ink");
2962    s.insert("inl");
2963    s.insert("ino");
2964    s.insert("ins");
2965    s.insert("intr");
2966    s.insert("io");
2967    s.insert("iol");
2968    s.insert("ipf");
2969    s.insert("ipp");
2970    s.insert("ipynb");
2971    s.insert("irclog");
2972    s.insert("isl");
2973    s.insert("ispc");
2974    s.insert("iss");
2975    s.insert("iuml");
2976    s.insert("ivy");
2977    s.insert("ixx");
2978    s.insert("j");
2979    s.insert("j2");
2980    s.insert("jac");
2981    s.insert("jade");
2982    s.insert("jai");
2983    s.insert("jake");
2984    s.insert("janet");
2985    s.insert("jav");
2986    s.insert("java");
2987    s.insert("javascript");
2988    s.insert("jbuilder");
2989    s.insert("jcl");
2990    s.insert("jelly");
2991    s.insert("jflex");
2992    s.insert("jinja");
2993    s.insert("jinja2");
2994    s.insert("jison");
2995    s.insert("jisonlex");
2996    s.insert("jl");
2997    s.insert("jq");
2998    s.insert("js");
2999    s.insert("js.erb");
3000    s.insert("jsb");
3001    s.insert("jscad");
3002    s.insert("jsfl");
3003    s.insert("jsh");
3004    s.insert("jslib");
3005    s.insert("jsm");
3006    s.insert("json");
3007    s.insert("json-tmlanguage");
3008    s.insert("json.example");
3009    s.insert("json5");
3010    s.insert("jsonc");
3011    s.insert("jsonl");
3012    s.insert("jsonld");
3013    s.insert("jsonnet");
3014    s.insert("jsp");
3015    s.insert("jspre");
3016    s.insert("jsproj");
3017    s.insert("jss");
3018    s.insert("jst");
3019    s.insert("jsx");
3020    s.insert("jte");
3021    s.insert("just");
3022    s.insert("k");
3023    s.insert("kak");
3024    s.insert("kdl");
3025    s.insert("kicad_mod");
3026    s.insert("kicad_pcb");
3027    s.insert("kicad_sch");
3028    s.insert("kicad_sym");
3029    s.insert("kicad_wks");
3030    s.insert("kid");
3031    s.insert("kit");
3032    s.insert("kk");
3033    s.insert("kml");
3034    s.insert("kojo");
3035    s.insert("kql");
3036    s.insert("krl");
3037    s.insert("ks");
3038    s.insert("ksh");
3039    s.insert("ksy");
3040    s.insert("kt");
3041    s.insert("ktm");
3042    s.insert("kts");
3043    s.insert("kv");
3044    s.insert("l");
3045    s.insert("lagda");
3046    s.insert("langium");
3047    s.insert("lark");
3048    s.insert("las");
3049    s.insert("lasso");
3050    s.insert("lasso8");
3051    s.insert("lasso9");
3052    s.insert("latte");
3053    s.insert("launch");
3054    s.insert("lbx");
3055    s.insert("ld");
3056    s.insert("lds");
3057    s.insert("lean");
3058    s.insert("leex");
3059    s.insert("lektorproject");
3060    s.insert("leo");
3061    s.insert("less");
3062    s.insert("lex");
3063    s.insert("lfe");
3064    s.insert("lgt");
3065    s.insert("lhs");
3066    s.insert("libsonnet");
3067    s.insert("lid");
3068    s.insert("lidr");
3069    s.insert("ligo");
3070    s.insert("linq");
3071    s.insert("liquid");
3072    s.insert("lisp");
3073    s.insert("litcoffee");
3074    s.insert("livecodescript");
3075    s.insert("livemd");
3076    s.insert("lkml");
3077    s.insert("ll");
3078    s.insert("lmi");
3079    s.insert("logtalk");
3080    s.insert("lol");
3081    s.insert("lookml");
3082    s.insert("lp");
3083    s.insert("lpr");
3084    s.insert("ls");
3085    s.insert("lsl");
3086    s.insert("lslp");
3087    s.insert("lsp");
3088    s.insert("ltx");
3089    s.insert("lua");
3090    s.insert("luau");
3091    s.insert("lvclass");
3092    s.insert("lvlib");
3093    s.insert("lvproj");
3094    s.insert("ly");
3095    s.insert("m");
3096    s.insert("m2");
3097    s.insert("m3");
3098    s.insert("m3u");
3099    s.insert("m3u8");
3100    s.insert("m4");
3101    s.insert("ma");
3102    s.insert("mak");
3103    s.insert("make");
3104    s.insert("makefile");
3105    s.insert("mako");
3106    s.insert("man");
3107    s.insert("mao");
3108    s.insert("markdown");
3109    s.insert("marko");
3110    s.insert("mask");
3111    s.insert("mat");
3112    s.insert("mata");
3113    s.insert("matah");
3114    s.insert("mathematica");
3115    s.insert("matlab");
3116    s.insert("mawk");
3117    s.insert("maxhelp");
3118    s.insert("maxpat");
3119    s.insert("maxproj");
3120    s.insert("mbox");
3121    s.insert("mbt");
3122    s.insert("mc");
3123    s.insert("mcfunction");
3124    s.insert("mch");
3125    s.insert("mcmeta");
3126    s.insert("mcr");
3127    s.insert("md");
3128    s.insert("md2");
3129    s.insert("md4");
3130    s.insert("md5");
3131    s.insert("mdoc");
3132    s.insert("mdown");
3133    s.insert("mdpolicy");
3134    s.insert("mdwn");
3135    s.insert("mdx");
3136    s.insert("me");
3137    s.insert("mediawiki");
3138    s.insert("mermaid");
3139    s.insert("meta");
3140    s.insert("metal");
3141    s.insert("mg");
3142    s.insert("minid");
3143    s.insert("mint");
3144    s.insert("mir");
3145    s.insert("mirah");
3146    s.insert("mjml");
3147    s.insert("mjs");
3148    s.insert("mk");
3149    s.insert("mkd");
3150    s.insert("mkdn");
3151    s.insert("mkdown");
3152    s.insert("mkfile");
3153    s.insert("mkii");
3154    s.insert("mkiv");
3155    s.insert("mkvi");
3156    s.insert("ml");
3157    s.insert("ml4");
3158    s.insert("mli");
3159    s.insert("mligo");
3160    s.insert("mlir");
3161    s.insert("mll");
3162    s.insert("mly");
3163    s.insert("mm");
3164    s.insert("mmd");
3165    s.insert("mmk");
3166    s.insert("mms");
3167    s.insert("mo");
3168    s.insert("mod");
3169    s.insert("mojo");
3170    s.insert("monkey");
3171    s.insert("monkey2");
3172    s.insert("moo");
3173    s.insert("moon");
3174    s.insert("move");
3175    s.insert("mpl");
3176    s.insert("mps");
3177    s.insert("mq4");
3178    s.insert("mq5");
3179    s.insert("mqh");
3180    s.insert("mrc");
3181    s.insert("ms");
3182    s.insert("msd");
3183    s.insert("msg");
3184    s.insert("mspec");
3185    s.insert("mss");
3186    s.insert("mt");
3187    s.insert("mtl");
3188    s.insert("mtml");
3189    s.insert("mts");
3190    s.insert("mu");
3191    s.insert("mud");
3192    s.insert("muf");
3193    s.insert("mumps");
3194    s.insert("muse");
3195    s.insert("mustache");
3196    s.insert("mxml");
3197    s.insert("mxt");
3198    s.insert("mysql");
3199    s.insert("myt");
3200    s.insert("mzn");
3201    s.insert("n");
3202    s.insert("nanorc");
3203    s.insert("nas");
3204    s.insert("nasl");
3205    s.insert("nasm");
3206    s.insert("natvis");
3207    s.insert("nawk");
3208    s.insert("nb");
3209    s.insert("nbp");
3210    s.insert("nc");
3211    s.insert("ncl");
3212    s.insert("ndproj");
3213    s.insert("ne");
3214    s.insert("nearley");
3215    s.insert("ned");
3216    s.insert("neon");
3217    s.insert("nf");
3218    s.insert("nginx");
3219    s.insert("nginxconf");
3220    s.insert("ni");
3221    s.insert("nim");
3222    s.insert("nim.cfg");
3223    s.insert("nimble");
3224    s.insert("nimrod");
3225    s.insert("nims");
3226    s.insert("ninja");
3227    s.insert("nit");
3228    s.insert("nix");
3229    s.insert("njk");
3230    s.insert("njs");
3231    s.insert("nl");
3232    s.insert("nlogo");
3233    s.insert("no");
3234    s.insert("nomad");
3235    s.insert("nproj");
3236    s.insert("nqp");
3237    s.insert("nr");
3238    s.insert("nse");
3239    s.insert("nsh");
3240    s.insert("nsi");
3241    s.insert("nss");
3242    s.insert("nu");
3243    s.insert("numpy");
3244    s.insert("numpyw");
3245    s.insert("numsc");
3246    s.insert("nuspec");
3247    s.insert("nut");
3248    s.insert("ny");
3249    s.insert("ob2");
3250    s.insert("obj");
3251    s.insert("objdump");
3252    s.insert("odd");
3253    s.insert("odin");
3254    s.insert("ol");
3255    s.insert("omgrofl");
3256    s.insert("ooc");
3257    s.insert("opa");
3258    s.insert("opal");
3259    s.insert("opencl");
3260    s.insert("orc");
3261    s.insert("org");
3262    s.insert("os");
3263    s.insert("osm");
3264    s.insert("outjob");
3265    s.insert("overpassql");
3266    s.insert("owl");
3267    s.insert("ox");
3268    s.insert("oxh");
3269    s.insert("oxo");
3270    s.insert("oxygene");
3271    s.insert("oz");
3272    s.insert("p");
3273    s.insert("p4");
3274    s.insert("p6");
3275    s.insert("p6l");
3276    s.insert("p6m");
3277    s.insert("p8");
3278    s.insert("pac");
3279    s.insert("pact");
3280    s.insert("pan");
3281    s.insert("parrot");
3282    s.insert("pas");
3283    s.insert("pascal");
3284    s.insert("pasm");
3285    s.insert("pat");
3286    s.insert("patch");
3287    s.insert("pb");
3288    s.insert("pbi");
3289    s.insert("pbt");
3290    s.insert("pbtxt");
3291    s.insert("pcbdoc");
3292    s.insert("pck");
3293    s.insert("pcss");
3294    s.insert("pd");
3295    s.insert("pd_lua");
3296    s.insert("pddl");
3297    s.insert("pde");
3298    s.insert("peggy");
3299    s.insert("pegjs");
3300    s.insert("pep");
3301    s.insert("per");
3302    s.insert("perl");
3303    s.insert("pfa");
3304    s.insert("pgsql");
3305    s.insert("ph");
3306    s.insert("php");
3307    s.insert("php3");
3308    s.insert("php4");
3309    s.insert("php5");
3310    s.insert("phps");
3311    s.insert("phpt");
3312    s.insert("phtml");
3313    s.insert("pic");
3314    s.insert("pig");
3315    s.insert("pike");
3316    s.insert("pir");
3317    s.insert("pkb");
3318    s.insert("pkgproj");
3319    s.insert("pkl");
3320    s.insert("pks");
3321    s.insert("pl");
3322    s.insert("pl6");
3323    s.insert("plantuml");
3324    s.insert("plb");
3325    s.insert("plist");
3326    s.insert("plot");
3327    s.insert("pls");
3328    s.insert("plsql");
3329    s.insert("plt");
3330    s.insert("pluginspec");
3331    s.insert("plx");
3332    s.insert("pm");
3333    s.insert("pm6");
3334    s.insert("pml");
3335    s.insert("pmod");
3336    s.insert("po");
3337    s.insert("pod");
3338    s.insert("pod6");
3339    s.insert("podsl");
3340    s.insert("podspec");
3341    s.insert("pogo");
3342    s.insert("polar");
3343    s.insert("pony");
3344    s.insert("por");
3345    s.insert("postcss");
3346    s.insert("pot");
3347    s.insert("pov");
3348    s.insert("pp");
3349    s.insert("pprx");
3350    s.insert("praat");
3351    s.insert("prawn");
3352    s.insert("prc");
3353    s.insert("prefab");
3354    s.insert("prefs");
3355    s.insert("prg");
3356    s.insert("pri");
3357    s.insert("prisma");
3358    s.insert("prjpcb");
3359    s.insert("pro");
3360    s.insert("proj");
3361    s.insert("prolog");
3362    s.insert("properties");
3363    s.insert("props");
3364    s.insert("proto");
3365    s.insert("prw");
3366    s.insert("ps");
3367    s.insert("ps1");
3368    s.insert("ps1xml");
3369    s.insert("psc");
3370    s.insert("psc1");
3371    s.insert("psd1");
3372    s.insert("psgi");
3373    s.insert("psm1");
3374    s.insert("pt");
3375    s.insert("pub");
3376    s.insert("pubxml");
3377    s.insert("pug");
3378    s.insert("puml");
3379    s.insert("purs");
3380    s.insert("pwn");
3381    s.insert("pxd");
3382    s.insert("pxi");
3383    s.insert("py");
3384    s.insert("py3");
3385    s.insert("pyde");
3386    s.insert("pyi");
3387    s.insert("pyp");
3388    s.insert("pyt");
3389    s.insert("pytb");
3390    s.insert("pyw");
3391    s.insert("pyx");
3392    s.insert("q");
3393    s.insert("qasm");
3394    s.insert("qbs");
3395    s.insert("qc");
3396    s.insert("qhelp");
3397    s.insert("ql");
3398    s.insert("qll");
3399    s.insert("qmd");
3400    s.insert("qml");
3401    s.insert("qs");
3402    s.insert("r");
3403    s.insert("r2");
3404    s.insert("r3");
3405    s.insert("rabl");
3406    s.insert("rake");
3407    s.insert("raku");
3408    s.insert("rakumod");
3409    s.insert("raml");
3410    s.insert("rascript");
3411    s.insert("raw");
3412    s.insert("razor");
3413    s.insert("rb");
3414    s.insert("rbbas");
3415    s.insert("rbfrm");
3416    s.insert("rbi");
3417    s.insert("rbmnu");
3418    s.insert("rbres");
3419    s.insert("rbs");
3420    s.insert("rbtbar");
3421    s.insert("rbuild");
3422    s.insert("rbuistate");
3423    s.insert("rbw");
3424    s.insert("rbx");
3425    s.insert("rbxs");
3426    s.insert("rchit");
3427    s.insert("rd");
3428    s.insert("rdf");
3429    s.insert("rdoc");
3430    s.insert("re");
3431    s.insert("reb");
3432    s.insert("rebol");
3433    s.insert("red");
3434    s.insert("reds");
3435    s.insert("reek");
3436    s.insert("reg");
3437    s.insert("regex");
3438    s.insert("regexp");
3439    s.insert("rego");
3440    s.insert("rei");
3441    s.insert("religo");
3442    s.insert("res");
3443    s.insert("resi");
3444    s.insert("resource");
3445    s.insert("rest");
3446    s.insert("rest.txt");
3447    s.insert("resx");
3448    s.insert("rex");
3449    s.insert("rexx");
3450    s.insert("rg");
3451    s.insert("rhtml");
3452    s.insert("ring");
3453    s.insert("riot");
3454    s.insert("rkt");
3455    s.insert("rktd");
3456    s.insert("rktl");
3457    s.insert("rl");
3458    s.insert("rmd");
3459    s.insert("rmiss");
3460    s.insert("rnh");
3461    s.insert("rno");
3462    s.insert("rnw");
3463    s.insert("robot");
3464    s.insert("roc");
3465    s.insert("rockspec");
3466    s.insert("roff");
3467    s.insert("ron");
3468    s.insert("ronn");
3469    s.insert("rpgle");
3470    s.insert("rpy");
3471    s.insert("rq");
3472    s.insert("rs");
3473    s.insert("rs.in");
3474    s.insert("rsc");
3475    s.insert("rsh");
3476    s.insert("rss");
3477    s.insert("rst");
3478    s.insert("rst.txt");
3479    s.insert("rsx");
3480    s.insert("rtf");
3481    s.insert("ru");
3482    s.insert("ruby");
3483    s.insert("rviz");
3484    s.insert("s");
3485    s.insert("sage");
3486    s.insert("sagews");
3487    s.insert("sail");
3488    s.insert("sarif");
3489    s.insert("sas");
3490    s.insert("sass");
3491    s.insert("sats");
3492    s.insert("sbatch");
3493    s.insert("sbt");
3494    s.insert("sc");
3495    s.insert("scad");
3496    s.insert("scala");
3497    s.insert("scaml");
3498    s.insert("scd");
3499    s.insert("sce");
3500    s.insert("scenic");
3501    s.insert("sch");
3502    s.insert("schdoc");
3503    s.insert("sci");
3504    s.insert("scm");
3505    s.insert("sco");
3506    s.insert("scpt");
3507    s.insert("scrbl");
3508    s.insert("scss");
3509    s.insert("scxml");
3510    s.insert("sdc");
3511    s.insert("sed");
3512    s.insert("self");
3513    s.insert("service");
3514    s.insert("sexp");
3515    s.insert("sfd");
3516    s.insert("sfproj");
3517    s.insert("sfv");
3518    s.insert("sh");
3519    s.insert("sh-session");
3520    s.insert("sh.in");
3521    s.insert("sha1");
3522    s.insert("sha2");
3523    s.insert("sha224");
3524    s.insert("sha256");
3525    s.insert("sha256sum");
3526    s.insert("sha3");
3527    s.insert("sha384");
3528    s.insert("sha512");
3529    s.insert("shader");
3530    s.insert("shen");
3531    s.insert("shproj");
3532    s.insert("sieve");
3533    s.insert("sig");
3534    s.insert("sj");
3535    s.insert("sjs");
3536    s.insert("sl");
3537    s.insert("slang");
3538    s.insert("sld");
3539    s.insert("slim");
3540    s.insert("slint");
3541    s.insert("sln");
3542    s.insert("slnx");
3543    s.insert("sls");
3544    s.insert("slurm");
3545    s.insert("sma");
3546    s.insert("smali");
3547    s.insert("smithy");
3548    s.insert("smk");
3549    s.insert("sml");
3550    s.insert("smt");
3551    s.insert("smt2");
3552    s.insert("snakefile");
3553    s.insert("snap");
3554    s.insert("snip");
3555    s.insert("snippet");
3556    s.insert("snippets");
3557    s.insert("sol");
3558    s.insert("soy");
3559    s.insert("sp");
3560    s.insert("sparql");
3561    s.insert("spc");
3562    s.insert("spec");
3563    s.insert("spin");
3564    s.insert("sps");
3565    s.insert("sqf");
3566    s.insert("sql");
3567    s.insert("sqlrpgle");
3568    s.insert("sra");
3569    s.insert("srdf");
3570    s.insert("srt");
3571    s.insert("sru");
3572    s.insert("srv");
3573    s.insert("srw");
3574    s.insert("ss");
3575    s.insert("ssjs");
3576    s.insert("sss");
3577    s.insert("st");
3578    s.insert("stan");
3579    s.insert("star");
3580    s.insert("sthlp");
3581    s.insert("stl");
3582    s.insert("ston");
3583    s.insert("story");
3584    s.insert("storyboard");
3585    s.insert("sttheme");
3586    s.insert("sty");
3587    s.insert("styl");
3588    s.insert("sublime-build");
3589    s.insert("sublime-color-scheme");
3590    s.insert("sublime-commands");
3591    s.insert("sublime-completions");
3592    s.insert("sublime-keymap");
3593    s.insert("sublime-macro");
3594    s.insert("sublime-menu");
3595    s.insert("sublime-mousemap");
3596    s.insert("sublime-project");
3597    s.insert("sublime-settings");
3598    s.insert("sublime-snippet");
3599    s.insert("sublime-syntax");
3600    s.insert("sublime-theme");
3601    s.insert("sublime-workspace");
3602    s.insert("sublime_metrics");
3603    s.insert("sublime_session");
3604    s.insert("surql");
3605    s.insert("sv");
3606    s.insert("svelte");
3607    s.insert("svg");
3608    s.insert("svh");
3609    s.insert("svx");
3610    s.insert("sw");
3611    s.insert("swg");
3612    s.insert("swift");
3613    s.insert("swig");
3614    s.insert("syntax");
3615    s.insert("t");
3616    s.insert("tab");
3617    s.insert("tac");
3618    s.insert("tact");
3619    s.insert("tag");
3620    s.insert("talon");
3621    s.insert("targets");
3622    s.insert("tcc");
3623    s.insert("tcl");
3624    s.insert("tcl.in");
3625    s.insert("tcsh");
3626    s.insert("te");
3627    s.insert("tea");
3628    s.insert("templ");
3629    s.insert("tesc");
3630    s.insert("tese");
3631    s.insert("tex");
3632    s.insert("texi");
3633    s.insert("texinfo");
3634    s.insert("textgrid");
3635    s.insert("textile");
3636    s.insert("textproto");
3637    s.insert("tf");
3638    s.insert("tfstate");
3639    s.insert("tfstate.backup");
3640    s.insert("tftpl");
3641    s.insert("tfvars");
3642    s.insert("thor");
3643    s.insert("thrift");
3644    s.insert("thy");
3645    s.insert("tl");
3646    s.insert("tla");
3647    s.insert("tlv");
3648    s.insert("tm");
3649    s.insert("tmac");
3650    s.insert("tmcommand");
3651    s.insert("tmdl");
3652    s.insert("tml");
3653    s.insert("tmlanguage");
3654    s.insert("tmpl");
3655    s.insert("tmpreferences");
3656    s.insert("tmsnippet");
3657    s.insert("tmtheme");
3658    s.insert("tmux");
3659    s.insert("toc");
3660    s.insert("tofu");
3661    s.insert("toit");
3662    s.insert("toml");
3663    s.insert("toml.example");
3664    s.insert("tool");
3665    s.insert("topojson");
3666    s.insert("tpb");
3667    s.insert("tpl");
3668    s.insert("tpp");
3669    s.insert("tps");
3670    s.insert("tres");
3671    s.insert("trg");
3672    s.insert("trigger");
3673    s.insert("ts");
3674    s.insert("tscn");
3675    s.insert("tsconfig.json");
3676    s.insert("tsp");
3677    s.insert("tst");
3678    s.insert("tsv");
3679    s.insert("tsx");
3680    s.insert("ttl");
3681    s.insert("tu");
3682    s.insert("twig");
3683    s.insert("txi");
3684    s.insert("txl");
3685    s.insert("txt");
3686    s.insert("txx");
3687    s.insert("typ");
3688    s.insert("uc");
3689    s.insert("udf");
3690    s.insert("udo");
3691    s.insert("ui");
3692    s.insert("unity");
3693    s.insert("uno");
3694    s.insert("upc");
3695    s.insert("uplc");
3696    s.insert("ur");
3697    s.insert("urdf");
3698    s.insert("url");
3699    s.insert("urs");
3700    s.insert("ux");
3701    s.insert("v");
3702    s.insert("vala");
3703    s.insert("vapi");
3704    s.insert("vark");
3705    s.insert("vb");
3706    s.insert("vba");
3707    s.insert("vbhtml");
3708    s.insert("vbproj");
3709    s.insert("vbs");
3710    s.insert("vcf");
3711    s.insert("vcl");
3712    s.insert("vcxproj");
3713    s.insert("vdf");
3714    s.insert("veo");
3715    s.insert("vert");
3716    s.insert("vh");
3717    s.insert("vhd");
3718    s.insert("vhdl");
3719    s.insert("vhf");
3720    s.insert("vhi");
3721    s.insert("vho");
3722    s.insert("vhost");
3723    s.insert("vhs");
3724    s.insert("vht");
3725    s.insert("vhw");
3726    s.insert("vim");
3727    s.insert("vimrc");
3728    s.insert("viw");
3729    s.insert("vmb");
3730    s.insert("volt");
3731    s.insert("vrx");
3732    s.insert("vs");
3733    s.insert("vsh");
3734    s.insert("vshader");
3735    s.insert("vsixmanifest");
3736    s.insert("vssettings");
3737    s.insert("vstemplate");
3738    s.insert("vtl");
3739    s.insert("vto");
3740    s.insert("vtt");
3741    s.insert("vue");
3742    s.insert("vw");
3743    s.insert("vxml");
3744    s.insert("vy");
3745    s.insert("w");
3746    s.insert("wast");
3747    s.insert("wat");
3748    s.insert("watchr");
3749    s.insert("wdl");
3750    s.insert("webapp");
3751    s.insert("webidl");
3752    s.insert("webmanifest");
3753    s.insert("weechatlog");
3754    s.insert("wgsl");
3755    s.insert("whiley");
3756    s.insert("wiki");
3757    s.insert("wikitext");
3758    s.insert("wisp");
3759    s.insert("wit");
3760    s.insert("wixproj");
3761    s.insert("wl");
3762    s.insert("wlk");
3763    s.insert("wls");
3764    s.insert("wlt");
3765    s.insert("wlua");
3766    s.insert("workbook");
3767    s.insert("workflow");
3768    s.insert("wren");
3769    s.insert("ws");
3770    s.insert("wsdl");
3771    s.insert("wsf");
3772    s.insert("wsgi");
3773    s.insert("wxi");
3774    s.insert("wxl");
3775    s.insert("wxs");
3776    s.insert("x");
3777    s.insert("x10");
3778    s.insert("x3d");
3779    s.insert("x68");
3780    s.insert("xacro");
3781    s.insert("xaml");
3782    s.insert("xbm");
3783    s.insert("xc");
3784    s.insert("xdc");
3785    s.insert("xht");
3786    s.insert("xhtml");
3787    s.insert("xi");
3788    s.insert("xib");
3789    s.insert("xlf");
3790    s.insert("xliff");
3791    s.insert("xm");
3792    s.insert("xmi");
3793    s.insert("xml");
3794    s.insert("xml.dist");
3795    s.insert("xmp");
3796    s.insert("xojo_code");
3797    s.insert("xojo_menu");
3798    s.insert("xojo_report");
3799    s.insert("xojo_script");
3800    s.insert("xojo_toolbar");
3801    s.insert("xojo_window");
3802    s.insert("xpl");
3803    s.insert("xpm");
3804    s.insert("xproc");
3805    s.insert("xproj");
3806    s.insert("xpy");
3807    s.insert("xq");
3808    s.insert("xql");
3809    s.insert("xqm");
3810    s.insert("xquery");
3811    s.insert("xqy");
3812    s.insert("xrl");
3813    s.insert("xs");
3814    s.insert("xsd");
3815    s.insert("xsh");
3816    s.insert("xsjs");
3817    s.insert("xsjslib");
3818    s.insert("xsl");
3819    s.insert("xslt");
3820    s.insert("xsp-config");
3821    s.insert("xsp.metadata");
3822    s.insert("xspec");
3823    s.insert("xtend");
3824    s.insert("xul");
3825    s.insert("xzap");
3826    s.insert("y");
3827    s.insert("yacc");
3828    s.insert("yaml");
3829    s.insert("yaml-tmlanguage");
3830    s.insert("yaml.sed");
3831    s.insert("yang");
3832    s.insert("yap");
3833    s.insert("yar");
3834    s.insert("yara");
3835    s.insert("yasnippet");
3836    s.insert("yml");
3837    s.insert("yml.mysql");
3838    s.insert("yrl");
3839    s.insert("yul");
3840    s.insert("yy");
3841    s.insert("yyp");
3842    s.insert("z3");
3843    s.insert("zap");
3844    s.insert("zcml");
3845    s.insert("zeek");
3846    s.insert("zep");
3847    s.insert("zig");
3848    s.insert("zig.zon");
3849    s.insert("zil");
3850    s.insert("zimpl");
3851    s.insert("zmodel");
3852    s.insert("zmpl");
3853    s.insert("zone");
3854    s.insert("zpl");
3855    s.insert("zs");
3856    s.insert("zsh");
3857    s.insert("zsh-theme");
3858    s
3859});
3860
3861/// Final file extensions (lowercased, leading dot stripped) of Linguist's
3862/// programming and data languages, minus every extension a prose or markup
3863/// language also claims (`md`, `txt`, `asc`, ...). A file whose final extension
3864/// is listed here is source code: linting it as Markdown reports noise, and
3865/// fixing it rewrites the program. Sorted, so membership is a binary search.
3866///
3867/// Generated by `scripts/gen_linguist_extensions.py --source-code` from the
3868/// pinned languages.yml (see LINGUIST_VERSION).
3869pub static SOURCE_CODE_EXTENSIONS: &[&str] = &[
3870    "2da",
3871    "4dform",
3872    "4dm",
3873    "4dproject",
3874    "4gl",
3875    "4th",
3876    "6pl",
3877    "6pm",
3878    "8xp",
3879    "_coffee",
3880    "_js",
3881    "_ls",
3882    "a51",
3883    "abap",
3884    "abnf",
3885    "action",
3886    "ada",
3887    "adb",
3888    "adml",
3889    "admx",
3890    "ado",
3891    "adp",
3892    "ads",
3893    "afm",
3894    "agc",
3895    "agda",
3896    "ahk",
3897    "ahkl",
3898    "aidl",
3899    "aj",
3900    "ak",
3901    "al",
3902    "alg",
3903    "als",
3904    "ampl",
3905    "angelscript",
3906    "anim",
3907    "ant",
3908    "apacheconf",
3909    "apex",
3910    "apl",
3911    "app",
3912    "applescript",
3913    "arc",
3914    "arpa",
3915    "arr",
3916    "as",
3917    "asax",
3918    "ascx",
3919    "asd",
3920    "asddls",
3921    "ash",
3922    "ashx",
3923    "asl",
3924    "asm",
3925    "asmx",
3926    "asn",
3927    "asn1",
3928    "asp",
3929    "aspx",
3930    "asset",
3931    "asy",
3932    "au3",
3933    "aug",
3934    "auk",
3935    "avdl",
3936    "avsc",
3937    "aw",
3938    "awk",
3939    "axaml",
3940    "axd",
3941    "axi",
3942    "axml",
3943    "axs",
3944    "b",
3945    "bal",
3946    "bas",
3947    "bash",
3948    "bat",
3949    "bats",
3950    "bb",
3951    "bbappend",
3952    "bbclass",
3953    "bdf",
3954    "bdy",
3955    "be",
3956    "befunge",
3957    "bf",
3958    "bi",
3959    "bicep",
3960    "bicepparam",
3961    "bison",
3962    "bmx",
3963    "bones",
3964    "boo",
3965    "boot",
3966    "bpl",
3967    "bqn",
3968    "brd",
3969    "bro",
3970    "brs",
3971    "bsl",
3972    "bst",
3973    "bsv",
3974    "builder",
3975    "builds",
3976    "bzl",
3977    "c",
3978    "c++",
3979    "c++-objdump",
3980    "c++objdump",
3981    "c-objdump",
3982    "c3",
3983    "cabal",
3984    "caddyfile",
3985    "cairo",
3986    "cake",
3987    "capnp",
3988    "carbon",
3989    "cats",
3990    "cbl",
3991    "cc",
3992    "ccp",
3993    "ccproj",
3994    "ccxml",
3995    "cdc",
3996    "cdf",
3997    "cds",
3998    "ceylon",
3999    "cfc",
4000    "cfg",
4001    "cfm",
4002    "cfml",
4003    "cgi",
4004    "cginc",
4005    "ch",
4006    "chpl",
4007    "chs",
4008    "cil",
4009    "circom",
4010    "cirru",
4011    "cj",
4012    "cjs",
4013    "cjsx",
4014    "ck",
4015    "cl",
4016    "cl2",
4017    "clar",
4018    "click",
4019    "clixml",
4020    "clj",
4021    "cljc",
4022    "cljs",
4023    "cljscm",
4024    "cljx",
4025    "clp",
4026    "clue",
4027    "clw",
4028    "cmake",
4029    "cmd",
4030    "cmp",
4031    "cnc",
4032    "cnf",
4033    "cob",
4034    "cobol",
4035    "cocci",
4036    "code-snippets",
4037    "code-workspace",
4038    "coffee",
4039    "com",
4040    "command",
4041    "conll",
4042    "conllu",
4043    "containerfile",
4044    "coq",
4045    "cp",
4046    "cpp",
4047    "cpp-objdump",
4048    "cppm",
4049    "cppobjdump",
4050    "cproject",
4051    "cps",
4052    "cpy",
4053    "cql",
4054    "cr",
4055    "crc32",
4056    "cs",
4057    "csc",
4058    "cscfg",
4059    "csd",
4060    "csdef",
4061    "csh",
4062    "csl",
4063    "cson",
4064    "csproj",
4065    "csv",
4066    "csx",
4067    "ct",
4068    "ctl",
4069    "ctp",
4070    "cts",
4071    "cu",
4072    "cue",
4073    "cuh",
4074    "curry",
4075    "cw",
4076    "cwl",
4077    "cxx",
4078    "cxx-objdump",
4079    "cy",
4080    "cylc",
4081    "cyp",
4082    "cypher",
4083    "d",
4084    "d-objdump",
4085    "dae",
4086    "darcspatch",
4087    "dart",
4088    "das",
4089    "dats",
4090    "db2",
4091    "dcl",
4092    "ddl",
4093    "decls",
4094    "depproj",
4095    "desktop",
4096    "dfm",
4097    "dfy",
4098    "dhall",
4099    "di",
4100    "diff",
4101    "dircolors",
4102    "dita",
4103    "ditamap",
4104    "ditaval",
4105    "djs",
4106    "dlm",
4107    "dm",
4108    "do",
4109    "dockerfile",
4110    "dof",
4111    "doh",
4112    "dot",
4113    "dotsettings",
4114    "dpatch",
4115    "dpr",
4116    "druby",
4117    "dsc",
4118    "dsl",
4119    "dsp",
4120    "dsr",
4121    "duby",
4122    "dwl",
4123    "dyalog",
4124    "dyl",
4125    "dylan",
4126    "dzn",
4127    "e",
4128    "eb",
4129    "ebnf",
4130    "ebuild",
4131    "ec",
4132    "ecl",
4133    "eclass",
4134    "eclxml",
4135    "edc",
4136    "edgeql",
4137    "editorconfig",
4138    "edn",
4139    "eh",
4140    "el",
4141    "eliom",
4142    "eliomi",
4143    "elm",
4144    "elv",
4145    "em",
4146    "emacs",
4147    "emberscript",
4148    "eml",
4149    "env",
4150    "epj",
4151    "eq",
4152    "erl",
4153    "es",
4154    "es6",
4155    "escript",
4156    "esdl",
4157    "ex",
4158    "exs",
4159    "eye",
4160    "f",
4161    "f03",
4162    "f08",
4163    "f77",
4164    "f90",
4165    "f95",
4166    "factor",
4167    "fan",
4168    "fancypack",
4169    "fcgi",
4170    "fea",
4171    "feature",
4172    "filters",
4173    "fir",
4174    "fish",
4175    "flex",
4176    "flf",
4177    "flix",
4178    "flux",
4179    "fnc",
4180    "fnl",
4181    "for",
4182    "forth",
4183    "fp",
4184    "fpp",
4185    "frag",
4186    "frg",
4187    "frm",
4188    "frt",
4189    "fs",
4190    "fsh",
4191    "fshader",
4192    "fsi",
4193    "fsproj",
4194    "fst",
4195    "fsti",
4196    "fsx",
4197    "fth",
4198    "ftl",
4199    "ftlh",
4200    "fun",
4201    "fut",
4202    "fx",
4203    "fxh",
4204    "fxml",
4205    "fy",
4206    "g",
4207    "g4",
4208    "gaml",
4209    "gap",
4210    "gawk",
4211    "gbl",
4212    "gbo",
4213    "gbp",
4214    "gbr",
4215    "gbs",
4216    "gco",
4217    "gcode",
4218    "gd",
4219    "gdb",
4220    "gdbinit",
4221    "gdnlib",
4222    "gdns",
4223    "gdshader",
4224    "gdshaderinc",
4225    "ged",
4226    "gemspec",
4227    "geo",
4228    "geojson",
4229    "geom",
4230    "gf",
4231    "gi",
4232    "gitconfig",
4233    "gitignore",
4234    "gjs",
4235    "gko",
4236    "glade",
4237    "gleam",
4238    "glf",
4239    "glsl",
4240    "glslf",
4241    "glslv",
4242    "gltf",
4243    "glyphs",
4244    "gml",
4245    "gms",
4246    "gmx",
4247    "gn",
4248    "gni",
4249    "gnu",
4250    "gnuplot",
4251    "go",
4252    "god",
4253    "golo",
4254    "gp",
4255    "gpb",
4256    "gpt",
4257    "gpx",
4258    "gql",
4259    "grace",
4260    "gradle",
4261    "graphql",
4262    "graphqls",
4263    "groovy",
4264    "grt",
4265    "grxml",
4266    "gs",
4267    "gsc",
4268    "gsh",
4269    "gshader",
4270    "gsp",
4271    "gst",
4272    "gsx",
4273    "gtl",
4274    "gto",
4275    "gtp",
4276    "gtpl",
4277    "gts",
4278    "gv",
4279    "gvy",
4280    "gyp",
4281    "gypi",
4282    "h",
4283    "h++",
4284    "ha",
4285    "hack",
4286    "har",
4287    "hats",
4288    "hb",
4289    "hc",
4290    "hcl",
4291    "hh",
4292    "hhi",
4293    "hic",
4294    "hip",
4295    "hlean",
4296    "hlsl",
4297    "hlsli",
4298    "hocon",
4299    "hoon",
4300    "hpp",
4301    "hqf",
4302    "hql",
4303    "hrl",
4304    "hs",
4305    "hs-boot",
4306    "hsc",
4307    "http",
4308    "hurl",
4309    "hx",
4310    "hxml",
4311    "hxsl",
4312    "hxx",
4313    "hy",
4314    "hzp",
4315    "i",
4316    "i3",
4317    "i7x",
4318    "ical",
4319    "ice",
4320    "iced",
4321    "icl",
4322    "ics",
4323    "idc",
4324    "idr",
4325    "ig",
4326    "ihlp",
4327    "ijm",
4328    "ijs",
4329    "ik",
4330    "ily",
4331    "imba",
4332    "iml",
4333    "ini",
4334    "ink",
4335    "inl",
4336    "ino",
4337    "intr",
4338    "io",
4339    "iol",
4340    "ipf",
4341    "ipp",
4342    "irclog",
4343    "isl",
4344    "ispc",
4345    "iss",
4346    "iuml",
4347    "ivy",
4348    "ixx",
4349    "j",
4350    "jac",
4351    "jai",
4352    "jake",
4353    "janet",
4354    "jav",
4355    "java",
4356    "javascript",
4357    "jbuilder",
4358    "jcl",
4359    "jelly",
4360    "jflex",
4361    "jison",
4362    "jisonlex",
4363    "jl",
4364    "jq",
4365    "js",
4366    "jsb",
4367    "jscad",
4368    "jsfl",
4369    "jsh",
4370    "jslib",
4371    "jsm",
4372    "json",
4373    "json-tmlanguage",
4374    "json5",
4375    "jsonc",
4376    "jsonl",
4377    "jsonld",
4378    "jsonnet",
4379    "jsp",
4380    "jspre",
4381    "jsproj",
4382    "jss",
4383    "jsx",
4384    "jte",
4385    "just",
4386    "k",
4387    "kak",
4388    "kdl",
4389    "kicad_mod",
4390    "kicad_pcb",
4391    "kicad_sch",
4392    "kicad_sym",
4393    "kicad_wks",
4394    "kid",
4395    "kk",
4396    "kml",
4397    "kojo",
4398    "kql",
4399    "krl",
4400    "ks",
4401    "ksh",
4402    "ksy",
4403    "kt",
4404    "ktm",
4405    "kts",
4406    "lagda",
4407    "langium",
4408    "lark",
4409    "las",
4410    "lasso",
4411    "lasso8",
4412    "lasso9",
4413    "launch",
4414    "ld",
4415    "lds",
4416    "lean",
4417    "lektorproject",
4418    "leo",
4419    "lex",
4420    "lfe",
4421    "lgt",
4422    "lhs",
4423    "libsonnet",
4424    "lid",
4425    "lidr",
4426    "ligo",
4427    "linq",
4428    "lisp",
4429    "litcoffee",
4430    "livecodescript",
4431    "lkml",
4432    "ll",
4433    "lmi",
4434    "logtalk",
4435    "lol",
4436    "lookml",
4437    "lp",
4438    "lpr",
4439    "ls",
4440    "lsl",
4441    "lslp",
4442    "lsp",
4443    "lua",
4444    "luau",
4445    "lvclass",
4446    "lvlib",
4447    "lvproj",
4448    "ly",
4449    "m",
4450    "m2",
4451    "m3",
4452    "m3u",
4453    "m3u8",
4454    "m4",
4455    "ma",
4456    "mak",
4457    "make",
4458    "makefile",
4459    "mako",
4460    "mao",
4461    "mat",
4462    "mata",
4463    "matah",
4464    "mathematica",
4465    "matlab",
4466    "mawk",
4467    "maxhelp",
4468    "maxpat",
4469    "maxproj",
4470    "mbox",
4471    "mbt",
4472    "mc",
4473    "mcfunction",
4474    "mch",
4475    "mcmeta",
4476    "mcr",
4477    "md2",
4478    "md4",
4479    "md5",
4480    "mdpolicy",
4481    "meta",
4482    "metal",
4483    "mg",
4484    "minid",
4485    "mint",
4486    "mir",
4487    "mirah",
4488    "mjml",
4489    "mjs",
4490    "mk",
4491    "mkfile",
4492    "ml",
4493    "ml4",
4494    "mli",
4495    "mligo",
4496    "mlir",
4497    "mll",
4498    "mly",
4499    "mm",
4500    "mmk",
4501    "mms",
4502    "mo",
4503    "mod",
4504    "mojo",
4505    "monkey",
4506    "monkey2",
4507    "moo",
4508    "moon",
4509    "move",
4510    "mpl",
4511    "mps",
4512    "mq4",
4513    "mq5",
4514    "mqh",
4515    "mrc",
4516    "msd",
4517    "msg",
4518    "mspec",
4519    "mss",
4520    "mt",
4521    "mtl",
4522    "mts",
4523    "mu",
4524    "mud",
4525    "muf",
4526    "mumps",
4527    "mxml",
4528    "mxt",
4529    "mysql",
4530    "myt",
4531    "mzn",
4532    "nanorc",
4533    "nas",
4534    "nasl",
4535    "nasm",
4536    "natvis",
4537    "nawk",
4538    "nbp",
4539    "nc",
4540    "ndproj",
4541    "ne",
4542    "nearley",
4543    "ned",
4544    "neon",
4545    "nf",
4546    "nginx",
4547    "nginxconf",
4548    "ni",
4549    "nim",
4550    "nimble",
4551    "nimrod",
4552    "nims",
4553    "ninja",
4554    "nit",
4555    "nix",
4556    "njs",
4557    "nl",
4558    "nlogo",
4559    "nomad",
4560    "nproj",
4561    "nqp",
4562    "nse",
4563    "nsh",
4564    "nsi",
4565    "nss",
4566    "nu",
4567    "numpy",
4568    "numpyw",
4569    "numsc",
4570    "nuspec",
4571    "nut",
4572    "ny",
4573    "ob2",
4574    "obj",
4575    "objdump",
4576    "odd",
4577    "odin",
4578    "ol",
4579    "omgrofl",
4580    "ooc",
4581    "opa",
4582    "opal",
4583    "opencl",
4584    "orc",
4585    "os",
4586    "osm",
4587    "outjob",
4588    "overpassql",
4589    "owl",
4590    "ox",
4591    "oxh",
4592    "oxo",
4593    "oxygene",
4594    "oz",
4595    "p",
4596    "p4",
4597    "p6",
4598    "p6l",
4599    "p6m",
4600    "p8",
4601    "pac",
4602    "pact",
4603    "pan",
4604    "parrot",
4605    "pas",
4606    "pascal",
4607    "pasm",
4608    "pat",
4609    "patch",
4610    "pb",
4611    "pbi",
4612    "pbt",
4613    "pbtxt",
4614    "pcbdoc",
4615    "pck",
4616    "pd",
4617    "pd_lua",
4618    "pddl",
4619    "pde",
4620    "peggy",
4621    "pegjs",
4622    "pep",
4623    "perl",
4624    "pgsql",
4625    "ph",
4626    "php",
4627    "php3",
4628    "php4",
4629    "php5",
4630    "phps",
4631    "phpt",
4632    "pig",
4633    "pike",
4634    "pir",
4635    "pkb",
4636    "pkgproj",
4637    "pkl",
4638    "pks",
4639    "pl",
4640    "pl6",
4641    "plantuml",
4642    "plb",
4643    "plist",
4644    "plot",
4645    "pls",
4646    "plsql",
4647    "plt",
4648    "pluginspec",
4649    "plx",
4650    "pm",
4651    "pm6",
4652    "pml",
4653    "pmod",
4654    "podsl",
4655    "podspec",
4656    "pogo",
4657    "polar",
4658    "pony",
4659    "por",
4660    "pov",
4661    "pp",
4662    "pprx",
4663    "praat",
4664    "prawn",
4665    "prc",
4666    "prefab",
4667    "prefs",
4668    "prg",
4669    "pri",
4670    "prisma",
4671    "prjpcb",
4672    "pro",
4673    "proj",
4674    "prolog",
4675    "properties",
4676    "props",
4677    "proto",
4678    "prw",
4679    "ps1",
4680    "ps1xml",
4681    "psc",
4682    "psc1",
4683    "psd1",
4684    "psgi",
4685    "psm1",
4686    "pt",
4687    "pub",
4688    "pubxml",
4689    "puml",
4690    "purs",
4691    "pwn",
4692    "pxd",
4693    "pxi",
4694    "py",
4695    "py3",
4696    "pyde",
4697    "pyi",
4698    "pyp",
4699    "pyt",
4700    "pytb",
4701    "pyw",
4702    "pyx",
4703    "q",
4704    "qasm",
4705    "qbs",
4706    "qc",
4707    "qhelp",
4708    "ql",
4709    "qll",
4710    "qml",
4711    "qs",
4712    "r",
4713    "r2",
4714    "r3",
4715    "rabl",
4716    "rake",
4717    "raku",
4718    "rakumod",
4719    "rascript",
4720    "raw",
4721    "rb",
4722    "rbbas",
4723    "rbfrm",
4724    "rbi",
4725    "rbmnu",
4726    "rbres",
4727    "rbs",
4728    "rbtbar",
4729    "rbuild",
4730    "rbuistate",
4731    "rbw",
4732    "rbx",
4733    "rbxs",
4734    "rchit",
4735    "rd",
4736    "rdf",
4737    "re",
4738    "reb",
4739    "rebol",
4740    "red",
4741    "reds",
4742    "reek",
4743    "reg",
4744    "regex",
4745    "regexp",
4746    "rego",
4747    "rei",
4748    "religo",
4749    "res",
4750    "resi",
4751    "resource",
4752    "resx",
4753    "rex",
4754    "rexx",
4755    "rg",
4756    "ring",
4757    "rkt",
4758    "rktd",
4759    "rktl",
4760    "rl",
4761    "rmiss",
4762    "robot",
4763    "roc",
4764    "rockspec",
4765    "ron",
4766    "rpgle",
4767    "rpy",
4768    "rq",
4769    "rs",
4770    "rsc",
4771    "rsh",
4772    "rss",
4773    "rsx",
4774    "ru",
4775    "ruby",
4776    "rviz",
4777    "s",
4778    "sage",
4779    "sagews",
4780    "sail",
4781    "sarif",
4782    "sas",
4783    "sats",
4784    "sbatch",
4785    "sbt",
4786    "sc",
4787    "scad",
4788    "scala",
4789    "sce",
4790    "scenic",
4791    "sch",
4792    "schdoc",
4793    "sci",
4794    "scm",
4795    "sco",
4796    "scpt",
4797    "scrbl",
4798    "scxml",
4799    "sdc",
4800    "sed",
4801    "self",
4802    "service",
4803    "sexp",
4804    "sfd",
4805    "sfproj",
4806    "sfv",
4807    "sh",
4808    "sh-session",
4809    "sha1",
4810    "sha2",
4811    "sha224",
4812    "sha256",
4813    "sha256sum",
4814    "sha3",
4815    "sha384",
4816    "sha512",
4817    "shader",
4818    "shen",
4819    "shproj",
4820    "sieve",
4821    "sig",
4822    "sj",
4823    "sjs",
4824    "sl",
4825    "slang",
4826    "sld",
4827    "sln",
4828    "slnx",
4829    "sls",
4830    "slurm",
4831    "sma",
4832    "smali",
4833    "smithy",
4834    "smk",
4835    "sml",
4836    "smt",
4837    "smt2",
4838    "snakefile",
4839    "snap",
4840    "sol",
4841    "sp",
4842    "sparql",
4843    "spc",
4844    "spec",
4845    "spin",
4846    "sps",
4847    "sqf",
4848    "sql",
4849    "sqlrpgle",
4850    "sra",
4851    "srdf",
4852    "sru",
4853    "srv",
4854    "srw",
4855    "ss",
4856    "ssjs",
4857    "stan",
4858    "star",
4859    "sthlp",
4860    "stl",
4861    "ston",
4862    "story",
4863    "storyboard",
4864    "sttheme",
4865    "sublime-build",
4866    "sublime-color-scheme",
4867    "sublime-commands",
4868    "sublime-completions",
4869    "sublime-keymap",
4870    "sublime-macro",
4871    "sublime-menu",
4872    "sublime-mousemap",
4873    "sublime-project",
4874    "sublime-settings",
4875    "sublime-snippet",
4876    "sublime-syntax",
4877    "sublime-theme",
4878    "sublime-workspace",
4879    "sublime_metrics",
4880    "sublime_session",
4881    "surql",
4882    "sv",
4883    "svg",
4884    "svh",
4885    "sw",
4886    "swg",
4887    "swift",
4888    "swig",
4889    "syntax",
4890    "t",
4891    "tab",
4892    "tac",
4893    "tact",
4894    "tag",
4895    "talon",
4896    "targets",
4897    "tcc",
4898    "tcl",
4899    "tcsh",
4900    "te",
4901    "tesc",
4902    "tese",
4903    "textgrid",
4904    "textproto",
4905    "tf",
4906    "tfstate",
4907    "tfvars",
4908    "thor",
4909    "thrift",
4910    "thy",
4911    "tl",
4912    "tla",
4913    "tlv",
4914    "tm",
4915    "tmcommand",
4916    "tmdl",
4917    "tml",
4918    "tmlanguage",
4919    "tmpreferences",
4920    "tmsnippet",
4921    "tmtheme",
4922    "tmux",
4923    "tofu",
4924    "toit",
4925    "toml",
4926    "tool",
4927    "topojson",
4928    "tpb",
4929    "tpp",
4930    "tps",
4931    "tres",
4932    "trg",
4933    "trigger",
4934    "ts",
4935    "tscn",
4936    "tsp",
4937    "tst",
4938    "tsv",
4939    "tsx",
4940    "ttl",
4941    "tu",
4942    "txl",
4943    "txx",
4944    "typ",
4945    "uc",
4946    "udf",
4947    "udo",
4948    "ui",
4949    "unity",
4950    "uno",
4951    "upc",
4952    "uplc",
4953    "ur",
4954    "urdf",
4955    "url",
4956    "urs",
4957    "ux",
4958    "v",
4959    "vala",
4960    "vapi",
4961    "vark",
4962    "vb",
4963    "vba",
4964    "vbhtml",
4965    "vbproj",
4966    "vbs",
4967    "vcf",
4968    "vcl",
4969    "vcxproj",
4970    "vdf",
4971    "veo",
4972    "vert",
4973    "vh",
4974    "vhd",
4975    "vhdl",
4976    "vhf",
4977    "vhi",
4978    "vho",
4979    "vhost",
4980    "vhs",
4981    "vht",
4982    "vhw",
4983    "vim",
4984    "vimrc",
4985    "viw",
4986    "vmb",
4987    "volt",
4988    "vrx",
4989    "vs",
4990    "vsh",
4991    "vshader",
4992    "vsixmanifest",
4993    "vssettings",
4994    "vstemplate",
4995    "vtt",
4996    "vw",
4997    "vxml",
4998    "vy",
4999    "w",
5000    "wast",
5001    "wat",
5002    "watchr",
5003    "wdl",
5004    "webapp",
5005    "webidl",
5006    "webmanifest",
5007    "weechatlog",
5008    "wgsl",
5009    "whiley",
5010    "wisp",
5011    "wit",
5012    "wixproj",
5013    "wl",
5014    "wlk",
5015    "wls",
5016    "wlt",
5017    "wlua",
5018    "workflow",
5019    "wren",
5020    "ws",
5021    "wsdl",
5022    "wsf",
5023    "wsgi",
5024    "wxi",
5025    "wxl",
5026    "wxs",
5027    "x",
5028    "x10",
5029    "x3d",
5030    "x68",
5031    "xacro",
5032    "xaml",
5033    "xbm",
5034    "xc",
5035    "xdc",
5036    "xi",
5037    "xib",
5038    "xlf",
5039    "xliff",
5040    "xm",
5041    "xmi",
5042    "xml",
5043    "xmp",
5044    "xojo_code",
5045    "xojo_menu",
5046    "xojo_report",
5047    "xojo_script",
5048    "xojo_toolbar",
5049    "xojo_window",
5050    "xpl",
5051    "xpm",
5052    "xproc",
5053    "xproj",
5054    "xpy",
5055    "xq",
5056    "xql",
5057    "xqm",
5058    "xquery",
5059    "xqy",
5060    "xrl",
5061    "xs",
5062    "xsd",
5063    "xsh",
5064    "xsjs",
5065    "xsjslib",
5066    "xsl",
5067    "xslt",
5068    "xsp-config",
5069    "xspec",
5070    "xtend",
5071    "xul",
5072    "xzap",
5073    "y",
5074    "yacc",
5075    "yaml",
5076    "yaml-tmlanguage",
5077    "yang",
5078    "yap",
5079    "yar",
5080    "yara",
5081    "yml",
5082    "yrl",
5083    "yul",
5084    "yy",
5085    "yyp",
5086    "z3",
5087    "zap",
5088    "zcml",
5089    "zeek",
5090    "zep",
5091    "zig",
5092    "zil",
5093    "zimpl",
5094    "zmodel",
5095    "zmpl",
5096    "zone",
5097    "zpl",
5098    "zs",
5099    "zsh",
5100    "zsh-theme",
5101];
5102
5103/// Resolve an alias to its canonical language name
5104#[inline]
5105pub fn resolve_canonical(alias: &str) -> Option<&'static str> {
5106    ALIAS_TO_CANONICAL.get(alias.to_lowercase().as_str()).copied()
5107}
5108
5109/// Check if an alias is valid for a canonical language
5110#[inline]
5111pub fn is_valid_alias(canonical: &str, alias: &str) -> bool {
5112    CANONICAL_TO_ALIASES
5113        .get(canonical)
5114        .is_some_and(|aliases| aliases.contains(alias.to_lowercase().as_str()))
5115}
5116
5117/// Get the preferred default alias for a language
5118#[inline]
5119pub fn default_alias(canonical: &str) -> Option<&'static str> {
5120    DEFAULT_ALIASES.get(canonical).copied()
5121}
5122
5123/// Whether `extension` (any case, no leading dot) is a source-code extension.
5124#[inline]
5125pub fn is_source_code_extension(extension: &str) -> bool {
5126    SOURCE_CODE_EXTENSIONS
5127        .binary_search(&extension.to_ascii_lowercase().as_str())
5128        .is_ok()
5129}
5130
5131/// Get all valid aliases for a canonical language
5132#[inline]
5133pub fn get_aliases(canonical: &str) -> Option<&HashSet<&'static str>> {
5134    CANONICAL_TO_ALIASES.get(canonical)
5135}
5136
5137/// Whether GitHub recognizes `label` as a fenced-code-block language: a
5138/// language name, an alias, or a file extension. This is the accept-set for
5139/// "unknown language" checks. It is intentionally broader than
5140/// `resolve_canonical`, which answers the different question "which language
5141/// is this" and must stay alias-only: extension labels like `pytb` are known
5142/// (GitHub highlights them) but have no canonical resolution safe enough to
5143/// rewrite or route on.
5144#[inline]
5145pub fn is_known_language(label: &str) -> bool {
5146    let lower = label.to_lowercase();
5147    ALIAS_TO_CANONICAL.contains_key(lower.as_str()) || KNOWN_EXTENSIONS.contains(lower.as_str())
5148}
5149
5150// Statistics:
5151// - 1210 aliases (1208 generated + 2 manual: py, py3)
5152// - 720 canonical languages
5153// - 39 curated default aliases
5154// - 1443 known extensions (scripts/gen_linguist_extensions.py)
5155// - 1231 source-code extensions (scripts/gen_linguist_extensions.py --source-code)
5156
5157#[cfg(test)]
5158mod tests {
5159    use super::*;
5160
5161    /// Regression test for a category of bugs, not one instance: rumdl's generated
5162    /// Linguist alias table must resolve every high-traffic language alias. Each
5163    /// alias below is confirmed present in GitHub Linguist's `aliases:` list for its
5164    /// language (verified against the current upstream `languages.yml`; `py` and
5165    /// `py3` were added to Python's aliases after the `e51c2270` generation pin, see
5166    /// the module header comment).
5167    #[test]
5168    fn test_high_traffic_aliases_resolve_to_expected_canonical() {
5169        let cases = [
5170            ("py", "Python"),
5171            ("py3", "Python"),
5172            ("python", "Python"),
5173            ("sh", "Shell"),
5174            ("bash", "Shell"),
5175            ("shell", "Shell"),
5176            ("zsh", "Shell"),
5177            ("js", "JavaScript"),
5178            ("javascript", "JavaScript"),
5179            ("ts", "TypeScript"),
5180            ("typescript", "TypeScript"),
5181            ("rb", "Ruby"),
5182            ("ruby", "Ruby"),
5183            ("rs", "Rust"),
5184            ("rust", "Rust"),
5185            ("yml", "YAML"),
5186            ("yaml", "YAML"),
5187            ("cpp", "C++"),
5188            ("c++", "C++"),
5189            ("csharp", "C#"),
5190            ("golang", "Go"),
5191            ("dockerfile", "Dockerfile"),
5192            ("jsonc", "JSON"),
5193            ("kotlin", "Kotlin"),
5194        ];
5195        for (alias, expected_canonical) in cases {
5196            assert_eq!(
5197                resolve_canonical(alias),
5198                Some(expected_canonical),
5199                "alias '{alias}' should resolve to '{expected_canonical}'"
5200            );
5201        }
5202    }
5203
5204    /// `cs`, `kt`, and `pl` are file extensions but never appear in Linguist's
5205    /// `aliases:` list for C#, Kotlin, or Perl, so they must stay unresolved rather
5206    /// than being guessed at.
5207    #[test]
5208    fn test_extension_lookalikes_are_not_aliases() {
5209        for alias in ["cs", "kt", "pl"] {
5210            assert_eq!(
5211                resolve_canonical(alias),
5212                None,
5213                "'{alias}' is a file extension, not a Linguist alias, and must not resolve"
5214            );
5215        }
5216    }
5217
5218    /// Extension labels are KNOWN (GitHub highlights them as fence labels: a
5219    /// ```pytb block renders with the Python-traceback grammar even though
5220    /// `pytb` appears only in `extensions:`, never `aliases:`) while staying
5221    /// unresolvable. Existence and identity are deliberately different
5222    /// questions: `.pl` is both Perl and Prolog, so rewriting or routing on an
5223    /// extension would guess, but rejecting it as "unknown" would be a false
5224    /// positive against GitHub's actual behavior.
5225    #[test]
5226    fn test_extensions_are_known_but_not_resolvable() {
5227        for label in ["pytb", "cs", "kt", "pl", "PYTB"] {
5228            assert!(
5229                is_known_language(label),
5230                "'{label}' is a Linguist file extension and must be known"
5231            );
5232        }
5233        assert_eq!(resolve_canonical("pytb"), None, "extensions must not resolve");
5234        // Aliases and names are of course also known
5235        for label in ["py", "python", "Rust"] {
5236            assert!(is_known_language(label), "'{label}' must be known");
5237        }
5238        // Garbage stays unknown
5239        for label in ["unknownlang", "notareallanguage", ""] {
5240            assert!(!is_known_language(label), "'{label}' must stay unknown");
5241        }
5242    }
5243
5244    /// `ALIAS_TO_CANONICAL` and `CANONICAL_TO_ALIASES` are two independent lookup
5245    /// tables built from the same source data; they must never disagree about which
5246    /// canonical language an alias belongs to.
5247    #[test]
5248    fn test_alias_maps_are_mutually_consistent() {
5249        for (&canonical, aliases) in CANONICAL_TO_ALIASES.iter() {
5250            for &alias in aliases {
5251                assert_eq!(
5252                    ALIAS_TO_CANONICAL.get(alias),
5253                    Some(&canonical),
5254                    "CANONICAL_TO_ALIASES['{canonical}'] contains '{alias}', \
5255                     but ALIAS_TO_CANONICAL['{alias}'] does not map back to '{canonical}'"
5256                );
5257            }
5258        }
5259        for (&alias, &canonical) in ALIAS_TO_CANONICAL.iter() {
5260            if let Some(aliases) = CANONICAL_TO_ALIASES.get(canonical) {
5261                assert!(
5262                    aliases.contains(alias),
5263                    "ALIAS_TO_CANONICAL['{alias}'] maps to '{canonical}', \
5264                     but CANONICAL_TO_ALIASES['{canonical}'] does not contain '{alias}'"
5265                );
5266            }
5267        }
5268    }
5269}