use std::fs;

use rand::Rng;
use rand::rngs::SmallRng;

use crate::engine::filter::CharFilter;
use crate::generator::TextGenerator;
use crate::generator::cache::fetch_url_bytes_with_progress;

pub enum BlockStyle {
    Braces(&'static [&'static str]),
    Indentation(&'static [&'static str]),
    EndDelimited(&'static [&'static str]),
}

pub struct CodeLanguage {
    pub key: &'static str,
    pub display_name: &'static str,
    #[allow(dead_code)]
    pub extensions: &'static [&'static str],
    pub repos: &'static [CodeRepo],
    pub has_builtin: bool,
    pub block_style: BlockStyle,
}

pub struct CodeRepo {
    pub key: &'static str,
    pub urls: &'static [&'static str],
}

pub const CODE_LANGUAGES: &[CodeLanguage] = &[
    // === Built-in languages (has_builtin: true) ===
    CodeLanguage {
        key: "rust",
        display_name: "Rust",
        extensions: &[".rs"],
        repos: &[
            CodeRepo {
                key: "tokio",
                urls: &[
                    "https://raw.githubusercontent.com/tokio-rs/tokio/6752f50154025a1aa2c231b643cdb78bb4c3892f/tokio/src/sync/mutex.rs",
                    "https://raw.githubusercontent.com/tokio-rs/tokio/6752f50154025a1aa2c231b643cdb78bb4c3892f/tokio/src/net/tcp/stream.rs",
                    "https://raw.githubusercontent.com/tokio-rs/tokio/6752f50154025a1aa2c231b643cdb78bb4c3892f/tokio/src/sync/mpsc/chan.rs",
                ],
            },
            CodeRepo {
                key: "ripgrep",
                urls: &[
                    "https://raw.githubusercontent.com/BurntSushi/ripgrep/4519153e5e461527f4bca45b042fff45c4ec6fb9/crates/regex/src/config.rs",
                    "https://raw.githubusercontent.com/BurntSushi/ripgrep/4519153e5e461527f4bca45b042fff45c4ec6fb9/crates/searcher/src/searcher/mod.rs",
                    "https://raw.githubusercontent.com/BurntSushi/ripgrep/4519153e5e461527f4bca45b042fff45c4ec6fb9/crates/globset/src/lib.rs",
                ],
            },
            CodeRepo {
                key: "serde",
                urls: &[
                    "https://raw.githubusercontent.com/serde-rs/serde/fa7da4a93567ed347ad0735c28e439fca688ef26/serde_core/src/ser/mod.rs",
                    "https://raw.githubusercontent.com/serde-rs/serde/fa7da4a93567ed347ad0735c28e439fca688ef26/serde_core/src/de/mod.rs",
                    "https://raw.githubusercontent.com/serde-rs/serde/fa7da4a93567ed347ad0735c28e439fca688ef26/serde_core/src/macros.rs",
                ],
            },
            CodeRepo {
                key: "axum",
                urls: &[
                    "https://raw.githubusercontent.com/tokio-rs/axum/441216428893d13544f12722b54dcaaadd47135a/axum/src/routing/mod.rs",
                    "https://raw.githubusercontent.com/tokio-rs/axum/441216428893d13544f12722b54dcaaadd47135a/axum/src/extract/state.rs",
                    "https://raw.githubusercontent.com/tokio-rs/axum/441216428893d13544f12722b54dcaaadd47135a/axum/src/routing/method_routing.rs",
                ],
            },
            CodeRepo {
                key: "bevy",
                urls: &[
                    "https://raw.githubusercontent.com/bevyengine/bevy/84be6ac40c88eb7c5ba0243e3d6902058225c6b6/crates/bevy_ecs/src/world/mod.rs",
                    "https://raw.githubusercontent.com/bevyengine/bevy/84be6ac40c88eb7c5ba0243e3d6902058225c6b6/crates/bevy_ecs/src/query/state.rs",
                    "https://raw.githubusercontent.com/bevyengine/bevy/84be6ac40c88eb7c5ba0243e3d6902058225c6b6/crates/bevy_ecs/src/system/system_param.rs",
                ],
            },
            CodeRepo {
                key: "clap",
                urls: &[
                    "https://raw.githubusercontent.com/clap-rs/clap/f0d30d961d26f8fb636b33242256fca73a717f77/clap_builder/src/builder/command.rs",
                    "https://raw.githubusercontent.com/clap-rs/clap/f0d30d961d26f8fb636b33242256fca73a717f77/clap_builder/src/parser/parser.rs",
                ],
            },
            CodeRepo {
                key: "tokio-runtime",
                urls: &[
                    "https://raw.githubusercontent.com/tokio-rs/tokio/6752f50154025a1aa2c231b643cdb78bb4c3892f/tokio/src/runtime/scheduler/multi_thread/worker.rs",
                ],
            },
        ],
        has_builtin: true,
        block_style: BlockStyle::Braces(&[
            "fn ",
            "pub fn ",
            "async fn ",
            "pub async fn ",
            "impl ",
            "trait ",
            "struct ",
            "enum ",
            "macro_rules! ",
            "mod ",
            "const ",
            "static ",
            "type ",
            "pub struct ",
            "pub enum ",
            "pub trait ",
            "pub mod ",
            "pub const ",
            "pub static ",
            "pub type ",
        ]),
    },
    CodeLanguage {
        key: "python",
        display_name: "Python",
        extensions: &[".py", ".pyi"],
        repos: &[
            CodeRepo {
                key: "cpython",
                urls: &[
                    "https://raw.githubusercontent.com/python/cpython/70d1b08a4bb52652094c3eb69e36223ecd8b8075/Lib/json/encoder.py",
                    "https://raw.githubusercontent.com/python/cpython/70d1b08a4bb52652094c3eb69e36223ecd8b8075/Lib/pathlib/__init__.py",
                ],
            },
            CodeRepo {
                key: "django",
                urls: &[
                    "https://raw.githubusercontent.com/django/django/afa026cd80a2388255a137a274568aef09f9fee7/django/db/models/query.py",
                    "https://raw.githubusercontent.com/django/django/afa026cd80a2388255a137a274568aef09f9fee7/django/http/request.py",
                ],
            },
            CodeRepo {
                key: "flask",
                urls: &[
                    "https://raw.githubusercontent.com/pallets/flask/7ef2946fb5151b745df30201b8c27790cac53875/src/flask/app.py",
                    "https://raw.githubusercontent.com/pallets/flask/7ef2946fb5151b745df30201b8c27790cac53875/src/flask/helpers.py",
                    "https://raw.githubusercontent.com/pallets/flask/7ef2946fb5151b745df30201b8c27790cac53875/src/flask/ctx.py",
                ],
            },
            CodeRepo {
                key: "requests",
                urls: &[
                    "https://raw.githubusercontent.com/psf/requests/6360477c52303c9445b45fa8744b02d05a2f0905/src/requests/models.py",
                    "https://raw.githubusercontent.com/psf/requests/6360477c52303c9445b45fa8744b02d05a2f0905/src/requests/sessions.py",
                ],
            },
            CodeRepo {
                key: "fastapi",
                urls: &[
                    "https://raw.githubusercontent.com/fastapi/fastapi/d128a7089a645466b789e32097de125a3b0f8979/fastapi/routing.py",
                    "https://raw.githubusercontent.com/fastapi/fastapi/d128a7089a645466b789e32097de125a3b0f8979/fastapi/applications.py",
                ],
            },
            CodeRepo {
                key: "black",
                urls: &[
                    "https://raw.githubusercontent.com/psf/black/e079b7e100d1e181d4ee860ee4512bf3326f32c3/src/black/linegen.py",
                    "https://raw.githubusercontent.com/psf/black/e079b7e100d1e181d4ee860ee4512bf3326f32c3/src/black/parsing.py",
                ],
            },
            CodeRepo {
                key: "cpython-collections",
                urls: &[
                    "https://raw.githubusercontent.com/python/cpython/70d1b08a4bb52652094c3eb69e36223ecd8b8075/Lib/collections/__init__.py",
                ],
            },
        ],
        has_builtin: true,
        block_style: BlockStyle::Indentation(&["def ", "class ", "async def ", "@"]),
    },
    CodeLanguage {
        key: "javascript",
        display_name: "JavaScript",
        extensions: &[".js", ".mjs"],
        repos: &[
            CodeRepo {
                key: "node-stdlib",
                urls: &[
                    "https://raw.githubusercontent.com/nodejs/node/bf452bb0af57b859f2f907329ef4c2a71f09b5e7/lib/path.js",
                    "https://raw.githubusercontent.com/nodejs/node/bf452bb0af57b859f2f907329ef4c2a71f09b5e7/lib/url.js",
                    "https://raw.githubusercontent.com/nodejs/node/bf452bb0af57b859f2f907329ef4c2a71f09b5e7/lib/fs.js",
                    "https://raw.githubusercontent.com/nodejs/node/bf452bb0af57b859f2f907329ef4c2a71f09b5e7/lib/events.js",
                ],
            },
            CodeRepo {
                key: "express",
                urls: &[
                    "https://raw.githubusercontent.com/expressjs/express/6c4249feec8ab40631817c8e7001baf2ed022224/lib/application.js",
                    "https://raw.githubusercontent.com/expressjs/express/6c4249feec8ab40631817c8e7001baf2ed022224/lib/response.js",
                    "https://raw.githubusercontent.com/expressjs/express/6c4249feec8ab40631817c8e7001baf2ed022224/lib/request.js",
                ],
            },
            CodeRepo {
                key: "webpack",
                urls: &[
                    "https://raw.githubusercontent.com/webpack/webpack/9fb3b03ae1f7e66e6c6815561de5830c1821af5c/lib/Compiler.js",
                    "https://raw.githubusercontent.com/webpack/webpack/9fb3b03ae1f7e66e6c6815561de5830c1821af5c/lib/NormalModule.js",
                ],
            },
            CodeRepo {
                key: "three-js",
                urls: &[
                    "https://raw.githubusercontent.com/mrdoob/three.js/85f77d7f2ad12ce724aa5624facb11b23233281d/src/math/Vector3.js",
                    "https://raw.githubusercontent.com/mrdoob/three.js/85f77d7f2ad12ce724aa5624facb11b23233281d/src/math/Matrix4.js",
                    "https://raw.githubusercontent.com/mrdoob/three.js/85f77d7f2ad12ce724aa5624facb11b23233281d/src/math/Quaternion.js",
                ],
            },
            CodeRepo {
                key: "node-streams",
                urls: &[
                    "https://raw.githubusercontent.com/nodejs/node/bf452bb0af57b859f2f907329ef4c2a71f09b5e7/lib/internal/streams/readable.js",
                    "https://raw.githubusercontent.com/nodejs/node/bf452bb0af57b859f2f907329ef4c2a71f09b5e7/lib/internal/streams/writable.js",
                ],
            },
        ],
        has_builtin: true,
        block_style: BlockStyle::Braces(&[
            "function ",
            "async function ",
            "const ",
            "class ",
            "export function ",
            "export default function ",
            "let ",
            "export ",
        ]),
    },
    CodeLanguage {
        key: "go",
        display_name: "Go",
        extensions: &[".go"],
        repos: &[
            CodeRepo {
                key: "go-stdlib",
                urls: &[
                    "https://raw.githubusercontent.com/golang/go/1f8aff4386ca8be6ae9b9553205d113884c4a8ee/src/fmt/print.go",
                    "https://raw.githubusercontent.com/golang/go/1f8aff4386ca8be6ae9b9553205d113884c4a8ee/src/fmt/format.go",
                    "https://raw.githubusercontent.com/golang/go/1f8aff4386ca8be6ae9b9553205d113884c4a8ee/src/net/http/server.go",
                ],
            },
            CodeRepo {
                key: "gin",
                urls: &[
                    "https://raw.githubusercontent.com/gin-gonic/gin/d3ffc9985281dcf4d3bef604cce4e662b1a327a6/gin.go",
                    "https://raw.githubusercontent.com/gin-gonic/gin/d3ffc9985281dcf4d3bef604cce4e662b1a327a6/context.go",
                    "https://raw.githubusercontent.com/gin-gonic/gin/d3ffc9985281dcf4d3bef604cce4e662b1a327a6/routergroup.go",
                ],
            },
            CodeRepo {
                key: "hugo",
                urls: &[
                    "https://raw.githubusercontent.com/gohugoio/hugo/df520e315087210e069050a873fb5e208659af91/hugolib/page.go",
                    "https://raw.githubusercontent.com/gohugoio/hugo/df520e315087210e069050a873fb5e208659af91/hugolib/site.go",
                ],
            },
            CodeRepo {
                key: "prometheus",
                urls: &[
                    "https://raw.githubusercontent.com/prometheus/prometheus/ced39f8a74dda22d4a87fc8a2d1d71c446826bb1/model/labels/labels_common.go",
                    "https://raw.githubusercontent.com/prometheus/prometheus/ced39f8a74dda22d4a87fc8a2d1d71c446826bb1/model/labels/matcher.go",
                    "https://raw.githubusercontent.com/prometheus/prometheus/ced39f8a74dda22d4a87fc8a2d1d71c446826bb1/tsdb/head.go",
                ],
            },
            CodeRepo {
                key: "kubernetes",
                urls: &[
                    "https://raw.githubusercontent.com/kubernetes/kubernetes/610490d1e13f20aaf76ca4092afcf32ba07b5b34/pkg/scheduler/schedule_one.go",
                    "https://raw.githubusercontent.com/kubernetes/kubernetes/610490d1e13f20aaf76ca4092afcf32ba07b5b34/pkg/scheduler/scheduler.go",
                ],
            },
        ],
        has_builtin: true,
        block_style: BlockStyle::Braces(&["func ", "type "]),
    },
    CodeLanguage {
        key: "typescript",
        display_name: "TypeScript",
        extensions: &[".ts", ".tsx"],
        repos: &[
            CodeRepo {
                key: "ts-node",
                urls: &[
                    "https://raw.githubusercontent.com/TypeStrong/ts-node/ddb05ef23be92a90c3ecac5a0220435c65ebbd2a/src/index.ts",
                ],
            },
            CodeRepo {
                key: "deno-std",
                urls: &[
                    "https://raw.githubusercontent.com/denoland/std/1cd63ca60af2e63d51162918b2c061c6f841f9ee/fs/walk.ts",
                    "https://raw.githubusercontent.com/denoland/std/1cd63ca60af2e63d51162918b2c061c6f841f9ee/fs/copy.ts",
                ],
            },
            CodeRepo {
                key: "typeorm",
                urls: &[
                    "https://raw.githubusercontent.com/typeorm/typeorm/c6f0aa5119fe7c5ab5b602ae8bfbf798278ce443/src/query-builder/QueryBuilder.ts",
                    "https://raw.githubusercontent.com/typeorm/typeorm/c6f0aa5119fe7c5ab5b602ae8bfbf798278ce443/src/query-builder/SelectQueryBuilder.ts",
                    "https://raw.githubusercontent.com/typeorm/typeorm/c6f0aa5119fe7c5ab5b602ae8bfbf798278ce443/src/entity-manager/EntityManager.ts",
                ],
            },
            CodeRepo {
                key: "zod",
                urls: &[
                    "https://raw.githubusercontent.com/colinhacks/zod/c7805073fef5b6b8857307c3d4b3597a70613bc2/packages/zod/src/v4/classic/schemas.ts",
                ],
            },
            CodeRepo {
                key: "prisma",
                urls: &[
                    "https://raw.githubusercontent.com/prisma/prisma/5fece0a97ca3f7a05a7ae6691d49728d19b795a4/packages/client/src/runtime/core/model/applyModel.ts",
                    "https://raw.githubusercontent.com/prisma/prisma/5fece0a97ca3f7a05a7ae6691d49728d19b795a4/packages/client/src/runtime/core/jsonProtocol/serializeJsonQuery.ts",
                ],
            },
            CodeRepo {
                key: "typescript-compiler",
                urls: &[
                    "https://raw.githubusercontent.com/microsoft/TypeScript/71586adc7bec6b358809b5301ad2c6f0d7703174/src/compiler/utilities.ts",
                    "https://raw.githubusercontent.com/microsoft/TypeScript/71586adc7bec6b358809b5301ad2c6f0d7703174/src/compiler/checker.ts",
                ],
            },
            CodeRepo {
                key: "vscode",
                urls: &[
                    "https://raw.githubusercontent.com/microsoft/vscode/b27242af3a1749bb0223224e87ec8432e825b91f/src/vs/editor/common/model/textModel.ts",
                    "https://raw.githubusercontent.com/microsoft/vscode/b27242af3a1749bb0223224e87ec8432e825b91f/src/vs/base/common/strings.ts",
                ],
            },
            CodeRepo {
                key: "angular",
                urls: &[
                    "https://raw.githubusercontent.com/angular/angular/c9502999cfd5063e8af32424b99496ae9906b04a/packages/core/src/render3/instructions/shared.ts",
                    "https://raw.githubusercontent.com/angular/angular/c9502999cfd5063e8af32424b99496ae9906b04a/packages/core/src/di/injector.ts",
                ],
            },
            CodeRepo {
                key: "nestjs",
                urls: &[
                    "https://raw.githubusercontent.com/nestjs/nest/f7d4460f0b34bd4a70be4552c3ca9e11eaecdb8c/packages/core/injector/container.ts",
                    "https://raw.githubusercontent.com/nestjs/nest/f7d4460f0b34bd4a70be4552c3ca9e11eaecdb8c/packages/core/router/router-explorer.ts",
                ],
            },
            CodeRepo {
                key: "react-router",
                urls: &[
                    "https://raw.githubusercontent.com/remix-run/react-router/7b21212c8044e7a541f101b62dc2496911fbc2d2/packages/react-router/lib/router/router.ts",
                ],
            },
            CodeRepo {
                key: "lexical",
                urls: &[
                    "https://raw.githubusercontent.com/facebook/lexical/84c9e0d66f494a992e8de2320b261295a56f1688/packages/lexical/src/LexicalNode.ts",
                    "https://raw.githubusercontent.com/facebook/lexical/84c9e0d66f494a992e8de2320b261295a56f1688/packages/lexical/src/LexicalEditor.ts",
                ],
            },
        ],
        has_builtin: true,
        block_style: BlockStyle::Braces(&[
            "function ",
            "export function ",
            "async function ",
            "const ",
            "class ",
            "interface ",
            "type ",
            "export default function ",
            "let ",
            "export ",
        ]),
    },
    CodeLanguage {
        key: "java",
        display_name: "Java",
        extensions: &[".java"],
        repos: &[
            CodeRepo {
                key: "guava",
                urls: &[
                    "https://raw.githubusercontent.com/google/guava/816eaa1d8b0ab1f5d16b671337dbb447e3845ce0/guava/src/com/google/common/collect/ImmutableList.java",
                    "https://raw.githubusercontent.com/google/guava/816eaa1d8b0ab1f5d16b671337dbb447e3845ce0/guava/src/com/google/common/base/Preconditions.java",
                ],
            },
            CodeRepo {
                key: "gson",
                urls: &[
                    "https://raw.githubusercontent.com/google/gson/1fa9b7a0a994b006b3be00e2df9de778e71e6807/gson/src/main/java/com/google/gson/Gson.java",
                    "https://raw.githubusercontent.com/google/gson/1fa9b7a0a994b006b3be00e2df9de778e71e6807/gson/src/main/java/com/google/gson/stream/JsonReader.java",
                ],
            },
            CodeRepo {
                key: "spring-framework",
                urls: &[
                    "https://raw.githubusercontent.com/spring-projects/spring-framework/e7fdbb8339b3d5ee8e61a4d232d1d499a816a61b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java",
                    "https://raw.githubusercontent.com/spring-projects/spring-framework/e7fdbb8339b3d5ee8e61a4d232d1d499a816a61b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java",
                ],
            },
            CodeRepo {
                key: "elasticsearch",
                urls: &[
                    "https://raw.githubusercontent.com/elastic/elasticsearch/31afffb42a14f1838474b431ea06ff281a7cd96e/server/src/main/java/org/elasticsearch/index/query/QueryBuilders.java",
                ],
            },
            CodeRepo {
                key: "junit5",
                urls: &[
                    "https://raw.githubusercontent.com/junit-team/junit5/596ca97324f3b820895ae84b64a5cfcd3446fe5a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Assertions.java",
                ],
            },
            CodeRepo {
                key: "commons-lang",
                urls: &[
                    "https://raw.githubusercontent.com/apache/commons-lang/4d52dd2e873bf9152d5132256d7a8c2b4e975bd9/src/main/java/org/apache/commons/lang3/StringUtils.java",
                ],
            },
            CodeRepo {
                key: "commons-lang-math",
                urls: &[
                    "https://raw.githubusercontent.com/apache/commons-lang/4d52dd2e873bf9152d5132256d7a8c2b4e975bd9/src/main/java/org/apache/commons/lang3/math/NumberUtils.java",
                ],
            },
        ],
        has_builtin: true,
        block_style: BlockStyle::Braces(&[
            "public ",
            "private ",
            "protected ",
            "static ",
            "class ",
            "interface ",
            "void ",
            "int ",
            "String ",
            "boolean ",
            "@",
            "abstract ",
            "final ",
        ]),
    },
    CodeLanguage {
        key: "c",
        display_name: "C",
        extensions: &[".c", ".h"],
        repos: &[
            CodeRepo {
                key: "redis",
                urls: &[
                    "https://raw.githubusercontent.com/redis/redis/a6a27f56f2df1a9da3d46aea1fca6e33a89e3f61/src/server.c",
                    "https://raw.githubusercontent.com/redis/redis/a6a27f56f2df1a9da3d46aea1fca6e33a89e3f61/src/networking.c",
                ],
            },
            CodeRepo {
                key: "jq",
                urls: &[
                    "https://raw.githubusercontent.com/jqlang/jq/cec6b0f34603edc5cd12db1f63dacdf547b4bb4a/src/builtin.c",
                ],
            },
            CodeRepo {
                key: "sqlite",
                urls: &[
                    "https://raw.githubusercontent.com/sqlite/sqlite/f92d107242c8aed695bc2823e41d63afd69c84f7/src/where.c",
                    "https://raw.githubusercontent.com/sqlite/sqlite/f92d107242c8aed695bc2823e41d63afd69c84f7/src/select.c",
                ],
            },
            CodeRepo {
                key: "curl",
                urls: &[
                    "https://raw.githubusercontent.com/curl/curl/b9690e9cd14188a5f6ab994cfea98f33447c487e/lib/url.c",
                    "https://raw.githubusercontent.com/curl/curl/b9690e9cd14188a5f6ab994cfea98f33447c487e/lib/transfer.c",
                ],
            },
            CodeRepo {
                key: "git",
                urls: &[
                    "https://raw.githubusercontent.com/git/git/270e10ad6dda3379ea0da7efd11e4fbf2cd7a325/diff.c",
                    "https://raw.githubusercontent.com/git/git/270e10ad6dda3379ea0da7efd11e4fbf2cd7a325/commit.c",
                ],
            },
        ],
        has_builtin: true,
        block_style: BlockStyle::Braces(&[
            "int ",
            "void ",
            "char ",
            "float ",
            "double ",
            "struct ",
            "unsigned ",
            "static ",
            "const ",
            "typedef ",
            "#define ",
            "enum ",
        ]),
    },
    CodeLanguage {
        key: "cpp",
        display_name: "C++",
        extensions: &[".cpp", ".hpp", ".cc", ".cxx"],
        repos: &[
            CodeRepo {
                key: "json",
                urls: &[
                    "https://raw.githubusercontent.com/nlohmann/json/9a737481aed085fd289f82dff1fa8c3c66627a7e/include/nlohmann/json.hpp",
                ],
            },
            CodeRepo {
                key: "fmt",
                urls: &[
                    "https://raw.githubusercontent.com/fmtlib/fmt/cdb8dc76d936a12aacc20b6d283d7c24ee4307fe/include/fmt/format.h",
                ],
            },
            CodeRepo {
                key: "abseil",
                urls: &[
                    "https://raw.githubusercontent.com/abseil/abseil-cpp/4ff7ff9ee91464682e2916af9ae0d62357001dc4/absl/strings/str_cat.cc",
                    "https://raw.githubusercontent.com/abseil/abseil-cpp/4ff7ff9ee91464682e2916af9ae0d62357001dc4/absl/container/flat_hash_map.h",
                ],
            },
            CodeRepo {
                key: "grpc",
                urls: &[
                    "https://raw.githubusercontent.com/grpc/grpc/a2f0c2965a3f644a24fcb1c40d7fe1706e65ef93/src/cpp/server/server_builder.cc",
                ],
            },
            CodeRepo {
                key: "imgui",
                urls: &[
                    "https://raw.githubusercontent.com/ocornut/imgui/689f837afae1f8673c7eebaaee8927350f3e1080/imgui_widgets.cpp",
                    "https://raw.githubusercontent.com/ocornut/imgui/689f837afae1f8673c7eebaaee8927350f3e1080/imgui.cpp",
                ],
            },
            CodeRepo {
                key: "opencv",
                urls: &[
                    "https://raw.githubusercontent.com/opencv/opencv/2027a3399076b099930fc8eb2721d8c028fdabc0/modules/core/src/matrix.cpp",
                    "https://raw.githubusercontent.com/opencv/opencv/2027a3399076b099930fc8eb2721d8c028fdabc0/modules/core/src/algorithm.cpp",
                ],
            },
            CodeRepo {
                key: "protobuf",
                urls: &[
                    "https://raw.githubusercontent.com/protocolbuffers/protobuf/b6e522885b3b69562677ba146be979d414f0b6c3/src/google/protobuf/descriptor.cc",
                ],
            },
            CodeRepo {
                key: "electron",
                urls: &[
                    "https://raw.githubusercontent.com/electron/electron/e0bd4ffc39d6bd563d7094905f579c8d79643b4c/shell/browser/api/electron_api_web_contents.cc",
                ],
            },
        ],
        has_builtin: true,
        block_style: BlockStyle::Braces(&[
            "int ",
            "void ",
            "char ",
            "auto ",
            "class ",
            "struct ",
            "template",
            "namespace ",
            "virtual ",
            "static ",
            "const ",
            "typedef ",
            "#define ",
            "enum ",
            "constexpr ",
        ]),
    },
    CodeLanguage {
        key: "ruby",
        display_name: "Ruby",
        extensions: &[".rb"],
        repos: &[
            CodeRepo {
                key: "rake",
                urls: &[
                    "https://raw.githubusercontent.com/ruby/rake/83e40e3d5aef8289a097d0c0259958a40f866555/lib/rake/task.rb",
                    "https://raw.githubusercontent.com/ruby/rake/83e40e3d5aef8289a097d0c0259958a40f866555/lib/rake/application.rb",
                ],
            },
            CodeRepo {
                key: "sinatra",
                urls: &[
                    "https://raw.githubusercontent.com/sinatra/sinatra/f891dd2b6f4911e356600efe6c3b82af97d262c6/lib/sinatra/base.rb",
                ],
            },
            CodeRepo {
                key: "rails",
                urls: &[
                    "https://raw.githubusercontent.com/rails/rails/2ea08c89169c05bb2087cd67314bcff23116e597/activerecord/lib/active_record/relation/query_methods.rb",
                    "https://raw.githubusercontent.com/rails/rails/2ea08c89169c05bb2087cd67314bcff23116e597/actionpack/lib/action_controller/metal/strong_parameters.rb",
                ],
            },
            CodeRepo {
                key: "jekyll",
                urls: &[
                    "https://raw.githubusercontent.com/jekyll/jekyll/ff0d4dd78d939d8596f5ded57f3b2b321eb66b5a/lib/jekyll/site.rb",
                    "https://raw.githubusercontent.com/jekyll/jekyll/ff0d4dd78d939d8596f5ded57f3b2b321eb66b5a/lib/jekyll/document.rb",
                ],
            },
            CodeRepo {
                key: "devise",
                urls: &[
                    "https://raw.githubusercontent.com/heartcombo/devise/5e3a8bf3a01cc556185dbde47ecf3bb20c41b150/lib/devise/models/authenticatable.rb",
                ],
            },
            CodeRepo {
                key: "rails-routing",
                urls: &[
                    "https://raw.githubusercontent.com/rails/rails/2ea08c89169c05bb2087cd67314bcff23116e597/actionpack/lib/action_dispatch/routing/mapper.rb",
                    "https://raw.githubusercontent.com/rails/rails/2ea08c89169c05bb2087cd67314bcff23116e597/activesupport/lib/active_support/core_ext/string/inflections.rb",
                ],
            },
            CodeRepo {
                key: "ruby-net-http",
                urls: &[
                    "https://raw.githubusercontent.com/ruby/ruby/c6bee053a2bb07fd5187f88b9312d58244ba390b/lib/net/http.rb",
                    "https://raw.githubusercontent.com/ruby/ruby/c6bee053a2bb07fd5187f88b9312d58244ba390b/lib/uri/generic.rb",
                ],
            },
            CodeRepo {
                key: "rails-activerecord",
                urls: &[
                    "https://raw.githubusercontent.com/rails/rails/2ea08c89169c05bb2087cd67314bcff23116e597/activerecord/lib/active_record/base.rb",
                ],
            },
        ],
        has_builtin: true,
        block_style: BlockStyle::EndDelimited(&[
            "def ",
            "class ",
            "module ",
            "attr_",
            "scope ",
            "describe ",
            "it ",
        ]),
    },
    CodeLanguage {
        key: "swift",
        display_name: "Swift",
        extensions: &[".swift"],
        repos: &[
            CodeRepo {
                key: "swift-algorithms",
                urls: &[
                    "https://raw.githubusercontent.com/apple/swift-algorithms/0b4376902cfc3901c496a79f2cb70f1ffd583fff/Sources/Algorithms/Chunked.swift",
                    "https://raw.githubusercontent.com/apple/swift-algorithms/0b4376902cfc3901c496a79f2cb70f1ffd583fff/Sources/Algorithms/Combinations.swift",
                    "https://raw.githubusercontent.com/apple/swift-algorithms/0b4376902cfc3901c496a79f2cb70f1ffd583fff/Sources/Algorithms/Permutations.swift",
                ],
            },
            CodeRepo {
                key: "swift-nio",
                urls: &[
                    "https://raw.githubusercontent.com/apple/swift-nio/558f24a4647193b5a0e2104031b71c55d31ff83a/Sources/NIOCore/Channel.swift",
                    "https://raw.githubusercontent.com/apple/swift-nio/558f24a4647193b5a0e2104031b71c55d31ff83a/Sources/NIOCore/EventLoop.swift",
                ],
            },
            CodeRepo {
                key: "vapor",
                urls: &[
                    "https://raw.githubusercontent.com/vapor/vapor/ff88583e10f02aa47be49e632d5179f89e855e03/Sources/Vapor/Application.swift",
                    "https://raw.githubusercontent.com/vapor/vapor/ff88583e10f02aa47be49e632d5179f89e855e03/Sources/Vapor/Routing/RoutesBuilder.swift",
                ],
            },
            CodeRepo {
                key: "alamofire",
                urls: &[
                    "https://raw.githubusercontent.com/Alamofire/Alamofire/36f1747e31305e0cfda27864091318950c66a5b1/Source/Core/Session.swift",
                    "https://raw.githubusercontent.com/Alamofire/Alamofire/36f1747e31305e0cfda27864091318950c66a5b1/Source/Core/Request.swift",
                    "https://raw.githubusercontent.com/Alamofire/Alamofire/36f1747e31305e0cfda27864091318950c66a5b1/Source/Core/Response.swift",
                ],
            },
            CodeRepo {
                key: "swift-collections",
                urls: &[
                    "https://raw.githubusercontent.com/apple/swift-collections/63bfbed01a39126550b0f1ac87ac48027697831a/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary.swift",
                ],
            },
            CodeRepo {
                key: "swift-stdlib-array",
                urls: &[
                    "https://raw.githubusercontent.com/apple/swift/a891406502855a598d830c806b4fc1887766f6cb/stdlib/public/core/Array.swift",
                    "https://raw.githubusercontent.com/apple/swift/a891406502855a598d830c806b4fc1887766f6cb/stdlib/public/core/String.swift",
                ],
            },
            CodeRepo {
                key: "swift-stdlib-collections",
                urls: &[
                    "https://raw.githubusercontent.com/apple/swift/a891406502855a598d830c806b4fc1887766f6cb/stdlib/public/core/Dictionary.swift",
                    "https://raw.githubusercontent.com/apple/swift/a891406502855a598d830c806b4fc1887766f6cb/stdlib/public/core/Set.swift",
                ],
            },
            CodeRepo {
                key: "swift-stdlib-types",
                urls: &[
                    "https://raw.githubusercontent.com/apple/swift/a891406502855a598d830c806b4fc1887766f6cb/stdlib/public/core/Result.swift",
                    "https://raw.githubusercontent.com/apple/swift/a891406502855a598d830c806b4fc1887766f6cb/stdlib/public/core/Optional.swift",
                    "https://raw.githubusercontent.com/apple/swift/a891406502855a598d830c806b4fc1887766f6cb/stdlib/public/core/Sequence.swift",
                ],
            },
            CodeRepo {
                key: "swift-nio-buffer",
                urls: &[
                    "https://raw.githubusercontent.com/apple/swift-nio/558f24a4647193b5a0e2104031b71c55d31ff83a/Sources/NIOCore/ByteBuffer-core.swift",
                    "https://raw.githubusercontent.com/apple/swift-nio/558f24a4647193b5a0e2104031b71c55d31ff83a/Sources/NIOPosix/SocketChannel.swift",
                ],
            },
            CodeRepo {
                key: "rxswift",
                urls: &[
                    "https://raw.githubusercontent.com/ReactiveX/RxSwift/132aea4f236ccadc51590b38af0357a331d51fa2/RxSwift/Observables/Merge.swift",
                ],
            },
            CodeRepo {
                key: "kingfisher",
                urls: &[
                    "https://raw.githubusercontent.com/onevcat/Kingfisher/79a6be40f52b228415af9b73126cdeeb5970bf1e/Sources/General/KingfisherManager.swift",
                ],
            },
            CodeRepo {
                key: "swiftformat",
                urls: &[
                    "https://raw.githubusercontent.com/nicklockwood/SwiftFormat/c8e50ff2cfc2eab46246c072a9ae25ab656c6ec3/Sources/SwiftFormat.swift",
                ],
            },
            CodeRepo {
                key: "tca",
                urls: &[
                    "https://raw.githubusercontent.com/pointfreeco/swift-composable-architecture/ce8ee57840b2b46cd6b5cf06ed0526dd1d690126/Sources/ComposableArchitecture/Store.swift",
                ],
            },
            CodeRepo {
                key: "snapkit",
                urls: &[
                    "https://raw.githubusercontent.com/SnapKit/SnapKit/19f59a63f0faac287f4e59986959859d81ec851c/Sources/ConstraintMaker.swift",
                ],
            },
        ],
        has_builtin: true,
        block_style: BlockStyle::Braces(&[
            "func ",
            "class ",
            "struct ",
            "enum ",
            "protocol ",
            "var ",
            "let ",
            "init(",
            "deinit ",
            "extension ",
            "typealias ",
        ]),
    },
    CodeLanguage {
        key: "bash",
        display_name: "Bash",
        extensions: &[".sh", ".bash"],
        repos: &[
            CodeRepo {
                key: "nvm",
                urls: &[
                    "https://raw.githubusercontent.com/nvm-sh/nvm/001ea8cac1eb61c8f0e29889ea05ab0af69546d8/nvm.sh",
                ],
            },
            CodeRepo {
                key: "oh-my-zsh",
                urls: &[
                    "https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/9e2c1548c3dfeefd055e1c6606f66657093ae928/lib/functions.zsh",
                ],
            },
            CodeRepo {
                key: "asdf",
                urls: &[
                    "https://raw.githubusercontent.com/asdf-vm/asdf/9d5f08b100fce9617a4e734a8a67eec63552c345/lib/functions/installs.bash",
                    "https://raw.githubusercontent.com/asdf-vm/asdf/9d5f08b100fce9617a4e734a8a67eec63552c345/lib/functions/versions.bash",
                ],
            },
            CodeRepo {
                key: "omz-diagnostics",
                urls: &[
                    "https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/9e2c1548c3dfeefd055e1c6606f66657093ae928/lib/diagnostics.zsh",
                ],
            },
            CodeRepo {
                key: "rbenv",
                urls: &[
                    "https://raw.githubusercontent.com/rbenv/rbenv/23c3041695feb811c18dbb270096c7956f7c377d/libexec/rbenv-init",
                ],
            },
            CodeRepo {
                key: "neofetch",
                urls: &[
                    "https://raw.githubusercontent.com/dylanaraps/neofetch/ccd5d9f52609bbdcd5d8fa78c4fdb0f12954125f/neofetch",
                ],
            },
            CodeRepo {
                key: "n",
                urls: &[
                    "https://raw.githubusercontent.com/tj/n/f52d2172f12cd76f0efe9524690723f52ab74f40/bin/n",
                ],
            },
            CodeRepo {
                key: "acme-sh",
                urls: &[
                    "https://raw.githubusercontent.com/acmesh-official/acme.sh/5d158b164028b240e0710a8d7a0ce4835a0ba1be/acme.sh",
                ],
            },
            CodeRepo {
                key: "dehydrated",
                urls: &[
                    "https://raw.githubusercontent.com/dehydrated-io/dehydrated/7ea8aaab5c257cb2c4b980f2f73597369a44d503/dehydrated",
                ],
            },
            CodeRepo {
                key: "git-completion",
                urls: &[
                    "https://raw.githubusercontent.com/git/git/270e10ad6dda3379ea0da7efd11e4fbf2cd7a325/contrib/completion/git-completion.bash",
                ],
            },
            CodeRepo {
                key: "fzf",
                urls: &[
                    "https://raw.githubusercontent.com/junegunn/fzf/cc16a97a40a16efecbed5bd7fb322010c033e503/shell/completion.bash",
                    "https://raw.githubusercontent.com/junegunn/fzf/cc16a97a40a16efecbed5bd7fb322010c033e503/shell/key-bindings.bash",
                ],
            },
            CodeRepo {
                key: "bash-my-aws",
                urls: &[
                    "https://raw.githubusercontent.com/bash-my-aws/bash-my-aws/775ff9362c62670dcb44d6976d176c305e03d279/lib/instance-functions",
                ],
            },
            CodeRepo {
                key: "p10k",
                urls: &[
                    "https://raw.githubusercontent.com/romkatv/powerlevel10k/604f19a9eaa18e76db2e60b8d446d5f879065f90/internal/p10k.zsh",
                ],
            },
            CodeRepo {
                key: "liquidprompt",
                urls: &[
                    "https://raw.githubusercontent.com/liquidprompt/liquidprompt/a4f6b8d8c90b3eaa33d13dfd1093062ab9c4b30c/liquidprompt",
                ],
            },
            CodeRepo {
                key: "omz-git",
                urls: &[
                    "https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/9e2c1548c3dfeefd055e1c6606f66657093ae928/lib/git.zsh",
                    "https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/9e2c1548c3dfeefd055e1c6606f66657093ae928/lib/cli.zsh",
                ],
            },
        ],
        has_builtin: true,
        block_style: BlockStyle::Braces(&["function ", "if ", "for ", "while ", "case "]),
    },
    CodeLanguage {
        key: "lua",
        display_name: "Lua",
        extensions: &[".lua"],
        repos: &[
            CodeRepo {
                key: "kong",
                urls: &[
                    "https://raw.githubusercontent.com/Kong/kong/58f2daa56b90615f78d5953229936192cd1128e9/kong/init.lua",
                ],
            },
            CodeRepo {
                key: "luarocks",
                urls: &[
                    "https://raw.githubusercontent.com/luarocks/luarocks/6b0a7f7f8770f5d21730a5f2fa8fcbc695687c43/src/luarocks/core/cfg.lua",
                ],
            },
            CodeRepo {
                key: "neovim",
                urls: &[
                    "https://raw.githubusercontent.com/neovim/neovim/da58fe8fd27510bb68db91b7d67264737e2279a2/runtime/lua/vim/lsp/client.lua",
                    "https://raw.githubusercontent.com/neovim/neovim/da58fe8fd27510bb68db91b7d67264737e2279a2/runtime/lua/vim/treesitter/query.lua",
                ],
            },
            CodeRepo {
                key: "openresty",
                urls: &[
                    "https://raw.githubusercontent.com/openresty/lua-resty-core/04c564acc22c90f9650fe42fec74879ae4b656a6/lib/resty/core/request.lua",
                ],
            },
            CodeRepo {
                key: "neovim-lsp-handlers",
                urls: &[
                    "https://raw.githubusercontent.com/neovim/neovim/da58fe8fd27510bb68db91b7d67264737e2279a2/runtime/lua/vim/lsp/handlers.lua",
                    "https://raw.githubusercontent.com/neovim/neovim/da58fe8fd27510bb68db91b7d67264737e2279a2/runtime/lua/vim/lsp/util.lua",
                ],
            },
            CodeRepo {
                key: "neovim-treesitter",
                urls: &[
                    "https://raw.githubusercontent.com/neovim/neovim/da58fe8fd27510bb68db91b7d67264737e2279a2/runtime/lua/vim/treesitter/languagetree.lua",
                ],
            },
            CodeRepo {
                key: "plenary",
                urls: &[
                    "https://raw.githubusercontent.com/nvim-lua/plenary.nvim/b9fd5226c2f76c951fc8ed5923d85e4de065e509/lua/plenary/path.lua",
                    "https://raw.githubusercontent.com/nvim-lua/plenary.nvim/b9fd5226c2f76c951fc8ed5923d85e4de065e509/lua/plenary/job.lua",
                ],
            },
            CodeRepo {
                key: "telescope",
                urls: &[
                    "https://raw.githubusercontent.com/nvim-telescope/telescope.nvim/e6cdb4dc528c5dc4ca8da86e83ef4e3c84b0729c/lua/telescope/pickers.lua",
                    "https://raw.githubusercontent.com/nvim-telescope/telescope.nvim/e6cdb4dc528c5dc4ca8da86e83ef4e3c84b0729c/lua/telescope/builtin/__files.lua",
                ],
            },
            CodeRepo {
                key: "awesome-wm",
                urls: &[
                    "https://raw.githubusercontent.com/awesomeWM/awesome/496008691facf3d962c487588741db3ec9654c52/lib/awful/layout/init.lua",
                    "https://raw.githubusercontent.com/awesomeWM/awesome/496008691facf3d962c487588741db3ec9654c52/lib/awful/widget/taglist.lua",
                ],
            },
            CodeRepo {
                key: "neovim-diagnostic",
                urls: &[
                    "https://raw.githubusercontent.com/neovim/neovim/da58fe8fd27510bb68db91b7d67264737e2279a2/runtime/lua/vim/diagnostic.lua",
                ],
            },
            CodeRepo {
                key: "neovim-lsp-buf",
                urls: &[
                    "https://raw.githubusercontent.com/neovim/neovim/da58fe8fd27510bb68db91b7d67264737e2279a2/runtime/lua/vim/lsp/buf.lua",
                ],
            },
            CodeRepo {
                key: "neovim-snippet",
                urls: &[
                    "https://raw.githubusercontent.com/neovim/neovim/da58fe8fd27510bb68db91b7d67264737e2279a2/runtime/lua/vim/snippet.lua",
                ],
            },
        ],
        has_builtin: true,
        block_style: BlockStyle::EndDelimited(&["function ", "local function "]),
    },
    // === Network-only languages (has_builtin: false) ===
    CodeLanguage {
        key: "kotlin",
        display_name: "Kotlin",
        extensions: &[".kt", ".kts"],
        repos: &[
            CodeRepo {
                key: "kotlinx-coroutines",
                urls: &[
                    "https://raw.githubusercontent.com/Kotlin/kotlinx.coroutines/b11abdf01d4d5db85247ab365abc72efc7b95062/kotlinx-coroutines-core/common/src/flow/Builders.kt",
                    "https://raw.githubusercontent.com/Kotlin/kotlinx.coroutines/b11abdf01d4d5db85247ab365abc72efc7b95062/kotlinx-coroutines-core/common/src/channels/Channel.kt",
                    "https://raw.githubusercontent.com/Kotlin/kotlinx.coroutines/b11abdf01d4d5db85247ab365abc72efc7b95062/kotlinx-coroutines-core/common/src/flow/SharedFlow.kt",
                ],
            },
            CodeRepo {
                key: "ktor",
                urls: &[
                    "https://raw.githubusercontent.com/ktorio/ktor/1567ffe13d1dd131fc2449579dabe6d1167726a8/ktor-server/ktor-server-core/common/src/io/ktor/server/routing/RoutingBuilder.kt",
                    "https://raw.githubusercontent.com/ktorio/ktor/1567ffe13d1dd131fc2449579dabe6d1167726a8/ktor-server/ktor-server-core/common/src/io/ktor/server/routing/RoutingNode.kt",
                    "https://raw.githubusercontent.com/ktorio/ktor/1567ffe13d1dd131fc2449579dabe6d1167726a8/ktor-client/ktor-client-core/common/src/io/ktor/client/HttpClient.kt",
                ],
            },
            CodeRepo {
                key: "okhttp",
                urls: &[
                    "https://raw.githubusercontent.com/square/okhttp/99791c205d84bb4cacc433da99d418e93e1fccce/okhttp/src/commonJvmAndroid/kotlin/okhttp3/OkHttpClient.kt",
                    "https://raw.githubusercontent.com/square/okhttp/99791c205d84bb4cacc433da99d418e93e1fccce/okhttp/src/commonJvmAndroid/kotlin/okhttp3/Request.kt",
                ],
            },
            CodeRepo {
                key: "kotlinx-serialization",
                urls: &[
                    "https://raw.githubusercontent.com/Kotlin/kotlinx.serialization/c49dc47fbc3c9f2d2cbf42cd2a3876a1337c88bf/core/commonMain/src/kotlinx/serialization/Serializers.kt",
                    "https://raw.githubusercontent.com/Kotlin/kotlinx.serialization/c49dc47fbc3c9f2d2cbf42cd2a3876a1337c88bf/core/commonMain/src/kotlinx/serialization/descriptors/SerialDescriptors.kt",
                ],
            },
            CodeRepo {
                key: "kotlinx-coroutines-extra",
                urls: &[
                    "https://raw.githubusercontent.com/Kotlin/kotlinx.coroutines/b11abdf01d4d5db85247ab365abc72efc7b95062/kotlinx-coroutines-core/common/src/flow/operators/Merge.kt",
                    "https://raw.githubusercontent.com/Kotlin/kotlinx.coroutines/b11abdf01d4d5db85247ab365abc72efc7b95062/kotlinx-coroutines-core/common/src/Delay.kt",
                    "https://raw.githubusercontent.com/Kotlin/kotlinx.coroutines/b11abdf01d4d5db85247ab365abc72efc7b95062/kotlinx-coroutines-core/common/src/CoroutineScope.kt",
                ],
            },
            CodeRepo {
                key: "kotlin-stdlib-collections",
                urls: &[
                    "https://raw.githubusercontent.com/JetBrains/kotlin/6ddfa0b9759c13a6ea97ef7f7e3efc0469730218/libraries/stdlib/src/kotlin/collections/Maps.kt",
                    "https://raw.githubusercontent.com/JetBrains/kotlin/6ddfa0b9759c13a6ea97ef7f7e3efc0469730218/libraries/stdlib/src/kotlin/collections/Collections.kt",
                ],
            },
            CodeRepo {
                key: "kotlin-stdlib-sequences",
                urls: &[
                    "https://raw.githubusercontent.com/JetBrains/kotlin/6ddfa0b9759c13a6ea97ef7f7e3efc0469730218/libraries/stdlib/src/kotlin/collections/Sequences.kt",
                    "https://raw.githubusercontent.com/JetBrains/kotlin/6ddfa0b9759c13a6ea97ef7f7e3efc0469730218/libraries/stdlib/src/kotlin/text/Strings.kt",
                ],
            },
            CodeRepo {
                key: "arrow-core",
                urls: &[
                    "https://raw.githubusercontent.com/arrow-kt/arrow/83618a806cd05b5ebf09b20ef9cfd1464e0671e8/arrow-libs/core/arrow-core/src/commonMain/kotlin/arrow/core/Either.kt",
                ],
            },
            CodeRepo {
                key: "koin",
                urls: &[
                    "https://raw.githubusercontent.com/InsertKoinIO/koin/767281ef63d1e742522a4bd4d73cf7276926d70f/projects/core/koin-core/src/commonMain/kotlin/org/koin/core/KoinApplication.kt",
                    "https://raw.githubusercontent.com/InsertKoinIO/koin/767281ef63d1e742522a4bd4d73cf7276926d70f/projects/core/koin-core/src/commonMain/kotlin/org/koin/core/Koin.kt",
                ],
            },
            CodeRepo {
                key: "sqldelight",
                urls: &[
                    "https://raw.githubusercontent.com/cashapp/sqldelight/585cd14faac58d9045d53bf0ee95f278a73f978b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/QueryGenerator.kt",
                ],
            },
            CodeRepo {
                key: "accompanist",
                urls: &[
                    "https://raw.githubusercontent.com/google/accompanist/12ec3408fc101e0006e38dc62f7acff7a822e20b/permissions/src/main/java/com/google/accompanist/permissions/PermissionsUtil.kt",
                ],
            },
            CodeRepo {
                key: "kotlin-stdlib-strings-jvm",
                urls: &[
                    "https://raw.githubusercontent.com/JetBrains/kotlin/6ddfa0b9759c13a6ea97ef7f7e3efc0469730218/libraries/stdlib/jvm/src/kotlin/text/StringsJVM.kt",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::Braces(&[
            "fun ",
            "class ",
            "object ",
            "interface ",
            "suspend fun ",
            "public ",
            "private ",
            "internal ",
            "override fun ",
            "open ",
            "data class ",
            "sealed ",
            "abstract ",
            "val ",
            "var ",
            "enum ",
            "annotation ",
            "typealias ",
        ]),
    },
    CodeLanguage {
        key: "scala",
        display_name: "Scala",
        extensions: &[".scala"],
        repos: &[
            CodeRepo {
                key: "scala-stdlib",
                urls: &[
                    "https://raw.githubusercontent.com/scala/scala/30a9dff1e0ccca2a79137dea5bf602a3354e9155/src/library/scala/collection/immutable/List.scala",
                    "https://raw.githubusercontent.com/scala/scala/30a9dff1e0ccca2a79137dea5bf602a3354e9155/src/library/scala/collection/mutable/HashMap.scala",
                    "https://raw.githubusercontent.com/scala/scala/30a9dff1e0ccca2a79137dea5bf602a3354e9155/src/library/scala/Option.scala",
                ],
            },
            CodeRepo {
                key: "akka",
                urls: &[
                    "https://raw.githubusercontent.com/akka/akka/1717068c7905dc7641194d86a7b84579896c0020/akka-actor/src/main/scala/akka/actor/Actor.scala",
                    "https://raw.githubusercontent.com/akka/akka/1717068c7905dc7641194d86a7b84579896c0020/akka-stream/src/main/scala/akka/stream/scaladsl/Flow.scala",
                ],
            },
            CodeRepo {
                key: "spark",
                urls: &[
                    "https://raw.githubusercontent.com/apache/spark/d90b6c5bbd7128a75c17443a000a0e3ec32e366b/sql/core/src/main/scala/org/apache/spark/sql/classic/Dataset.scala",
                    "https://raw.githubusercontent.com/apache/spark/d90b6c5bbd7128a75c17443a000a0e3ec32e366b/sql/core/src/main/scala/org/apache/spark/sql/classic/SparkSession.scala",
                ],
            },
            CodeRepo {
                key: "spark-rdd",
                urls: &[
                    "https://raw.githubusercontent.com/apache/spark/d90b6c5bbd7128a75c17443a000a0e3ec32e366b/core/src/main/scala/org/apache/spark/rdd/RDD.scala",
                ],
            },
            CodeRepo {
                key: "scala-stdlib-extra",
                urls: &[
                    "https://raw.githubusercontent.com/scala/scala/30a9dff1e0ccca2a79137dea5bf602a3354e9155/src/library/scala/collection/immutable/Map.scala",
                    "https://raw.githubusercontent.com/scala/scala/30a9dff1e0ccca2a79137dea5bf602a3354e9155/src/library/scala/collection/immutable/Vector.scala",
                ],
            },
            CodeRepo {
                key: "cats",
                urls: &[
                    "https://raw.githubusercontent.com/typelevel/cats/ef54b470abec39f901ffb36596adaca29fd84687/core/src/main/scala/cats/Monad.scala",
                    "https://raw.githubusercontent.com/typelevel/cats/ef54b470abec39f901ffb36596adaca29fd84687/core/src/main/scala/cats/Functor.scala",
                ],
            },
            CodeRepo {
                key: "cats-effect",
                urls: &[
                    "https://raw.githubusercontent.com/typelevel/cats-effect/10756cafd3ebbbd2f75c2ab2bc61fd4ab414bfb7/core/shared/src/main/scala/cats/effect/IO.scala",
                ],
            },
            CodeRepo {
                key: "play",
                urls: &[
                    "https://raw.githubusercontent.com/playframework/playframework/6c14473a4a581b24b12121dee4952cf9615065d0/core/play/src/main/scala/play/api/mvc/Results.scala",
                ],
            },
            CodeRepo {
                key: "http4s",
                urls: &[
                    "https://raw.githubusercontent.com/http4s/http4s/c63fbff43dfe7e3bec25b789fd0a0027ec40ed62/core/shared/src/main/scala/org/http4s/Uri.scala",
                    "https://raw.githubusercontent.com/http4s/http4s/c63fbff43dfe7e3bec25b789fd0a0027ec40ed62/core/shared/src/main/scala/org/http4s/Headers.scala",
                ],
            },
            CodeRepo {
                key: "zio",
                urls: &[
                    "https://raw.githubusercontent.com/zio/zio/9f65dd2154192fddf00a04b33989cd933b40ecf9/core/shared/src/main/scala/zio/ZIO.scala",
                ],
            },
            CodeRepo {
                key: "scala-iterator",
                urls: &[
                    "https://raw.githubusercontent.com/scala/scala/30a9dff1e0ccca2a79137dea5bf602a3354e9155/src/library/scala/collection/Iterator.scala",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::Braces(&[
            "def ",
            "class ",
            "object ",
            "trait ",
            "case class ",
            "val ",
            "var ",
            "type ",
            "implicit ",
            "given ",
            "extension ",
        ]),
    },
    CodeLanguage {
        key: "csharp",
        display_name: "C#",
        extensions: &[".cs"],
        repos: &[
            CodeRepo {
                key: "aspnetcore",
                urls: &[
                    "https://raw.githubusercontent.com/dotnet/aspnetcore/c1a3e7b0f3a45cf91064f4fa4ebf1801f5efd58f/src/Http/Http.Abstractions/src/HttpContext.cs",
                ],
            },
            CodeRepo {
                key: "roslyn",
                urls: &[
                    "https://raw.githubusercontent.com/dotnet/roslyn/68d99b22ba5d08644224a3160266d798ae3dd7b7/src/Compilers/CSharp/Portable/Syntax/SyntaxFactory.cs",
                ],
            },
            CodeRepo {
                key: "runtime",
                urls: &[
                    "https://raw.githubusercontent.com/dotnet/runtime/dd96f2c77c57efe67eba429b5e689fde6f5c0248/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializer.Read.String.cs",
                    "https://raw.githubusercontent.com/dotnet/runtime/dd96f2c77c57efe67eba429b5e689fde6f5c0248/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.cs",
                ],
            },
            CodeRepo {
                key: "newtonsoft-json",
                urls: &[
                    "https://raw.githubusercontent.com/JamesNK/Newtonsoft.Json/4f73e74372445108d2c1bda37b36e6f5e43402e0/Src/Newtonsoft.Json/JsonConvert.cs",
                ],
            },
            CodeRepo {
                key: "runtime-stringbuilder",
                urls: &[
                    "https://raw.githubusercontent.com/dotnet/runtime/dd96f2c77c57efe67eba429b5e689fde6f5c0248/src/libraries/System.Private.CoreLib/src/System/Text/StringBuilder.cs",
                ],
            },
            CodeRepo {
                key: "runtime-collections",
                urls: &[
                    "https://raw.githubusercontent.com/dotnet/runtime/dd96f2c77c57efe67eba429b5e689fde6f5c0248/src/libraries/System.Collections/src/System/Collections/Generic/SortedList.cs",
                    "https://raw.githubusercontent.com/dotnet/runtime/dd96f2c77c57efe67eba429b5e689fde6f5c0248/src/libraries/System.Private.CoreLib/src/System/Collections/Generic/Dictionary.cs",
                ],
            },
            CodeRepo {
                key: "runtime-string",
                urls: &[
                    "https://raw.githubusercontent.com/dotnet/runtime/dd96f2c77c57efe67eba429b5e689fde6f5c0248/src/libraries/System.Private.CoreLib/src/System/String.Manipulation.cs",
                ],
            },
            CodeRepo {
                key: "aspnetcore-mvc",
                urls: &[
                    "https://raw.githubusercontent.com/dotnet/aspnetcore/c1a3e7b0f3a45cf91064f4fa4ebf1801f5efd58f/src/Http/Http.Abstractions/src/HttpRequest.cs",
                    "https://raw.githubusercontent.com/dotnet/aspnetcore/c1a3e7b0f3a45cf91064f4fa4ebf1801f5efd58f/src/Http/Http.Abstractions/src/HttpResponse.cs",
                    "https://raw.githubusercontent.com/dotnet/aspnetcore/c1a3e7b0f3a45cf91064f4fa4ebf1801f5efd58f/src/Mvc/Mvc.Core/src/ControllerBase.cs",
                ],
            },
            CodeRepo {
                key: "polly",
                urls: &[
                    "https://raw.githubusercontent.com/App-vNext/Polly/7e9960c702379f40e628d099ab2bdd0995c5bd90/src/Polly.Core/Retry/RetryResilienceStrategy.cs",
                    "https://raw.githubusercontent.com/App-vNext/Polly/7e9960c702379f40e628d099ab2bdd0995c5bd90/src/Polly.Core/Registry/ResiliencePipelineRegistry.cs",
                ],
            },
            CodeRepo {
                key: "dapper",
                urls: &[
                    "https://raw.githubusercontent.com/DapperLib/Dapper/288730e69b05c32cac898d9b55ebea219ea8a2d1/Dapper/SqlMapper.cs",
                    "https://raw.githubusercontent.com/DapperLib/Dapper/288730e69b05c32cac898d9b55ebea219ea8a2d1/Dapper/SqlMapper.Async.cs",
                ],
            },
            CodeRepo {
                key: "serilog",
                urls: &[
                    "https://raw.githubusercontent.com/serilog/serilog/6c3fbcf636b0671bbd6f5032b61a2254937d8408/src/Serilog/LoggerConfiguration.cs",
                    "https://raw.githubusercontent.com/serilog/serilog/6c3fbcf636b0671bbd6f5032b61a2254937d8408/src/Serilog/Log.cs",
                ],
            },
            CodeRepo {
                key: "automapper",
                urls: &[
                    "https://raw.githubusercontent.com/AutoMapper/AutoMapper/1af71bfe831e337254a555a611de6c22b85d0426/src/AutoMapper/Execution/ExpressionBuilder.cs",
                    "https://raw.githubusercontent.com/AutoMapper/AutoMapper/1af71bfe831e337254a555a611de6c22b85d0426/src/AutoMapper/ProfileMap.cs",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::Braces(&[
            "public ",
            "private ",
            "protected ",
            "internal ",
            "static ",
            "class ",
            "interface ",
            "void ",
            "async ",
        ]),
    },
    CodeLanguage {
        key: "php",
        display_name: "PHP",
        extensions: &[".php"],
        repos: &[
            CodeRepo {
                key: "wordpress",
                urls: &[
                    "https://raw.githubusercontent.com/WordPress/WordPress/3a476a9f7dbfed77f2f007fd99e967b075a6602e/wp-includes/formatting.php",
                ],
            },
            CodeRepo {
                key: "symfony",
                urls: &[
                    "https://raw.githubusercontent.com/symfony/symfony/66f06e5e066c95109dd3251cf93d00adbbb82309/src/Symfony/Component/HttpFoundation/Request.php",
                ],
            },
            CodeRepo {
                key: "laravel",
                urls: &[
                    "https://raw.githubusercontent.com/laravel/framework/f4d44f467696a822e50521e0c4a45012aa84cf97/src/Illuminate/Database/Eloquent/Builder.php",
                    "https://raw.githubusercontent.com/laravel/framework/f4d44f467696a822e50521e0c4a45012aa84cf97/src/Illuminate/Collections/Collection.php",
                    "https://raw.githubusercontent.com/laravel/framework/f4d44f467696a822e50521e0c4a45012aa84cf97/src/Illuminate/Routing/Router.php",
                ],
            },
            CodeRepo {
                key: "composer",
                urls: &[
                    "https://raw.githubusercontent.com/composer/composer/b83fd2977ffad7ec46e4ef6108e1912698d647f7/src/Composer/DependencyResolver/Solver.php",
                ],
            },
            CodeRepo {
                key: "symfony-response",
                urls: &[
                    "https://raw.githubusercontent.com/symfony/symfony/66f06e5e066c95109dd3251cf93d00adbbb82309/src/Symfony/Component/HttpFoundation/Response.php",
                ],
            },
            CodeRepo {
                key: "wordpress-post",
                urls: &[
                    "https://raw.githubusercontent.com/WordPress/WordPress/3a476a9f7dbfed77f2f007fd99e967b075a6602e/wp-includes/post.php",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::Braces(&[
            "function ",
            "public function ",
            "private function ",
            "protected function ",
            "class ",
            "interface ",
            "trait ",
            "enum ",
        ]),
    },
    CodeLanguage {
        key: "dart",
        display_name: "Dart",
        extensions: &[".dart"],
        repos: &[
            CodeRepo {
                key: "flutter",
                urls: &[
                    "https://raw.githubusercontent.com/flutter/flutter/aaa24c388b43b5504b21747684923eaae4356dbc/packages/flutter/lib/src/widgets/framework.dart",
                ],
            },
            CodeRepo {
                key: "dart-sdk",
                urls: &[
                    "https://raw.githubusercontent.com/dart-lang/sdk/3177f01f5f492f3780d342dbce91cb21649cfeb8/sdk/lib/collection/list.dart",
                    "https://raw.githubusercontent.com/dart-lang/sdk/3177f01f5f492f3780d342dbce91cb21649cfeb8/sdk/lib/async/future.dart",
                ],
            },
            CodeRepo {
                key: "riverpod",
                urls: &[
                    "https://raw.githubusercontent.com/rrousselGit/riverpod/6b8a0aa1ab299a8266ee880d8390a2b578836c1b/packages/riverpod/lib/src/core/element.dart",
                    "https://raw.githubusercontent.com/rrousselGit/riverpod/6b8a0aa1ab299a8266ee880d8390a2b578836c1b/packages/riverpod/lib/src/core/provider_container.dart",
                    "https://raw.githubusercontent.com/rrousselGit/riverpod/6b8a0aa1ab299a8266ee880d8390a2b578836c1b/packages/riverpod/lib/src/core/ref.dart",
                ],
            },
            CodeRepo {
                key: "flutter-widgets",
                urls: &[
                    "https://raw.githubusercontent.com/flutter/flutter/aaa24c388b43b5504b21747684923eaae4356dbc/packages/flutter/lib/src/widgets/basic.dart",
                ],
            },
            CodeRepo {
                key: "flutter-material",
                urls: &[
                    "https://raw.githubusercontent.com/flutter/flutter/aaa24c388b43b5504b21747684923eaae4356dbc/packages/flutter/lib/src/material/app_bar.dart",
                    "https://raw.githubusercontent.com/flutter/flutter/aaa24c388b43b5504b21747684923eaae4356dbc/packages/flutter/lib/src/material/text_field.dart",
                ],
            },
            CodeRepo {
                key: "dart-sdk-core",
                urls: &[
                    "https://raw.githubusercontent.com/dart-lang/sdk/3177f01f5f492f3780d342dbce91cb21649cfeb8/sdk/lib/core/list.dart",
                    "https://raw.githubusercontent.com/dart-lang/sdk/3177f01f5f492f3780d342dbce91cb21649cfeb8/sdk/lib/core/string.dart",
                    "https://raw.githubusercontent.com/dart-lang/sdk/3177f01f5f492f3780d342dbce91cb21649cfeb8/sdk/lib/core/map.dart",
                ],
            },
            CodeRepo {
                key: "flame",
                urls: &[
                    "https://raw.githubusercontent.com/flame-engine/flame/86495694665cc4e85f7d3a94b05766cc6f6b95ba/packages/flame/lib/src/game/game.dart",
                ],
            },
            CodeRepo {
                key: "flutter-box",
                urls: &[
                    "https://raw.githubusercontent.com/flutter/flutter/aaa24c388b43b5504b21747684923eaae4356dbc/packages/flutter/lib/src/rendering/box.dart",
                ],
            },
            CodeRepo {
                key: "flutter-dropdown",
                urls: &[
                    "https://raw.githubusercontent.com/flutter/flutter/aaa24c388b43b5504b21747684923eaae4356dbc/packages/flutter/lib/src/material/dropdown.dart",
                ],
            },
            CodeRepo {
                key: "flutter-scroll-view",
                urls: &[
                    "https://raw.githubusercontent.com/flutter/flutter/aaa24c388b43b5504b21747684923eaae4356dbc/packages/flutter/lib/src/widgets/scroll_view.dart",
                ],
            },
            CodeRepo {
                key: "flutter-navigator",
                urls: &[
                    "https://raw.githubusercontent.com/flutter/flutter/aaa24c388b43b5504b21747684923eaae4356dbc/packages/flutter/lib/src/widgets/navigator.dart",
                ],
            },
            CodeRepo {
                key: "flutter-editable-text",
                urls: &[
                    "https://raw.githubusercontent.com/flutter/flutter/aaa24c388b43b5504b21747684923eaae4356dbc/packages/flutter/lib/src/widgets/editable_text.dart",
                ],
            },
            CodeRepo {
                key: "bloc",
                urls: &[
                    "https://raw.githubusercontent.com/felangel/bloc/82e12837156918ad15a082be357bd2bd2e12f742/packages/bloc/lib/src/bloc.dart",
                    "https://raw.githubusercontent.com/felangel/bloc/82e12837156918ad15a082be357bd2bd2e12f742/packages/bloc/lib/src/bloc_base.dart",
                ],
            },
            CodeRepo {
                key: "dio",
                urls: &[
                    "https://raw.githubusercontent.com/cfug/dio/85aa6f1216203b1ca707289e82e35bcff5070b54/dio/lib/src/dio_mixin.dart",
                    "https://raw.githubusercontent.com/cfug/dio/85aa6f1216203b1ca707289e82e35bcff5070b54/dio/lib/src/options.dart",
                ],
            },
            CodeRepo {
                key: "getx",
                urls: &[
                    "https://raw.githubusercontent.com/jonataslaw/getx/7bfcd9c3711c8880ee730579724dabe54f4e2598/lib/get_navigation/src/extension_navigation.dart",
                ],
            },
            CodeRepo {
                key: "drift",
                urls: &[
                    "https://raw.githubusercontent.com/simolus3/drift/cb0257aed4ce376d60a1dd405864f69733cf00fe/drift/lib/src/runtime/query_builder/migration.dart",
                    "https://raw.githubusercontent.com/simolus3/drift/cb0257aed4ce376d60a1dd405864f69733cf00fe/drift/lib/src/runtime/query_builder/query_builder.dart",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::Braces(&[
            "void ",
            "Future ",
            "Future<",
            "class ",
            "int ",
            "String ",
            "bool ",
            "static ",
            "factory ",
            "Widget ",
            "get ",
            "set ",
            "enum ",
            "typedef ",
            "extension ",
        ]),
    },
    CodeLanguage {
        key: "elixir",
        display_name: "Elixir",
        extensions: &[".ex", ".exs"],
        repos: &[
            CodeRepo {
                key: "phoenix",
                urls: &[
                    "https://raw.githubusercontent.com/phoenixframework/phoenix/2db25def4aa93c501eee0b0ea4f7bbc4954e4ed3/lib/phoenix/router.ex",
                ],
            },
            CodeRepo {
                key: "elixir-lang",
                urls: &[
                    "https://raw.githubusercontent.com/elixir-lang/elixir/2916f201899843d3632645a1074a76553639dcd1/lib/elixir/lib/enum.ex",
                ],
            },
            CodeRepo {
                key: "ecto",
                urls: &[
                    "https://raw.githubusercontent.com/elixir-ecto/ecto/d962b66b77e744598b866365ce3be94dfa803273/lib/ecto/query.ex",
                    "https://raw.githubusercontent.com/elixir-ecto/ecto/d962b66b77e744598b866365ce3be94dfa803273/lib/ecto/changeset.ex",
                ],
            },
            CodeRepo {
                key: "livebook",
                urls: &[
                    "https://raw.githubusercontent.com/livebook-dev/livebook/5ded53df10fb90b2ae960550a2af073923e64161/lib/livebook/session.ex",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::EndDelimited(&[
            "def ",
            "defp ",
            "defmodule ",
            "defmacro ",
            "defstruct",
            "defprotocol ",
            "defimpl ",
        ]),
    },
    CodeLanguage {
        key: "perl",
        display_name: "Perl",
        extensions: &[".pl", ".pm"],
        repos: &[
            CodeRepo {
                key: "mojolicious",
                urls: &[
                    "https://raw.githubusercontent.com/mojolicious/mojo/19fc4f19a0d83204a458ae4a19d192b7eaf4ba81/lib/Mojolicious.pm",
                ],
            },
            CodeRepo {
                key: "moose",
                urls: &[
                    "https://raw.githubusercontent.com/moose/Moose/b31896a655ef061e3459c03e5feb2382de009fc4/lib/Moose.pm",
                    "https://raw.githubusercontent.com/moose/Moose/b31896a655ef061e3459c03e5feb2382de009fc4/lib/Moose/Object.pm",
                ],
            },
            CodeRepo {
                key: "dancer2",
                urls: &[
                    "https://raw.githubusercontent.com/PerlDancer/Dancer2/25176c5b860493b4a6dcda5bc12ecbefa67df716/lib/Dancer2/Core/App.pm",
                ],
            },
            CodeRepo {
                key: "http-tiny",
                urls: &[
                    "https://raw.githubusercontent.com/Perl/perl5/998bf44359cb8ecec81cf136272558ce43409066/cpan/HTTP-Tiny/lib/HTTP/Tiny.pm",
                ],
            },
            CodeRepo {
                key: "lwp-useragent",
                urls: &[
                    "https://raw.githubusercontent.com/libwww-perl/libwww-perl/7420d1bfff7cd5369ca24e87c37edf97b2cbb0c1/lib/LWP/UserAgent.pm",
                    "https://raw.githubusercontent.com/libwww-perl/libwww-perl/7420d1bfff7cd5369ca24e87c37edf97b2cbb0c1/lib/LWP/Protocol/http.pm",
                ],
            },
            CodeRepo {
                key: "test-more",
                urls: &[
                    "https://raw.githubusercontent.com/Perl/perl5/998bf44359cb8ecec81cf136272558ce43409066/cpan/Test-Simple/lib/Test/More.pm",
                ],
            },
            CodeRepo {
                key: "mojo-dom",
                urls: &[
                    "https://raw.githubusercontent.com/mojolicious/mojo/19fc4f19a0d83204a458ae4a19d192b7eaf4ba81/lib/Mojo/DOM.pm",
                    "https://raw.githubusercontent.com/mojolicious/mojo/19fc4f19a0d83204a458ae4a19d192b7eaf4ba81/lib/Mojo/Util.pm",
                ],
            },
            CodeRepo {
                key: "plack",
                urls: &[
                    "https://raw.githubusercontent.com/plack/Plack/b3984f1c59de36903bb924c9da1273f3e11d4d2b/lib/Plack/Util.pm",
                ],
            },
            CodeRepo {
                key: "json-pp",
                urls: &[
                    "https://raw.githubusercontent.com/Perl/perl5/998bf44359cb8ecec81cf136272558ce43409066/cpan/JSON-PP/lib/JSON/PP.pm",
                ],
            },
            CodeRepo {
                key: "bioperl",
                urls: &[
                    "https://raw.githubusercontent.com/bioperl/bioperl-live/2b622d6a291b95126f3da6d3799a23d8ac7d1ef1/lib/Bio/SeqIO.pm",
                ],
            },
            CodeRepo {
                key: "perl-file-copy",
                urls: &[
                    "https://raw.githubusercontent.com/Perl/perl5/998bf44359cb8ecec81cf136272558ce43409066/lib/File/Copy.pm",
                ],
            },
            CodeRepo {
                key: "dbix-class",
                urls: &[
                    "https://raw.githubusercontent.com/Perl5/DBIx-Class/d8cf3aa31fb3d6ff7813f021fcc002663725fc41/lib/DBIx/Class/ResultSet.pm",
                    "https://raw.githubusercontent.com/Perl5/DBIx-Class/d8cf3aa31fb3d6ff7813f021fcc002663725fc41/lib/DBIx/Class/Schema.pm",
                ],
            },
            CodeRepo {
                key: "template-toolkit",
                urls: &[
                    "https://raw.githubusercontent.com/abw/Template2/b3dcb01a6df44e822fed28dc801ab04b442db77a/lib/Template/Context.pm",
                    "https://raw.githubusercontent.com/abw/Template2/b3dcb01a6df44e822fed28dc801ab04b442db77a/lib/Template/Provider.pm",
                ],
            },
            CodeRepo {
                key: "catalyst",
                urls: &[
                    "https://raw.githubusercontent.com/perl-catalyst/catalyst-runtime/1d40b8ea5a7f4a4ae99af921b914f04e7c9a21c3/lib/Catalyst.pm",
                    "https://raw.githubusercontent.com/perl-catalyst/catalyst-runtime/1d40b8ea5a7f4a4ae99af921b914f04e7c9a21c3/lib/Catalyst/Request.pm",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::Braces(&["sub "]),
    },
    CodeLanguage {
        key: "zig",
        display_name: "Zig",
        extensions: &[".zig"],
        repos: &[
            CodeRepo {
                key: "zig-stdlib",
                urls: &[
                    "https://raw.githubusercontent.com/ziglang/zig/738d2be9d6b6ef3ff3559130c05159ef53336224/lib/std/mem.zig",
                    "https://raw.githubusercontent.com/ziglang/zig/738d2be9d6b6ef3ff3559130c05159ef53336224/lib/std/fmt.zig",
                ],
            },
            CodeRepo {
                key: "mach",
                urls: &[
                    "https://raw.githubusercontent.com/hexops/mach/c1b78f519cf0be283472627f32d53bea2d74d206/src/Core.zig",
                    "https://raw.githubusercontent.com/hexops/mach/c1b78f519cf0be283472627f32d53bea2d74d206/src/graph.zig",
                    "https://raw.githubusercontent.com/hexops/mach/c1b78f519cf0be283472627f32d53bea2d74d206/src/gfx/Text.zig",
                ],
            },
            CodeRepo {
                key: "zig-stdlib-extra",
                urls: &[
                    "https://raw.githubusercontent.com/ziglang/zig/738d2be9d6b6ef3ff3559130c05159ef53336224/lib/std/hash_map.zig",
                    "https://raw.githubusercontent.com/ziglang/zig/738d2be9d6b6ef3ff3559130c05159ef53336224/lib/std/array_list.zig",
                    "https://raw.githubusercontent.com/ziglang/zig/738d2be9d6b6ef3ff3559130c05159ef53336224/lib/std/os.zig",
                ],
            },
            CodeRepo {
                key: "ghostty",
                urls: &[
                    "https://raw.githubusercontent.com/ghostty-org/ghostty/20cfaae2e5ec84cca2c5a55843b399b32fb9c810/src/terminal/Terminal.zig",
                    "https://raw.githubusercontent.com/ghostty-org/ghostty/20cfaae2e5ec84cca2c5a55843b399b32fb9c810/src/terminal/Screen.zig",
                ],
            },
            CodeRepo {
                key: "tigerbeetle",
                urls: &[
                    "https://raw.githubusercontent.com/tigerbeetle/tigerbeetle/49c92bf96496b1a3b71a689d3a9348df599004ad/src/vsr/replica.zig",
                    "https://raw.githubusercontent.com/tigerbeetle/tigerbeetle/49c92bf96496b1a3b71a689d3a9348df599004ad/src/lsm/tree.zig",
                ],
            },
            CodeRepo {
                key: "river",
                urls: &[
                    "https://raw.githubusercontent.com/riverwm/river/7df0854c59c9d980f8f9eb21ae1778d737d484de/river/Server.zig",
                    "https://raw.githubusercontent.com/riverwm/river/7df0854c59c9d980f8f9eb21ae1778d737d484de/river/Window.zig",
                ],
            },
            CodeRepo {
                key: "bun",
                urls: &[
                    "https://raw.githubusercontent.com/oven-sh/bun/5c59842f78880a8b5d9c2eb99c8928fc2ec50a2d/src/bun.js/event_loop.zig",
                    "https://raw.githubusercontent.com/oven-sh/bun/5c59842f78880a8b5d9c2eb99c8928fc2ec50a2d/src/bun.js/ConsoleObject.zig",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::Braces(&[
            "pub fn ",
            "fn ",
            "const ",
            "pub const ",
            "test ",
            "var ",
        ]),
    },
    CodeLanguage {
        key: "julia",
        display_name: "Julia",
        extensions: &[".jl"],
        repos: &[
            CodeRepo {
                key: "julia-stdlib",
                urls: &[
                    "https://raw.githubusercontent.com/JuliaLang/julia/e8208497f7f8b4c2ff1282233a65def720328579/base/array.jl",
                ],
            },
            CodeRepo {
                key: "flux",
                urls: &[
                    "https://raw.githubusercontent.com/FluxML/Flux.jl/cec0db7b7db64b066a472f21e002f9ad7a2460c6/src/layers/basic.jl",
                    "https://raw.githubusercontent.com/FluxML/Flux.jl/cec0db7b7db64b066a472f21e002f9ad7a2460c6/src/layers/conv.jl",
                ],
            },
            CodeRepo {
                key: "dataframes",
                urls: &[
                    "https://raw.githubusercontent.com/JuliaData/DataFrames.jl/feaaf37648bfa3a6a02263f059ff3b3db356a97d/src/dataframe/dataframe.jl",
                ],
            },
            CodeRepo {
                key: "julia-strings",
                urls: &[
                    "https://raw.githubusercontent.com/JuliaLang/julia/e8208497f7f8b4c2ff1282233a65def720328579/base/strings/basic.jl",
                ],
            },
            CodeRepo {
                key: "julia-dict",
                urls: &[
                    "https://raw.githubusercontent.com/JuliaLang/julia/e8208497f7f8b4c2ff1282233a65def720328579/base/dict.jl",
                ],
            },
            CodeRepo {
                key: "julia-math",
                urls: &[
                    "https://raw.githubusercontent.com/JuliaLang/julia/e8208497f7f8b4c2ff1282233a65def720328579/base/math.jl",
                    "https://raw.githubusercontent.com/JuliaLang/julia/e8208497f7f8b4c2ff1282233a65def720328579/base/sort.jl",
                ],
            },
            CodeRepo {
                key: "julia-iterators",
                urls: &[
                    "https://raw.githubusercontent.com/JuliaLang/julia/e8208497f7f8b4c2ff1282233a65def720328579/base/iterators.jl",
                ],
            },
            CodeRepo {
                key: "distributions",
                urls: &[
                    "https://raw.githubusercontent.com/JuliaStats/Distributions.jl/196d79be2f21744a88c01295f2772f091244d557/src/univariates.jl",
                    "https://raw.githubusercontent.com/JuliaStats/Distributions.jl/196d79be2f21744a88c01295f2772f091244d557/src/univariate/continuous/normal.jl",
                ],
            },
            CodeRepo {
                key: "dataframes-abstract",
                urls: &[
                    "https://raw.githubusercontent.com/JuliaData/DataFrames.jl/feaaf37648bfa3a6a02263f059ff3b3db356a97d/src/abstractdataframe/abstractdataframe.jl",
                ],
            },
            CodeRepo {
                key: "julia-reduce",
                urls: &[
                    "https://raw.githubusercontent.com/JuliaLang/julia/e8208497f7f8b4c2ff1282233a65def720328579/base/reduce.jl",
                ],
            },
            CodeRepo {
                key: "jump",
                urls: &[
                    "https://raw.githubusercontent.com/jump-dev/JuMP.jl/afab75cb4868b69fed16c7b0cd0ef779c17330b7/src/variables.jl",
                    "https://raw.githubusercontent.com/jump-dev/JuMP.jl/afab75cb4868b69fed16c7b0cd0ef779c17330b7/src/constraints.jl",
                ],
            },
            CodeRepo {
                key: "makie",
                urls: &[
                    "https://raw.githubusercontent.com/MakieOrg/Makie.jl/b7e263ad464f8eae7fbe02c0d508a01851c689ee/Makie/src/basic_plots.jl",
                    "https://raw.githubusercontent.com/MakieOrg/Makie.jl/b7e263ad464f8eae7fbe02c0d508a01851c689ee/Makie/src/scenes.jl",
                ],
            },
            CodeRepo {
                key: "plots",
                urls: &[
                    "https://raw.githubusercontent.com/JuliaPlots/Plots.jl/6df02e64ff646f1824528ac9f3482d186fcb3179/PlotsBase/src/recipes.jl",
                    "https://raw.githubusercontent.com/JuliaPlots/Plots.jl/6df02e64ff646f1824528ac9f3482d186fcb3179/PlotsBase/src/Commons/attrs.jl",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::EndDelimited(&["function ", "macro "]),
    },
    CodeLanguage {
        key: "nim",
        display_name: "Nim",
        extensions: &[".nim"],
        repos: &[
            CodeRepo {
                key: "nim-stdlib",
                urls: &[
                    "https://raw.githubusercontent.com/nim-lang/Nim/7a82c5920c46fa7a3393ebdecc54716cb1015366/lib/pure/strutils.nim",
                ],
            },
            CodeRepo {
                key: "nim-json",
                urls: &[
                    "https://raw.githubusercontent.com/nim-lang/Nim/7a82c5920c46fa7a3393ebdecc54716cb1015366/lib/pure/json.nim",
                ],
            },
            CodeRepo {
                key: "nim-os",
                urls: &[
                    "https://raw.githubusercontent.com/nim-lang/Nim/7a82c5920c46fa7a3393ebdecc54716cb1015366/lib/pure/os.nim",
                ],
            },
            CodeRepo {
                key: "nim-tables",
                urls: &[
                    "https://raw.githubusercontent.com/nim-lang/Nim/7a82c5920c46fa7a3393ebdecc54716cb1015366/lib/pure/collections/tables.nim",
                ],
            },
            CodeRepo {
                key: "nim-sequtils",
                urls: &[
                    "https://raw.githubusercontent.com/nim-lang/Nim/7a82c5920c46fa7a3393ebdecc54716cb1015366/lib/pure/collections/sequtils.nim",
                ],
            },
            CodeRepo {
                key: "nim-asyncdispatch",
                urls: &[
                    "https://raw.githubusercontent.com/nim-lang/Nim/7a82c5920c46fa7a3393ebdecc54716cb1015366/lib/pure/asyncdispatch.nim",
                ],
            },
            CodeRepo {
                key: "nim-httpclient",
                urls: &[
                    "https://raw.githubusercontent.com/nim-lang/Nim/7a82c5920c46fa7a3393ebdecc54716cb1015366/lib/pure/httpclient.nim",
                ],
            },
            CodeRepo {
                key: "nim-parseutils",
                urls: &[
                    "https://raw.githubusercontent.com/nim-lang/Nim/7a82c5920c46fa7a3393ebdecc54716cb1015366/lib/pure/parseutils.nim",
                    "https://raw.githubusercontent.com/nim-lang/Nim/7a82c5920c46fa7a3393ebdecc54716cb1015366/lib/pure/uri.nim",
                ],
            },
            CodeRepo {
                key: "nim-sugar",
                urls: &[
                    "https://raw.githubusercontent.com/nim-lang/Nim/7a82c5920c46fa7a3393ebdecc54716cb1015366/lib/pure/sugar.nim",
                    "https://raw.githubusercontent.com/nim-lang/Nim/7a82c5920c46fa7a3393ebdecc54716cb1015366/lib/pure/logging.nim",
                ],
            },
            CodeRepo {
                key: "jester",
                urls: &[
                    "https://raw.githubusercontent.com/dom96/jester/ac9b8541dce64feff9b53b700cab8496c1816651/jester.nim",
                    "https://raw.githubusercontent.com/dom96/jester/ac9b8541dce64feff9b53b700cab8496c1816651/jester/request.nim",
                ],
            },
            CodeRepo {
                key: "prologue",
                urls: &[
                    "https://raw.githubusercontent.com/planety/prologue/555fbf61500118d390216bae3970d30fad2406b0/src/prologue/core/context.nim",
                    "https://raw.githubusercontent.com/planety/prologue/555fbf61500118d390216bae3970d30fad2406b0/src/prologue/core/route.nim",
                ],
            },
            CodeRepo {
                key: "chronos",
                urls: &[
                    "https://raw.githubusercontent.com/status-im/nim-chronos/6d89155294479871de019e35a4787a9f0bfd7f3a/chronos/asyncsync.nim",
                    "https://raw.githubusercontent.com/status-im/nim-chronos/6d89155294479871de019e35a4787a9f0bfd7f3a/chronos/transport.nim",
                ],
            },
            CodeRepo {
                key: "karax",
                urls: &[
                    "https://raw.githubusercontent.com/karaxnim/karax/7e1471aea2ea1001134ae6862743902c1d1e1814/karax/karax.nim",
                    "https://raw.githubusercontent.com/karaxnim/karax/7e1471aea2ea1001134ae6862743902c1d1e1814/karax/vdom.nim",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::Indentation(&["proc ", "func ", "method ", "type "]),
    },
    CodeLanguage {
        key: "ocaml",
        display_name: "OCaml",
        extensions: &[".ml", ".mli"],
        repos: &[
            CodeRepo {
                key: "ocaml-stdlib",
                urls: &[
                    "https://raw.githubusercontent.com/ocaml/ocaml/d7ee697596b9688569c4db06fc32d3f9fffdeeef/stdlib/list.ml",
                ],
            },
            CodeRepo {
                key: "ocaml-map",
                urls: &[
                    "https://raw.githubusercontent.com/ocaml/ocaml/d7ee697596b9688569c4db06fc32d3f9fffdeeef/stdlib/map.ml",
                    "https://raw.githubusercontent.com/ocaml/ocaml/d7ee697596b9688569c4db06fc32d3f9fffdeeef/stdlib/hashtbl.ml",
                ],
            },
            CodeRepo {
                key: "dune",
                urls: &[
                    "https://raw.githubusercontent.com/ocaml/dune/c30a6e555e3f79d6196b59ca82eaba9ee08e1e6f/src/dune_rules/simple_rules.ml",
                ],
            },
            CodeRepo {
                key: "ocaml-string",
                urls: &[
                    "https://raw.githubusercontent.com/ocaml/ocaml/d7ee697596b9688569c4db06fc32d3f9fffdeeef/stdlib/string.ml",
                ],
            },
            CodeRepo {
                key: "ocaml-array",
                urls: &[
                    "https://raw.githubusercontent.com/ocaml/ocaml/d7ee697596b9688569c4db06fc32d3f9fffdeeef/stdlib/array.ml",
                ],
            },
            CodeRepo {
                key: "ocaml-seq",
                urls: &[
                    "https://raw.githubusercontent.com/ocaml/ocaml/d7ee697596b9688569c4db06fc32d3f9fffdeeef/stdlib/seq.ml",
                ],
            },
            CodeRepo {
                key: "ocaml-buffer",
                urls: &[
                    "https://raw.githubusercontent.com/ocaml/ocaml/d7ee697596b9688569c4db06fc32d3f9fffdeeef/stdlib/buffer.ml",
                ],
            },
            CodeRepo {
                key: "ocaml-set",
                urls: &[
                    "https://raw.githubusercontent.com/ocaml/ocaml/d7ee697596b9688569c4db06fc32d3f9fffdeeef/stdlib/set.ml",
                ],
            },
            CodeRepo {
                key: "ocaml-format",
                urls: &[
                    "https://raw.githubusercontent.com/ocaml/ocaml/d7ee697596b9688569c4db06fc32d3f9fffdeeef/stdlib/format.ml",
                ],
            },
            CodeRepo {
                key: "ocaml-scanf",
                urls: &[
                    "https://raw.githubusercontent.com/ocaml/ocaml/d7ee697596b9688569c4db06fc32d3f9fffdeeef/stdlib/scanf.ml",
                ],
            },
            CodeRepo {
                key: "cohttp",
                urls: &[
                    "https://raw.githubusercontent.com/mirage/ocaml-cohttp/d2e6993f482b7ec95778d786eef2f2c119a8a6eb/cohttp/src/s.ml",
                ],
            },
            CodeRepo {
                key: "ocaml-filename",
                urls: &[
                    "https://raw.githubusercontent.com/ocaml/ocaml/d7ee697596b9688569c4db06fc32d3f9fffdeeef/stdlib/filename.ml",
                ],
            },
            CodeRepo {
                key: "lwt",
                urls: &[
                    "https://raw.githubusercontent.com/ocsigen/lwt/b935bf78c6b73c04fb304447374972a2604a9120/src/core/lwt.ml",
                    "https://raw.githubusercontent.com/ocsigen/lwt/b935bf78c6b73c04fb304447374972a2604a9120/src/core/lwt_stream.ml",
                ],
            },
            CodeRepo {
                key: "dream",
                urls: &[
                    "https://raw.githubusercontent.com/aantron/dream/1fbb7fd440cff3cf6514d7f9aa0da73d21466611/src/server/router.ml",
                    "https://raw.githubusercontent.com/aantron/dream/1fbb7fd440cff3cf6514d7f9aa0da73d21466611/src/http/http.ml",
                ],
            },
            CodeRepo {
                key: "janestreet-core",
                urls: &[
                    "https://raw.githubusercontent.com/janestreet/core/3998718a19af8b148bc1864c24ca37198e6d3820/core/src/time_ns.ml",
                    "https://raw.githubusercontent.com/janestreet/core/3998718a19af8b148bc1864c24ca37198e6d3820/core/src/map.ml",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::Indentation(&["let ", "type ", "module "]),
    },
    CodeLanguage {
        key: "haskell",
        display_name: "Haskell",
        extensions: &[".hs"],
        repos: &[
            CodeRepo {
                key: "aeson",
                urls: &[
                    "https://raw.githubusercontent.com/haskell/aeson/45d31f1bd9a0edbd6ba55fbcdd5082b159d33106/src/Data/Aeson/Types/Internal.hs",
                ],
            },
            CodeRepo {
                key: "xmonad",
                urls: &[
                    "https://raw.githubusercontent.com/xmonad/xmonad/f87bfb23ce809611a44ff9ea4373830956a6e180/src/XMonad/Operations.hs",
                ],
            },
            CodeRepo {
                key: "pandoc",
                urls: &[
                    "https://raw.githubusercontent.com/jgm/pandoc/7777de6adb166d92b4c9ee4b24054637ab8477b7/src/Text/Pandoc/Readers/Markdown.hs",
                ],
            },
            CodeRepo {
                key: "servant",
                urls: &[
                    "https://raw.githubusercontent.com/haskell-servant/servant/0767cd8b37358d051b8405c28bb1f7ff7de5e313/servant/src/Servant/API.hs",
                ],
            },
            CodeRepo {
                key: "aeson-tojson",
                urls: &[
                    "https://raw.githubusercontent.com/haskell/aeson/45d31f1bd9a0edbd6ba55fbcdd5082b159d33106/src/Data/Aeson/Types/ToJSON.hs",
                    "https://raw.githubusercontent.com/haskell/aeson/45d31f1bd9a0edbd6ba55fbcdd5082b159d33106/src/Data/Aeson/Types/FromJSON.hs",
                ],
            },
            CodeRepo {
                key: "servant-server",
                urls: &[
                    "https://raw.githubusercontent.com/haskell-servant/servant/0767cd8b37358d051b8405c28bb1f7ff7de5e313/servant-server/src/Servant/Server/Internal.hs",
                ],
            },
            CodeRepo {
                key: "pandoc-writers",
                urls: &[
                    "https://raw.githubusercontent.com/jgm/pandoc/7777de6adb166d92b4c9ee4b24054637ab8477b7/src/Text/Pandoc/Writers/HTML.hs",
                    "https://raw.githubusercontent.com/jgm/pandoc/7777de6adb166d92b4c9ee4b24054637ab8477b7/src/Text/Pandoc/Options.hs",
                ],
            },
            CodeRepo {
                key: "yesod",
                urls: &[
                    "https://raw.githubusercontent.com/yesodweb/yesod/1b033c741ce81d01070de993b285a17e71178156/yesod-core/src/Yesod/Core/Handler.hs",
                ],
            },
        ],
        has_builtin: false,
        // Haskell: top-level declarations are indented blocks
        block_style: BlockStyle::Indentation(&[
            "data ",
            "type ",
            "class ",
            "instance ",
            "newtype ",
            "module ",
        ]),
    },
    CodeLanguage {
        key: "clojure",
        display_name: "Clojure",
        extensions: &[".clj", ".cljs"],
        repos: &[
            CodeRepo {
                key: "clojure-core",
                urls: &[
                    "https://raw.githubusercontent.com/clojure/clojure/a3fa897590f70207eea3573759739810f2b6ab6c/src/clj/clojure/core.clj",
                ],
            },
            CodeRepo {
                key: "ring",
                urls: &[
                    "https://raw.githubusercontent.com/ring-clojure/ring/0a36f21646232cdcaed92e55da8f31ba7f44e856/ring-core/src/ring/middleware/params.clj",
                    "https://raw.githubusercontent.com/ring-clojure/ring/0a36f21646232cdcaed92e55da8f31ba7f44e856/ring-core/src/ring/util/response.clj",
                ],
            },
            CodeRepo {
                key: "clojure-set",
                urls: &[
                    "https://raw.githubusercontent.com/clojure/clojure/a3fa897590f70207eea3573759739810f2b6ab6c/src/clj/clojure/set.clj",
                    "https://raw.githubusercontent.com/clojure/clojure/a3fa897590f70207eea3573759739810f2b6ab6c/src/clj/clojure/string.clj",
                ],
            },
            CodeRepo {
                key: "clojure-io",
                urls: &[
                    "https://raw.githubusercontent.com/clojure/clojure/a3fa897590f70207eea3573759739810f2b6ab6c/src/clj/clojure/java/io.clj",
                ],
            },
            CodeRepo {
                key: "clojure-walk",
                urls: &[
                    "https://raw.githubusercontent.com/clojure/clojure/a3fa897590f70207eea3573759739810f2b6ab6c/src/clj/clojure/walk.clj",
                    "https://raw.githubusercontent.com/clojure/clojure/a3fa897590f70207eea3573759739810f2b6ab6c/src/clj/clojure/pprint/dispatch.clj",
                ],
            },
            CodeRepo {
                key: "data-json",
                urls: &[
                    "https://raw.githubusercontent.com/clojure/data.json/94463ffb54482427fd9b31f264b06bff6dcfd557/src/main/clojure/clojure/data/json.clj",
                ],
            },
            CodeRepo {
                key: "compojure",
                urls: &[
                    "https://raw.githubusercontent.com/weavejester/compojure/8a4758d28e8fcd28fa7610dca6e2908d039e6a4f/src/compojure/core.clj",
                ],
            },
            CodeRepo {
                key: "core-async",
                urls: &[
                    "https://raw.githubusercontent.com/clojure/core.async/6a0f4cfa2cdf27638a8a918181aeab0f7e06f3be/src/main/clojure/clojure/core/async.clj",
                ],
            },
            CodeRepo {
                key: "clojure-zip",
                urls: &[
                    "https://raw.githubusercontent.com/clojure/clojure/a3fa897590f70207eea3573759739810f2b6ab6c/src/clj/clojure/zip.clj",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::Indentation(&["(defn ", "(defn- ", "(defmacro "]),
    },
    CodeLanguage {
        key: "r",
        display_name: "R",
        extensions: &[".r", ".R"],
        repos: &[
            CodeRepo {
                key: "shiny",
                urls: &[
                    "https://raw.githubusercontent.com/rstudio/shiny/75a63716e578976965daeadde81af7166a50faac/R/bootstrap.R",
                    "https://raw.githubusercontent.com/rstudio/shiny/75a63716e578976965daeadde81af7166a50faac/R/input-text.R",
                ],
            },
            CodeRepo {
                key: "ggplot2",
                urls: &[
                    "https://raw.githubusercontent.com/tidyverse/ggplot2/c02c05aa6303e9592e37289d780224a06be5a27e/R/plot.R",
                    "https://raw.githubusercontent.com/tidyverse/ggplot2/c02c05aa6303e9592e37289d780224a06be5a27e/R/geom-point.R",
                ],
            },
            CodeRepo {
                key: "dplyr",
                urls: &[
                    "https://raw.githubusercontent.com/tidyverse/dplyr/f7c3788be32a90c83e705849c83bb111cd9d4a13/R/mutate.R",
                    "https://raw.githubusercontent.com/tidyverse/dplyr/f7c3788be32a90c83e705849c83bb111cd9d4a13/R/filter.R",
                ],
            },
            CodeRepo {
                key: "dplyr-extra",
                urls: &[
                    "https://raw.githubusercontent.com/tidyverse/dplyr/f7c3788be32a90c83e705849c83bb111cd9d4a13/R/select.R",
                    "https://raw.githubusercontent.com/tidyverse/dplyr/f7c3788be32a90c83e705849c83bb111cd9d4a13/R/join.R",
                ],
            },
            CodeRepo {
                key: "ggplot2-extra",
                urls: &[
                    "https://raw.githubusercontent.com/tidyverse/ggplot2/c02c05aa6303e9592e37289d780224a06be5a27e/R/aes.R",
                    "https://raw.githubusercontent.com/tidyverse/ggplot2/c02c05aa6303e9592e37289d780224a06be5a27e/R/scale-colour.R",
                    "https://raw.githubusercontent.com/tidyverse/ggplot2/c02c05aa6303e9592e37289d780224a06be5a27e/R/theme.R",
                ],
            },
            CodeRepo {
                key: "tidyr",
                urls: &[
                    "https://raw.githubusercontent.com/tidyverse/tidyr/cdaeeb352c73dce9ebf3a5d785a2ed5fd6c5fdbc/R/pivot-long.R",
                ],
            },
            CodeRepo {
                key: "purrr",
                urls: &[
                    "https://raw.githubusercontent.com/tidyverse/purrr/90e74842bcd76d310e578351b27501408c5ed1f9/R/map.R",
                ],
            },
            CodeRepo {
                key: "stringr",
                urls: &[
                    "https://raw.githubusercontent.com/tidyverse/stringr/ae054b1d28f630fee22ddb3cb7525396e62af4fe/R/modifiers.R",
                ],
            },
            CodeRepo {
                key: "shiny-reactives",
                urls: &[
                    "https://raw.githubusercontent.com/rstudio/shiny/75a63716e578976965daeadde81af7166a50faac/R/reactives.R",
                    "https://raw.githubusercontent.com/rstudio/shiny/75a63716e578976965daeadde81af7166a50faac/R/update-input.R",
                ],
            },
            CodeRepo {
                key: "shiny-inputs",
                urls: &[
                    "https://raw.githubusercontent.com/rstudio/shiny/75a63716e578976965daeadde81af7166a50faac/R/input-select.R",
                    "https://raw.githubusercontent.com/rstudio/shiny/75a63716e578976965daeadde81af7166a50faac/R/input-slider.R",
                ],
            },
            CodeRepo {
                key: "readr",
                urls: &[
                    "https://raw.githubusercontent.com/tidyverse/readr/9620048a5b79b27467285c089efdf019bcc1056e/R/read_delim.R",
                ],
            },
            CodeRepo {
                key: "tibble",
                urls: &[
                    "https://raw.githubusercontent.com/tidyverse/tibble/8b004f20bda23ba4d1254222ff5adcd5da173d64/R/tibble.R",
                ],
            },
            CodeRepo {
                key: "dplyr-groupby",
                urls: &[
                    "https://raw.githubusercontent.com/tidyverse/dplyr/f7c3788be32a90c83e705849c83bb111cd9d4a13/R/group-by.R",
                    "https://raw.githubusercontent.com/tidyverse/dplyr/f7c3788be32a90c83e705849c83bb111cd9d4a13/R/summarise.R",
                ],
            },
            CodeRepo {
                key: "devtools",
                urls: &[
                    "https://raw.githubusercontent.com/r-lib/devtools/07292edc8d475aa43a89f4f21053d36becb68093/R/install.R",
                ],
            },
            CodeRepo {
                key: "testthat",
                urls: &[
                    "https://raw.githubusercontent.com/r-lib/testthat/4b13712bb08bbcf19e3b5265e95218043c3d528e/R/expect-equality.R",
                    "https://raw.githubusercontent.com/r-lib/testthat/4b13712bb08bbcf19e3b5265e95218043c3d528e/R/expect-comparison.R",
                ],
            },
            CodeRepo {
                key: "rlang-env",
                urls: &[
                    "https://raw.githubusercontent.com/r-lib/rlang/0337a22ba3fdacf476c38f0cd8a85ec5b1e9e250/R/env.R",
                ],
            },
            CodeRepo {
                key: "rlang-arg",
                urls: &[
                    "https://raw.githubusercontent.com/r-lib/rlang/0337a22ba3fdacf476c38f0cd8a85ec5b1e9e250/R/arg.R",
                ],
            },
            CodeRepo {
                key: "data-table",
                urls: &[
                    "https://raw.githubusercontent.com/Rdatatable/data.table/8198bf0cd9ee40ea8b5d1b3c9baeff4919b7794d/R/data.table.R",
                    "https://raw.githubusercontent.com/Rdatatable/data.table/8198bf0cd9ee40ea8b5d1b3c9baeff4919b7794d/R/fread.R",
                ],
            },
            CodeRepo {
                key: "mlr3",
                urls: &[
                    "https://raw.githubusercontent.com/mlr-org/mlr3/0defc99bcc7c5338d0affc26cd8689e637da7383/R/Learner.R",
                    "https://raw.githubusercontent.com/mlr-org/mlr3/0defc99bcc7c5338d0affc26cd8689e637da7383/R/Task.R",
                ],
            },
            CodeRepo {
                key: "caret",
                urls: &[
                    "https://raw.githubusercontent.com/topepo/caret/c98cc1a3ba5f0b087d51f5c4362a3b751515e243/pkg/caret/R/train.default.R",
                    "https://raw.githubusercontent.com/topepo/caret/c98cc1a3ba5f0b087d51f5c4362a3b751515e243/pkg/caret/R/preProcess.R",
                ],
            },
        ],
        has_builtin: false,
        // R functions are defined as `name <- function(...)`. Since our extractor only
        // supports `starts_with`, we match roxygen doc blocks that precede functions.
        block_style: BlockStyle::Braces(&["#' "]),
    },
    CodeLanguage {
        key: "erlang",
        display_name: "Erlang",
        extensions: &[".erl"],
        repos: &[
            CodeRepo {
                key: "cowboy",
                urls: &[
                    "https://raw.githubusercontent.com/ninenines/cowboy/9f580ea964c4ea585aeeeb9f29613bf027d44269/src/cowboy_req.erl",
                    "https://raw.githubusercontent.com/ninenines/cowboy/9f580ea964c4ea585aeeeb9f29613bf027d44269/src/cowboy_http.erl",
                ],
            },
            CodeRepo {
                key: "rabbitmq",
                urls: &[
                    "https://raw.githubusercontent.com/rabbitmq/rabbitmq-server/ac254196aa0883a7254ef617768fcbcea86220a0/deps/rabbit/src/rabbit_channel.erl",
                ],
            },
            CodeRepo {
                key: "otp",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/stdlib/src/lists.erl",
                ],
            },
            CodeRepo {
                key: "otp-gen-server",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/stdlib/src/gen_server.erl",
                ],
            },
            CodeRepo {
                key: "otp-gen-statem",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/stdlib/src/gen_statem.erl",
                ],
            },
            CodeRepo {
                key: "otp-ets",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/stdlib/src/ets.erl",
                ],
            },
            CodeRepo {
                key: "otp-timer",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/stdlib/src/timer.erl",
                ],
            },
            CodeRepo {
                key: "otp-erl-scan",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/stdlib/src/erl_scan.erl",
                ],
            },
            CodeRepo {
                key: "otp-erl-lint",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/stdlib/src/erl_lint.erl",
                ],
            },
            CodeRepo {
                key: "otp-io",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/stdlib/src/io.erl",
                ],
            },
            CodeRepo {
                key: "otp-beam-lib",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/stdlib/src/beam_lib.erl",
                ],
            },
            CodeRepo {
                key: "otp-dict",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/stdlib/src/dict.erl",
                ],
            },
            CodeRepo {
                key: "otp-gen-event",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/stdlib/src/gen_event.erl",
                ],
            },
            CodeRepo {
                key: "otp-supervisor",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/stdlib/src/supervisor.erl",
                ],
            },
            CodeRepo {
                key: "otp-logger",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/kernel/src/logger.erl",
                ],
            },
            CodeRepo {
                key: "otp-file",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/kernel/src/file.erl",
                ],
            },
            CodeRepo {
                key: "otp-code",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/kernel/src/code.erl",
                ],
            },
            CodeRepo {
                key: "otp-ssl",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/ssl/src/ssl.erl",
                ],
            },
            CodeRepo {
                key: "otp-httpc",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/inets/src/http_client/httpc.erl",
                ],
            },
            CodeRepo {
                key: "emqx-channel",
                urls: &[
                    "https://raw.githubusercontent.com/emqx/emqx/0173360ca3c5a7087ff8d83a813c9ec65858624a/apps/emqx/src/emqx_channel.erl",
                ],
            },
            CodeRepo {
                key: "emqx-session",
                urls: &[
                    "https://raw.githubusercontent.com/emqx/emqx/0173360ca3c5a7087ff8d83a813c9ec65858624a/apps/emqx/src/emqx_session.erl",
                ],
            },
            CodeRepo {
                key: "otp-filename",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/stdlib/src/filename.erl",
                ],
            },
            CodeRepo {
                key: "otp-binary",
                urls: &[
                    "https://raw.githubusercontent.com/erlang/otp/f67aa9da945f01315fcfd2d6ac2a90909a34afa4/lib/stdlib/src/binary.erl",
                ],
            },
            CodeRepo {
                key: "ejabberd",
                urls: &[
                    "https://raw.githubusercontent.com/processone/ejabberd/27b87d4a8af84cab619fa33095b42cb03f9e6020/src/ejabberd_c2s.erl",
                    "https://raw.githubusercontent.com/processone/ejabberd/27b87d4a8af84cab619fa33095b42cb03f9e6020/src/ejabberd_router.erl",
                ],
            },
            CodeRepo {
                key: "vernemq",
                urls: &[
                    "https://raw.githubusercontent.com/vernemq/vernemq/17550aa92c2dd9f5a11862dc843d1981f12a7e0c/apps/vmq_server/src/vmq_mqtt_fsm.erl",
                    "https://raw.githubusercontent.com/vernemq/vernemq/17550aa92c2dd9f5a11862dc843d1981f12a7e0c/apps/vmq_server/src/vmq_queue.erl",
                ],
            },
            CodeRepo {
                key: "couchdb",
                urls: &[
                    "https://raw.githubusercontent.com/apache/couchdb/72936f80eca5e99ce00426085f7608391862db3a/src/couch/src/couch_db.erl",
                    "https://raw.githubusercontent.com/apache/couchdb/72936f80eca5e99ce00426085f7608391862db3a/src/couch/src/couch_btree.erl",
                ],
            },
        ],
        has_builtin: false,
        // Erlang: -spec and -record use braces for types/fields.
        // Erlang functions themselves don't use braces (they end with `.`),
        // so extraction is limited to type specs and records.
        block_style: BlockStyle::Braces(&["-spec ", "-record(", "-type ", "-callback "]),
    },
    CodeLanguage {
        key: "groovy",
        display_name: "Groovy",
        extensions: &[".groovy"],
        repos: &[
            CodeRepo {
                key: "nextflow",
                urls: &[
                    "https://raw.githubusercontent.com/nextflow-io/nextflow/2e1d42ef84a74998af34ef0c41b4afbae6c41d17/modules/nextflow/src/main/groovy/nextflow/processor/TaskProcessor.groovy",
                    "https://raw.githubusercontent.com/nextflow-io/nextflow/2e1d42ef84a74998af34ef0c41b4afbae6c41d17/modules/nextflow/src/main/groovy/nextflow/Session.groovy",
                    "https://raw.githubusercontent.com/nextflow-io/nextflow/2e1d42ef84a74998af34ef0c41b4afbae6c41d17/modules/nextflow/src/main/groovy/nextflow/Channel.groovy",
                    "https://raw.githubusercontent.com/nextflow-io/nextflow/2e1d42ef84a74998af34ef0c41b4afbae6c41d17/modules/nextflow/src/main/groovy/nextflow/processor/TaskConfig.groovy",
                ],
            },
            CodeRepo {
                key: "codenarc",
                urls: &[
                    "https://raw.githubusercontent.com/CodeNarc/CodeNarc/0eb23cff04cbf71794c8852e2ea25ac1fe81b36c/src/main/groovy/org/codenarc/CodeNarcRunner.groovy",
                ],
            },
            CodeRepo {
                key: "spock",
                urls: &[
                    "https://raw.githubusercontent.com/spockframework/spock/b71e3d7590dae28d608aa92f90b45bef33aaeda8/spock-core/src/main/groovy/spock/util/EmbeddedSpecRunner.groovy",
                    "https://raw.githubusercontent.com/spockframework/spock/b71e3d7590dae28d608aa92f90b45bef33aaeda8/spock-core/src/main/groovy/spock/util/EmbeddedSpecCompiler.groovy",
                ],
            },
            CodeRepo {
                key: "nextflow-runner",
                urls: &[
                    "https://raw.githubusercontent.com/nextflow-io/nextflow/2e1d42ef84a74998af34ef0c41b4afbae6c41d17/modules/nextflow/src/main/groovy/nextflow/script/ScriptRunner.groovy",
                ],
            },
            CodeRepo {
                key: "nextflow-executor",
                urls: &[
                    "https://raw.githubusercontent.com/nextflow-io/nextflow/2e1d42ef84a74998af34ef0c41b4afbae6c41d17/modules/nextflow/src/main/groovy/nextflow/executor/Executor.groovy",
                ],
            },
            CodeRepo {
                key: "nextflow-core",
                urls: &[
                    "https://raw.githubusercontent.com/nextflow-io/nextflow/2e1d42ef84a74998af34ef0c41b4afbae6c41d17/modules/nextflow/src/main/groovy/nextflow/Nextflow.groovy",
                    "https://raw.githubusercontent.com/nextflow-io/nextflow/2e1d42ef84a74998af34ef0c41b4afbae6c41d17/modules/nextflow/src/main/groovy/nextflow/script/WorkflowMetadata.groovy",
                ],
            },
            CodeRepo {
                key: "nextflow-trace",
                urls: &[
                    "https://raw.githubusercontent.com/nextflow-io/nextflow/2e1d42ef84a74998af34ef0c41b4afbae6c41d17/modules/nextflow/src/main/groovy/nextflow/trace/TraceRecord.groovy",
                ],
            },
            CodeRepo {
                key: "grails",
                urls: &[
                    "https://raw.githubusercontent.com/grails/grails-core/13617a4a4a78894146f6b3b85b15e1a52e29c5b8/grails-core/src/main/groovy/grails/boot/GrailsApp.groovy",
                ],
            },
            CodeRepo {
                key: "rundeck-execution",
                urls: &[
                    "https://raw.githubusercontent.com/rundeck/rundeck/4c70fb21fb1dbf58beb91fb64ca8265e5849f857/rundeckapp/grails-app/services/rundeck/services/ExecutionService.groovy",
                ],
            },
            CodeRepo {
                key: "rundeck-scheduled",
                urls: &[
                    "https://raw.githubusercontent.com/rundeck/rundeck/4c70fb21fb1dbf58beb91fb64ca8265e5849f857/rundeckapp/grails-app/services/rundeck/services/ScheduledExecutionService.groovy",
                ],
            },
            CodeRepo {
                key: "rundeck-exec-controller",
                urls: &[
                    "https://raw.githubusercontent.com/rundeck/rundeck/4c70fb21fb1dbf58beb91fb64ca8265e5849f857/rundeckapp/grails-app/controllers/rundeck/controllers/ExecutionController.groovy",
                ],
            },
            CodeRepo {
                key: "rundeck-sched-controller",
                urls: &[
                    "https://raw.githubusercontent.com/rundeck/rundeck/4c70fb21fb1dbf58beb91fb64ca8265e5849f857/rundeckapp/grails-app/controllers/rundeck/controllers/ScheduledExecutionController.groovy",
                ],
            },
            CodeRepo {
                key: "rundeck-framework",
                urls: &[
                    "https://raw.githubusercontent.com/rundeck/rundeck/4c70fb21fb1dbf58beb91fb64ca8265e5849f857/rundeckapp/grails-app/services/rundeck/services/FrameworkService.groovy",
                ],
            },
            CodeRepo {
                key: "rundeck-project",
                urls: &[
                    "https://raw.githubusercontent.com/rundeck/rundeck/4c70fb21fb1dbf58beb91fb64ca8265e5849f857/rundeckapp/grails-app/services/rundeck/services/ProjectService.groovy",
                ],
            },
            CodeRepo {
                key: "rundeck-logfile",
                urls: &[
                    "https://raw.githubusercontent.com/rundeck/rundeck/4c70fb21fb1dbf58beb91fb64ca8265e5849f857/rundeckapp/grails-app/services/rundeck/services/LogFileStorageService.groovy",
                ],
            },
            CodeRepo {
                key: "nextflow-file-helper",
                urls: &[
                    "https://raw.githubusercontent.com/nextflow-io/nextflow/2e1d42ef84a74998af34ef0c41b4afbae6c41d17/modules/nf-commons/src/main/nextflow/file/FileHelper.groovy",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::Braces(&["def ", "void ", "static ", "public ", "private "]),
    },
    CodeLanguage {
        key: "fsharp",
        display_name: "F#",
        extensions: &[".fs", ".fsx"],
        repos: &[
            CodeRepo {
                key: "fsharp-compiler",
                urls: &[
                    "https://raw.githubusercontent.com/dotnet/fsharp/68fb63daa05d38077a4ba32740ef7deda7ebded2/src/Compiler/Utilities/lib.fs",
                ],
            },
            CodeRepo {
                key: "fsharp-core",
                urls: &[
                    "https://raw.githubusercontent.com/dotnet/fsharp/68fb63daa05d38077a4ba32740ef7deda7ebded2/src/FSharp.Core/list.fs",
                    "https://raw.githubusercontent.com/dotnet/fsharp/68fb63daa05d38077a4ba32740ef7deda7ebded2/src/FSharp.Core/map.fs",
                ],
            },
            CodeRepo {
                key: "Saturn",
                urls: &[
                    "https://raw.githubusercontent.com/SaturnFramework/Saturn/4ae4d6126a6c7c0e91bded2ddbe1103030010c78/src/Saturn/Router.fs",
                ],
            },
            CodeRepo {
                key: "fsharp-array",
                urls: &[
                    "https://raw.githubusercontent.com/dotnet/fsharp/68fb63daa05d38077a4ba32740ef7deda7ebded2/src/FSharp.Core/array.fs",
                ],
            },
            CodeRepo {
                key: "fsharp-seq",
                urls: &[
                    "https://raw.githubusercontent.com/dotnet/fsharp/68fb63daa05d38077a4ba32740ef7deda7ebded2/src/FSharp.Core/seq.fs",
                ],
            },
            CodeRepo {
                key: "fsharp-option",
                urls: &[
                    "https://raw.githubusercontent.com/dotnet/fsharp/68fb63daa05d38077a4ba32740ef7deda7ebded2/src/FSharp.Core/option.fs",
                ],
            },
            CodeRepo {
                key: "fsharp-result",
                urls: &[
                    "https://raw.githubusercontent.com/dotnet/fsharp/68fb63daa05d38077a4ba32740ef7deda7ebded2/src/FSharp.Core/result.fs",
                ],
            },
            CodeRepo {
                key: "fsharp-async",
                urls: &[
                    "https://raw.githubusercontent.com/dotnet/fsharp/68fb63daa05d38077a4ba32740ef7deda7ebded2/src/FSharp.Core/async.fs",
                ],
            },
            CodeRepo {
                key: "giraffe",
                urls: &[
                    "https://raw.githubusercontent.com/giraffe-fsharp/Giraffe/ebe4a39fc6b6dd8d532eefaca299742c38d98711/src/Giraffe/Routing.fs",
                    "https://raw.githubusercontent.com/giraffe-fsharp/Giraffe/ebe4a39fc6b6dd8d532eefaca299742c38d98711/src/Giraffe/Core.fs",
                    "https://raw.githubusercontent.com/giraffe-fsharp/Giraffe/ebe4a39fc6b6dd8d532eefaca299742c38d98711/src/Giraffe/FormatExpressions.fs",
                ],
            },
            CodeRepo {
                key: "fable",
                urls: &[
                    "https://raw.githubusercontent.com/fable-compiler/Fable/098f8700a019854fec2d21d2857afa2dc0d48c26/src/Fable.Transforms/FableTransforms.fs",
                    "https://raw.githubusercontent.com/fable-compiler/Fable/098f8700a019854fec2d21d2857afa2dc0d48c26/src/Fable.Transforms/FSharp2Fable.fs",
                ],
            },
            CodeRepo {
                key: "farmer",
                urls: &[
                    "https://raw.githubusercontent.com/CompositionalIT/farmer/1df037941bf30e1a20bc58ada939d32f2a34c982/src/Farmer/Common.fs",
                    "https://raw.githubusercontent.com/CompositionalIT/farmer/1df037941bf30e1a20bc58ada939d32f2a34c982/src/Farmer/Builders/Builders.WebApp.fs",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::Indentation(&["let ", "member ", "type ", "module "]),
    },
    CodeLanguage {
        key: "objective-c",
        display_name: "Objective-C",
        extensions: &[".m", ".h"],
        repos: &[
            CodeRepo {
                key: "afnetworking",
                urls: &[
                    "https://raw.githubusercontent.com/AFNetworking/AFNetworking/d9f589cc2c1fe9d55eb5eea00558010afea7a41e/AFNetworking/AFURLSessionManager.m",
                ],
            },
            CodeRepo {
                key: "sdwebimage",
                urls: &[
                    "https://raw.githubusercontent.com/SDWebImage/SDWebImage/2de3a496eaf6df9a1312862adcfd54acd73c39c0/SDWebImage/Core/SDWebImageManager.m",
                ],
            },
            CodeRepo {
                key: "realm-cocoa",
                urls: &[
                    "https://raw.githubusercontent.com/realm/realm-cocoa/c22f9303d446fc3c044e4c151ed19597464b6bd7/Realm/RLMRealm.mm",
                ],
            },
            CodeRepo {
                key: "afnetworking-http",
                urls: &[
                    "https://raw.githubusercontent.com/AFNetworking/AFNetworking/d9f589cc2c1fe9d55eb5eea00558010afea7a41e/AFNetworking/AFHTTPSessionManager.m",
                ],
            },
            CodeRepo {
                key: "sdwebimage-cache",
                urls: &[
                    "https://raw.githubusercontent.com/SDWebImage/SDWebImage/2de3a496eaf6df9a1312862adcfd54acd73c39c0/SDWebImage/Core/SDImageCache.m",
                ],
            },
            CodeRepo {
                key: "iterm2",
                urls: &[
                    "https://raw.githubusercontent.com/gnachman/iTerm2/1d997ee0082b3ad413366253d2868f7665b8c25f/sources/iTermController.m",
                    "https://raw.githubusercontent.com/gnachman/iTerm2/1d997ee0082b3ad413366253d2868f7665b8c25f/sources/PTYSession.m",
                    "https://raw.githubusercontent.com/gnachman/iTerm2/1d997ee0082b3ad413366253d2868f7665b8c25f/sources/VT100Terminal.m",
                ],
            },
            CodeRepo {
                key: "mbprogresshud",
                urls: &[
                    "https://raw.githubusercontent.com/jdg/MBProgressHUD/4a7c5f3e53cdea77c5dcb8578c2ee5acacdf6781/MBProgressHUD.m",
                ],
            },
            CodeRepo {
                key: "cocoalumberjack",
                urls: &[
                    "https://raw.githubusercontent.com/CocoaLumberjack/CocoaLumberjack/f817a936d8ff9ddc7e3cbb2dcf0eb7a6f75c6e44/Sources/CocoaLumberjack/DDLog.m",
                ],
            },
            CodeRepo {
                key: "fmdb",
                urls: &[
                    "https://raw.githubusercontent.com/ccgus/fmdb/d3abf748a2788471535993286603322ccdd02c3d/src/fmdb/FMDatabase.m",
                ],
            },
            CodeRepo {
                key: "mantle",
                urls: &[
                    "https://raw.githubusercontent.com/Mantle/Mantle/2a8e2123a3931038179ee06105c9e6ec336b12ea/Mantle/MTLJSONAdapter.m",
                ],
            },
            CodeRepo {
                key: "reactive-objc",
                urls: &[
                    "https://raw.githubusercontent.com/ReactiveCocoa/ReactiveObjC/1af6617f007cae727dce48d2031cc1e66d06f04a/ReactiveObjC/RACSignal.m",
                ],
            },
            CodeRepo {
                key: "masonry",
                urls: &[
                    "https://raw.githubusercontent.com/Masonry/Masonry/8bd77ea92bbe995e14c454f821200b222e5a8804/Masonry/MASConstraintMaker.m",
                    "https://raw.githubusercontent.com/Masonry/Masonry/8bd77ea92bbe995e14c454f821200b222e5a8804/Masonry/MASViewConstraint.m",
                ],
            },
        ],
        has_builtin: false,
        block_style: BlockStyle::Braces(&[
            "- (",
            "+ (",
            "- (void)",
            "- (id)",
            "- (BOOL)",
            "@interface ",
            "@implementation ",
            "@protocol ",
            "typedef ",
        ]),
    },
];

/// Returns list of (key, display_name) for language selection UI.
pub fn code_language_options() -> Vec<(&'static str, String)> {
    let mut options: Vec<(&'static str, String)> = CODE_LANGUAGES
        .iter()
        .map(|lang| (lang.key, lang.display_name.to_string()))
        .collect();
    options.sort_by_key(|(_, display)| display.to_lowercase());
    options.insert(0, ("all", "All (random)".to_string()));
    options
}

/// Look up a language by its key.
pub fn language_by_key(key: &str) -> Option<&'static CodeLanguage> {
    CODE_LANGUAGES.iter().find(|lang| lang.key == key)
}

/// Check if any cached snippet files exist for a language.
pub fn is_language_cached(cache_dir: &str, key: &str) -> bool {
    let dir = std::path::Path::new(cache_dir);
    if !dir.is_dir() {
        return false;
    }
    let prefix = format!("{}_", key);
    if let Ok(entries) = fs::read_dir(dir) {
        for entry in entries.flatten() {
            let name = entry.file_name();
            let name = name.to_string_lossy();
            if name.starts_with(&prefix) && name.ends_with(".txt") {
                if let Ok(meta) = entry.metadata() {
                    if meta.len() > 0 {
                        return true;
                    }
                }
            }
        }
    }
    false
}

/// Returns language keys that have either built-in snippets or cached content.
pub fn languages_with_content(cache_dir: &str) -> Vec<&'static str> {
    CODE_LANGUAGES
        .iter()
        .filter(|lang| lang.has_builtin || is_language_cached(cache_dir, lang.key))
        .map(|lang| lang.key)
        .collect()
}

/// Build a download queue of `(language_key, repo_index)` pairs for uncached repos.
/// When `lang_key` is `"all"`, queues all uncached repos across all languages.
pub fn build_code_download_queue(lang_key: &str, cache_dir: &str) -> Vec<(String, usize)> {
    let languages_to_download: Vec<&str> = if lang_key == "all" {
        CODE_LANGUAGES.iter().map(|l| l.key).collect()
    } else if language_by_key(lang_key).is_some() {
        vec![lang_key]
    } else {
        vec![]
    };

    let mut queue: Vec<(String, usize)> = Vec::new();
    for lk in &languages_to_download {
        if let Some(lang) = language_by_key(lk) {
            for (repo_idx, repo) in lang.repos.iter().enumerate() {
                let cache_path =
                    std::path::Path::new(cache_dir).join(format!("{}_{}.txt", lang.key, repo.key));
                if !cache_path.exists()
                    || std::fs::metadata(&cache_path)
                        .map(|m| m.len() == 0)
                        .unwrap_or(true)
                {
                    queue.push((lang.key.to_string(), repo_idx));
                }
            }
        }
    }
    queue
}

pub struct CodeSyntaxGenerator {
    rng: SmallRng,
    language: String,
    fetched_snippets: Vec<(String, String)>, // (snippet, repo_key)
    last_source: String,
}

impl CodeSyntaxGenerator {
    pub fn new(rng: SmallRng, language: &str, cache_dir: &str) -> Self {
        let mut generator = Self {
            rng,
            language: language.to_string(),
            fetched_snippets: Vec::new(),
            last_source: "Built-in snippets".to_string(),
        };
        generator.load_cached_snippets(cache_dir);
        generator
    }

    pub fn last_source(&self) -> &str {
        &self.last_source
    }

    fn load_cached_snippets(&mut self, cache_dir: &str) {
        let dir = std::path::Path::new(cache_dir);
        if !dir.is_dir() {
            return;
        }
        let prefix = format!("{}_", self.language);
        if let Ok(entries) = fs::read_dir(dir) {
            for entry in entries.flatten() {
                let name = entry.file_name();
                let name_str = name.to_string_lossy();
                if name_str.starts_with(&prefix) && name_str.ends_with(".txt") {
                    // Extract repo key from filename: {language}_{repo}.txt
                    let repo_key = name_str
                        .strip_prefix(&prefix)
                        .and_then(|s| s.strip_suffix(".txt"))
                        .unwrap_or("unknown")
                        .to_string();
                    if let Ok(content) = fs::read_to_string(entry.path()) {
                        let snippets: Vec<(String, String)> = content
                            .split("\n---SNIPPET---\n")
                            .filter(|s| !s.trim().is_empty())
                            .map(|s| (s.to_string(), repo_key.clone()))
                            .collect();
                        self.fetched_snippets.extend(snippets);
                    }
                }
            }
        }
    }

    fn rust_snippets() -> Vec<&'static str> {
        vec![
            r#"fn main() {
    println!("hello");
}"#,
            r#"let mut x = 0;
x += 1;"#,
            r#"for i in 0..10 {
    println!("{}", i);
}"#,
            r#"if x > 0 {
    return true;
}"#,
            r#"match val {
    Some(x) => x,
    None => 0,
}"#,
            r#"struct Point {
    x: f64,
    y: f64,
}"#,
            r#"impl Point {
    fn new(x: f64, y: f64) -> Self {
        Self { x, y }
    }
}"#,
            "let v: Vec<i32> = vec![1, 2, 3];",
            r#"fn add(a: i32, b: i32) -> i32 {
    a + b
}"#,
            "use std::collections::HashMap;",
            r#"pub fn process(input: &str) -> Result<String, Error> {
    Ok(input.to_string())
}"#,
            r#"let result = items
    .iter()
    .filter(|x| x > &0)
    .map(|x| x * 2)
    .collect::<Vec<_>>();"#,
            r#"enum Color {
    Red,
    Green,
    Blue,
}"#,
            r#"trait Display {
    fn show(&self) -> String;
}"#,
            r#"while let Some(item) = stack.pop() {
    process(item);
}"#,
            r#"#[derive(Debug, Clone)]
struct Config {
    name: String,
    value: i32,
}"#,
            r#"let handle = std::thread::spawn(|| {
    println!("thread");
});"#,
            r#"let mut map = HashMap::new();
map.insert("key", 42);"#,
            r#"fn factorial(n: u64) -> u64 {
    if n <= 1 {
        1
    } else {
        n * factorial(n - 1)
    }
}"#,
            r#"impl Iterator for Counter {
    type Item = u32;

    fn next(&mut self) -> Option<Self::Item> {
        None
    }
}"#,
            r#"async fn fetch(url: &str) -> Result<String> {
    let body = reqwest::get(url)
        .await?
        .text()
        .await?;
    Ok(body)
}"#,
            r#"let closure = |x: i32, y: i32| -> i32 {
    x + y
};"#,
            r#"#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }
}"#,
            r#"pub struct Builder {
    name: Option<String>,
}

impl Builder {
    pub fn name(mut self, n: &str) -> Self {
        self.name = Some(n.into());
        self
    }
}"#,
            r#"use std::sync::{Arc, Mutex};
let data = Arc::new(Mutex::new(vec![1, 2, 3]));"#,
            r#"if let Ok(value) = "42".parse::<i32>() {
    println!("parsed: {}", value);
}"#,
            r#"fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}"#,
            "type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;",
            r#"macro_rules! vec_of_strings {
    ($($x:expr),*) => {
        vec![$($x.to_string()),*]
    };
}"#,
            r#"let (tx, rx) = std::sync::mpsc::channel();
tx.send(42).unwrap();"#,
        ]
    }

    fn python_snippets() -> Vec<&'static str> {
        vec![
            r#"def main():
    print("hello")"#,
            r#"for i in range(10):
    print(i)"#,
            r#"if x > 0:
    return True"#,
            r#"class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y"#,
            r#"import os
path = os.path.join("a", "b")"#,
            r#"result = [
    x * 2
    for x in items
    if x > 0
]"#,
            r#"with open("file.txt") as f:
    data = f.read()"#,
            r#"def add(a: int, b: int) -> int:
    return a + b"#,
            r#"try:
    result = process(data)
except ValueError as e:
    print(e)"#,
            "from collections import defaultdict",
            "lambda x: x * 2 + 1",
            r#"dict_comp = {
    k: v
    for k, v in pairs.items()
}"#,
            r#"async def fetch(url):
    async with aiohttp.ClientSession() as session:
        return await session.get(url)"#,
            r#"def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)"#,
            r#"@property
def name(self):
    return self._name"#,
            r#"from dataclasses import dataclass

@dataclass
class Config:
    name: str
    value: int = 0"#,
            "yield from range(10)",
            r#"sorted(
    items,
    key=lambda x: x.name,
    reverse=True,
)"#,
            "from typing import Optional, List, Dict",
            r#"with contextlib.suppress(FileNotFoundError):
    os.remove("temp.txt")"#,
            r#"class Meta(type):
    def __new__(cls, name, bases, attrs):
        return super().__new__(
            cls, name, bases, attrs
        )"#,
            r#"from functools import lru_cache

@lru_cache(maxsize=128)
def expensive(n):
    return sum(range(n))"#,
            r#"from pathlib import Path
files = list(Path(".").glob("**/*.py"))"#,
            r#"assert isinstance(result, dict), \
    f"Expected dict, got {type(result)}""#,
            r#"values = {*set_a, *set_b}
merged = {**dict_a, **dict_b}"#,
        ]
    }

    fn javascript_snippets() -> Vec<&'static str> {
        vec![
            r#"const x = 42;
console.log(x);"#,
            r#"function add(a, b) {
    return a + b;
}"#,
            r#"const arr = [1, 2, 3].map(
    x => x * 2
);"#,
            r#"if (x > 0) {
    return true;
}"#,
            r#"for (let i = 0; i < 10; i++) {
    console.log(i);
}"#,
            r#"class Point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
}"#,
            "const { name, age } = person;",
            r#"async function fetch(url) {
    const res = await get(url);
    return res.json();
}"#,
            r#"const obj = {
    ...defaults,
    ...overrides,
};"#,
            r#"try {
    parse(data);
} catch (e) {
    console.error(e);
}"#,
            r#"export default function handler(req, res) {
    res.send("ok");
}"#,
            r#"const result = items
    .filter(x => x > 0)
    .reduce((a, b) => a + b, 0);"#,
            r#"const promise = new Promise(
    (resolve, reject) => {
        setTimeout(resolve, 1000);
    }
);"#,
            "const [first, ...rest] = array;",
            r#"class EventEmitter {
    constructor() {
        this.listeners = new Map();
    }
}"#,
            r#"const proxy = new Proxy(target, {
    get(obj, prop) {
        return obj[prop];
    }
});"#,
            r#"for await (const chunk of stream) {
    process(chunk);
}"#,
            r#"const memoize = (fn) => {
    const cache = new Map();
    return (...args) => {
        return cache.get(args) ?? fn(...args);
    };
};"#,
            r#"import { useState, useEffect } from 'react';
const [state, setState] = useState(null);"#,
            r#"const pipe = (...fns) => (x) =>
    fns.reduce((v, f) => f(v), x);"#,
            r#"Object.entries(obj).forEach(
    ([key, value]) => {
        console.log(key, value);
    }
);"#,
            r#"const debounce = (fn, ms) => {
    let timer;
    return (...args) => {
        clearTimeout(timer);
        timer = setTimeout(
            () => fn(...args),
            ms
        );
    };
};"#,
            r#"const observable = new Observable(
    subscriber => {
        subscriber.next(1);
        subscriber.complete();
    }
);"#,
        ]
    }

    fn go_snippets() -> Vec<&'static str> {
        vec![
            "func main() {\n\tfmt.Println(\"hello\")\n}",
            "for i := 0; i < 10; i++ {\n\tfmt.Println(i)\n}",
            "if err != nil {\n\treturn err\n}",
            "type Point struct {\n\tX float64\n\tY float64\n}",
            "func add(a, b int) int {\n\treturn a + b\n}",
            "import \"fmt\"",
            "result := make([]int, 0, 10)",
            "switch val {\ncase 1:\n\treturn \"one\"\ndefault:\n\treturn \"other\"\n}",
            "go func() {\n\tch <- result\n}()",
            "defer file.Close()",
            "type Reader interface {\n\tRead(p []byte) (n int, err error)\n}",
            "ctx, cancel := context.WithTimeout(\n\tcontext.Background(),\n\ttime.Second,\n)",
            "var wg sync.WaitGroup\nwg.Add(1)\ngo func() {\n\tdefer wg.Done()\n}()",
            "func (p *Point) Distance() float64 {\n\treturn math.Sqrt(p.X*p.X + p.Y*p.Y)\n}",
            "select {\ncase msg := <-ch:\n\tprocess(msg)\ncase <-time.After(time.Second):\n\ttimeout()\n}",
            "json.NewEncoder(w).Encode(response)",
            "http.HandleFunc(\"/api\",\n\tfunc(w http.ResponseWriter, r *http.Request) {\n\t\tw.Write([]byte(\"ok\"))\n\t},\n)",
            "func Map[T, U any](s []T, f func(T) U) []U {\n\tr := make([]U, len(s))\n\tfor i, v := range s {\n\t\tr[i] = f(v)\n\t}\n\treturn r\n}",
            "var once sync.Once\nonce.Do(func() {\n\tinitialize()\n})",
            "buf := bytes.NewBuffer(nil)\nbuf.WriteString(\"hello\")",
        ]
    }

    fn typescript_snippets() -> Vec<&'static str> {
        vec![
            r#"interface User {
    id: number;
    name: string;
    email: string;
}"#,
            r#"type Result<T> = {
    data: T;
    error: string | null;
};"#,
            r#"function identity<T>(arg: T): T {
    return arg;
}"#,
            r#"export async function fetchData<T>(
    url: string
): Promise<T> {
    const res = await fetch(url);
    return res.json() as T;
}"#,
            r#"class Stack<T> {
    private items: T[] = [];

    push(item: T): void {
        this.items.push(item);
    }

    pop(): T | undefined {
        return this.items.pop();
    }
}"#,
            r#"const enum Direction {
    Up = "UP",
    Down = "DOWN",
    Left = "LEFT",
    Right = "RIGHT",
}"#,
            r#"type EventHandler<T> = (
    event: T
) => void;"#,
            r#"export function createStore<S>(
    initialState: S
) {
    let state = initialState;
    return {
        getState: () => state,
        setState: (next: S) => {
            state = next;
        },
    };
}"#,
            r#"interface Repository<T> {
    findById(id: string): Promise<T | null>;
    save(entity: T): Promise<void>;
    delete(id: string): Promise<boolean>;
}"#,
            r#"const guard = (
    value: unknown
): value is string => {
    return typeof value === "string";
};"#,
            r#"type DeepPartial<T> = {
    [P in keyof T]?: T[P] extends object
        ? DeepPartial<T[P]>
        : T[P];
};"#,
            r#"export function debounce<T extends (...args: any[]) => void>(
    fn: T,
    delay: number
): T {
    let timer: ReturnType<typeof setTimeout>;
    return ((...args: any[]) => {
        clearTimeout(timer);
        timer = setTimeout(() => fn(...args), delay);
    }) as T;
}"#,
        ]
    }

    fn java_snippets() -> Vec<&'static str> {
        vec![
            r#"public class Main {
    public static void main(String[] args) {
        System.out.println("hello");
    }
}"#,
            r#"public int add(int a, int b) {
    return a + b;
}"#,
            r#"public class Stack<T> {
    private List<T> items = new ArrayList<>();

    public void push(T item) {
        items.add(item);
    }

    public T pop() {
        return items.remove(items.size() - 1);
    }
}"#,
            r#"public interface Repository<T> {
    Optional<T> findById(String id);
    void save(T entity);
    boolean delete(String id);
}"#,
            r#"List<String> result = items.stream()
    .filter(s -> s.length() > 3)
    .map(String::toUpperCase)
    .collect(Collectors.toList());"#,
            r#"try {
    BufferedReader reader = new BufferedReader(
        new FileReader("data.txt")
    );
    String line = reader.readLine();
} catch (IOException e) {
    e.printStackTrace();
}"#,
            r#"@Override
public boolean equals(Object obj) {
    if (this == obj) return true;
    if (!(obj instanceof Point)) return false;
    Point other = (Point) obj;
    return x == other.x && y == other.y;
}"#,
            r#"public static <T extends Comparable<T>> T max(
    T a, T b
) {
    return a.compareTo(b) >= 0 ? a : b;
}"#,
            r#"Map<String, Integer> counts = new HashMap<>();
for (String word : words) {
    counts.merge(word, 1, Integer::sum);
}"#,
            r#"public record Point(double x, double y) {
    public double distance() {
        return Math.sqrt(x * x + y * y);
    }
}"#,
            r#"CompletableFuture<String> future =
    CompletableFuture.supplyAsync(() -> {
        return fetchData();
    }).thenApply(data -> {
        return process(data);
    });"#,
            r#"private final Lock lock = new ReentrantLock();

public void update(String value) {
    lock.lock();
    try {
        this.data = value;
    } finally {
        lock.unlock();
    }
}"#,
        ]
    }

    fn c_snippets() -> Vec<&'static str> {
        vec![
            r#"int main(int argc, char *argv[]) {
    printf("hello\n");
    return 0;
}"#,
            r#"struct Point {
    double x;
    double y;
};"#,
            r#"int *create_array(int size) {
    int *arr = malloc(size * sizeof(int));
    if (arr == NULL) {
        return NULL;
    }
    memset(arr, 0, size * sizeof(int));
    return arr;
}"#,
            r#"void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}"#,
            r#"typedef struct Node {
    int data;
    struct Node *next;
} Node;"#,
            r#"char *str_dup(const char *src) {
    size_t len = strlen(src) + 1;
    char *dst = malloc(len);
    if (dst != NULL) {
        memcpy(dst, src, len);
    }
    return dst;
}"#,
            r#"void free_list(Node *head) {
    Node *current = head;
    while (current != NULL) {
        Node *next = current->next;
        free(current);
        current = next;
    }
}"#,
            r#"int binary_search(
    int *arr, int size, int target
) {
    int low = 0, high = size - 1;
    while (low <= high) {
        int mid = low + (high - low) / 2;
        if (arr[mid] == target) return mid;
        if (arr[mid] < target) low = mid + 1;
        else high = mid - 1;
    }
    return -1;
}"#,
            r#"static int compare(
    const void *a, const void *b
) {
    return (*(int *)a - *(int *)b);
}"#,
            r#"FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
    perror("fopen");
    return 1;
}
fclose(fp);"#,
            r#"#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))"#,
            r#"void print_array(
    const int *arr, size_t len
) {
    for (size_t i = 0; i < len; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}"#,
        ]
    }

    fn cpp_snippets() -> Vec<&'static str> {
        vec![
            r#"class Vector {
public:
    Vector(double x, double y)
        : x_(x), y_(y) {}

    double length() const {
        return std::sqrt(x_ * x_ + y_ * y_);
    }

private:
    double x_, y_;
};"#,
            r#"template <typename T>
T max_value(T a, T b) {
    return (a > b) ? a : b;
}"#,
            r#"auto ptr = std::make_unique<Widget>();
ptr->update();
auto shared = std::make_shared<Config>();"#,
            r#"std::vector<int> nums = {3, 1, 4, 1, 5};
std::sort(nums.begin(), nums.end());
auto it = std::find(
    nums.begin(), nums.end(), 4
);"#,
            r#"class Shape {
public:
    virtual double area() const = 0;
    virtual ~Shape() = default;
};"#,
            r#"template <typename Container>
void print_all(const Container& c) {
    for (const auto& item : c) {
        std::cout << item << " ";
    }
    std::cout << std::endl;
}"#,
            r#"std::map<std::string, int> counts;
for (const auto& word : words) {
    counts[word]++;
}"#,
            r#"namespace utils {
    std::string trim(const std::string& s) {
        auto start = s.find_first_not_of(" \t");
        auto end = s.find_last_not_of(" \t");
        return s.substr(start, end - start + 1);
    }
}"#,
            r#"auto future = std::async(
    std::launch::async,
    []() { return compute(); }
);
auto result = future.get();"#,
            r#"class Singleton {
public:
    static Singleton& instance() {
        static Singleton s;
        return s;
    }
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
};"#,
            r#"try {
    auto data = parse(input);
} catch (const std::exception& e) {
    std::cerr << e.what() << std::endl;
}"#,
            r#"template <typename T>
class Stack {
    std::vector<T> data_;
public:
    void push(const T& val) {
        data_.push_back(val);
    }
    T pop() {
        T top = data_.back();
        data_.pop_back();
        return top;
    }
};"#,
        ]
    }

    fn ruby_snippets() -> Vec<&'static str> {
        vec![
            "class Animal\n  attr_reader :name, :age\n\n  def initialize(name, age)\n    @name = name\n    @age = age\n  end\nend",
            "def fibonacci(n)\n  return n if n <= 1\n  fibonacci(n - 1) + fibonacci(n - 2)\nend",
            "numbers = [1, 2, 3, 4, 5]\nresult = numbers\n  .select { |n| n.even? }\n  .map { |n| n * 2 }",
            "class Stack\n  def initialize\n    @data = []\n  end\n\n  def push(item)\n    @data.push(item)\n  end\n\n  def pop\n    @data.pop\n  end\nend",
            "File.open(\"data.txt\", \"r\") do |f|\n  f.each_line do |line|\n    puts line.strip\n  end\nend",
            "module Serializable\n  def to_json\n    instance_variables.each_with_object({}) do |var, hash|\n      hash[var.to_s.delete(\"@\")] = instance_variable_get(var)\n    end.to_json\n  end\nend",
            "begin\n  result = parse(data)\nrescue ArgumentError => e\n  puts \"Error: #{e.message}\"\nensure\n  cleanup\nend",
            "double = ->(x) { x * 2 }\ntriple = proc { |x| x * 3 }\nputs double.call(5)\nputs triple.call(5)",
            "class Config\n  def self.load(path)\n    YAML.load_file(path)\n  end\n\n  def self.defaults\n    { timeout: 30, retries: 3 }\n  end\nend",
            "hash = { name: \"Alice\", age: 30 }\nhash.each do |key, value|\n  puts \"#{key}: #{value}\"\nend",
            "def with_retry(attempts: 3)\n  attempts.times do |i|\n    begin\n      return yield\n    rescue StandardError => e\n      raise if i == attempts - 1\n    end\n  end\nend",
            "class Logger\n  def initialize(output = $stdout)\n    @output = output\n  end\n\n  def info(msg)\n    @output.puts \"[INFO] #{msg}\"\n  end\n\n  def error(msg)\n    @output.puts \"[ERROR] #{msg}\"\n  end\nend",
        ]
    }

    fn swift_snippets() -> Vec<&'static str> {
        vec![
            r#"struct Point {
    var x: Double
    var y: Double

    func distance(to other: Point) -> Double {
        let dx = x - other.x
        let dy = y - other.y
        return (dx * dx + dy * dy).squareRoot()
    }
}"#,
            r#"enum Result<T> {
    case success(T)
    case failure(Error)
}"#,
            r#"func fetchData(
    from url: URL,
    completion: @escaping (Data?) -> Void
) {
    URLSession.shared.dataTask(with: url) {
        data, _, _ in
        completion(data)
    }.resume()
}"#,
            r#"protocol Drawable {
    func draw()
    var bounds: CGRect { get }
}"#,
            r#"class ViewModel: ObservableObject {
    @Published var items: [String] = []

    func loadItems() {
        items = ["one", "two", "three"]
    }
}"#,
            r#"guard let value = optionalValue else {
    return nil
}
let result = process(value)"#,
            r#"let numbers = [1, 2, 3, 4, 5]
let doubled = numbers
    .filter { $0 > 2 }
    .map { $0 * 2 }"#,
            r#"extension Array where Element: Comparable {
    func sorted() -> [Element] {
        return self.sorted(by: <)
    }
}"#,
            r#"struct Config: Codable {
    let name: String
    let timeout: Int
    let retries: Int

    static let defaults = Config(
        name: "default",
        timeout: 30,
        retries: 3
    )
}"#,
            r#"func retry<T>(
    attempts: Int,
    task: () throws -> T
) rethrows -> T {
    for i in 0..<attempts {
        do {
            return try task()
        } catch where i < attempts - 1 {
            continue
        }
    }
    return try task()
}"#,
            r#"class Cache<Key: Hashable, Value> {
    private var storage: [Key: Value] = [:]

    func get(_ key: Key) -> Value? {
        return storage[key]
    }

    func set(_ key: Key, value: Value) {
        storage[key] = value
    }
}"#,
            r#"enum NetworkError: Error {
    case badURL
    case timeout
    case serverError(Int)

    var description: String {
        switch self {
        case .badURL: return "Invalid URL"
        case .timeout: return "Request timed out"
        case .serverError(let code):
            return "Server error: \(code)"
        }
    }
}"#,
        ]
    }

    fn bash_snippets() -> Vec<&'static str> {
        vec![
            "#!/bin/bash\nset -euo pipefail\nIFS=$'\\n\\t'",
            "function log() {\n  local level=\"$1\"\n  local msg=\"$2\"\n  echo \"[$level] $(date '+%Y-%m-%d %H:%M:%S') $msg\"\n}",
            "for file in *.txt; do\n  if [ -f \"$file\" ]; then\n    wc -l \"$file\"\n  fi\ndone",
            "count=0\nwhile read -r line; do\n  count=$((count + 1))\n  echo \"$count: $line\"\ndone < input.txt",
            "function check_deps() {\n  local deps=(\"git\" \"curl\" \"jq\")\n  for cmd in \"${deps[@]}\"; do\n    if ! command -v \"$cmd\" &>/dev/null; then\n      echo \"Missing: $cmd\"\n      exit 1\n    fi\n  done\n}",
            "case \"$1\" in\n  start)\n    echo \"Starting...\"\n    ;;\n  stop)\n    echo \"Stopping...\"\n    ;;\n  *)\n    echo \"Usage: $0 {start|stop}\"\n    exit 1\n    ;;\nesac",
            "readonly CONFIG_DIR=\"${HOME}/.config/myapp\"\nreadonly DATA_DIR=\"${HOME}/.local/share/myapp\"\nmkdir -p \"$CONFIG_DIR\" \"$DATA_DIR\"",
            "function cleanup() {\n  rm -rf \"$TMPDIR\"\n  echo \"Cleaned up temp files\"\n}\ntrap cleanup EXIT",
            "if [ -z \"${API_KEY:-}\" ]; then\n  echo \"Error: API_KEY not set\" >&2\n  exit 1\nfi",
            "function retry() {\n  local attempts=\"$1\"\n  shift\n  local count=0\n  until \"$@\"; do\n    count=$((count + 1))\n    if [ \"$count\" -ge \"$attempts\" ]; then\n      return 1\n    fi\n    sleep 1\n  done\n}",
            "declare -A colors\ncolors[red]=\"#ff0000\"\ncolors[green]=\"#00ff00\"\ncolors[blue]=\"#0000ff\"\nfor key in \"${!colors[@]}\"; do\n  echo \"$key: ${colors[$key]}\"\ndone",
            "find . -name \"*.log\" -mtime +7 -print0 |\n  xargs -0 rm -f\necho \"Old log files removed\"",
        ]
    }

    fn lua_snippets() -> Vec<&'static str> {
        vec![
            "local function greet(name)\n  print(\"Hello, \" .. name)\nend",
            "local config = {\n  host = \"localhost\",\n  port = 8080,\n  debug = false,\n}",
            "function factorial(n)\n  if n <= 1 then\n    return 1\n  end\n  return n * factorial(n - 1)\nend",
            "local mt = {\n  __index = function(t, k)\n    return rawget(t, k) or 0\n  end,\n  __tostring = function(t)\n    return table.concat(t, \", \")\n  end,\n}",
            "local function map(tbl, fn)\n  local result = {}\n  for i, v in ipairs(tbl) do\n    result[i] = fn(v)\n  end\n  return result\nend",
            "local function read_file(path)\n  local f = io.open(path, \"r\")\n  if not f then\n    return nil, \"cannot open file\"\n  end\n  local content = f:read(\"*a\")\n  f:close()\n  return content\nend",
            "local Class = {}\nClass.__index = Class\n\nfunction Class:new(name)\n  local instance = setmetatable({}, self)\n  instance.name = name\n  return instance\nend",
            "local function filter(tbl, pred)\n  local result = {}\n  for _, v in ipairs(tbl) do\n    if pred(v) then\n      table.insert(result, v)\n    end\n  end\n  return result\nend",
            "local function memoize(fn)\n  local cache = {}\n  return function(...)\n    local key = table.concat({...}, \",\")\n    if cache[key] == nil then\n      cache[key] = fn(...)\n    end\n    return cache[key]\n  end\nend",
            "for i = 1, 10 do\n  if i % 2 == 0 then\n    print(i .. \" is even\")\n  else\n    print(i .. \" is odd\")\n  end\nend",
            "local function merge(a, b)\n  local result = {}\n  for k, v in pairs(a) do\n    result[k] = v\n  end\n  for k, v in pairs(b) do\n    result[k] = v\n  end\n  return result\nend",
            "local function try_catch(fn, handler)\n  local ok, err = pcall(fn)\n  if not ok then\n    handler(err)\n  end\nend",
        ]
    }

    fn get_snippets(&self) -> Vec<&'static str> {
        match self.language.as_str() {
            "rust" => Self::rust_snippets(),
            "python" => Self::python_snippets(),
            "javascript" | "js" => Self::javascript_snippets(),
            "go" => Self::go_snippets(),
            "typescript" | "ts" => Self::typescript_snippets(),
            "java" => Self::java_snippets(),
            "c" => Self::c_snippets(),
            "cpp" | "c++" => Self::cpp_snippets(),
            "ruby" => Self::ruby_snippets(),
            "swift" => Self::swift_snippets(),
            "bash" => Self::bash_snippets(),
            "lua" => Self::lua_snippets(),
            _ => Self::rust_snippets(),
        }
    }
}

impl TextGenerator for CodeSyntaxGenerator {
    fn generate(
        &mut self,
        _filter: &CharFilter,
        _focused_char: Option<char>,
        _focused_bigram: Option<[char; 2]>,
        word_count: usize,
    ) -> String {
        let embedded = self.get_snippets();
        let target_words = word_count.max(1);
        let mut candidates: Vec<(bool, usize)> = Vec::new(); // (is_fetched, idx)
        let min_units = (target_words / 3).max(4);

        for (i, snippet) in embedded.iter().enumerate() {
            if approx_token_count(snippet) >= min_units {
                candidates.push((false, i));
            }
        }
        for (i, (snippet, _)) in self.fetched_snippets.iter().enumerate() {
            if approx_token_count(snippet) >= min_units {
                candidates.push((true, i));
            }
        }

        // If everything is short, fall back to all snippets.
        if candidates.is_empty() {
            for (i, _) in embedded.iter().enumerate() {
                candidates.push((false, i));
            }
            for (i, _) in self.fetched_snippets.iter().enumerate() {
                candidates.push((true, i));
            }
        }
        if candidates.is_empty() {
            return String::new();
        }

        let pick = self.rng.gen_range(0..candidates.len());
        let (is_fetched, idx) = candidates[pick];

        let display_name = CODE_LANGUAGES
            .iter()
            .find(|l| l.key == self.language)
            .map(|l| l.display_name)
            .unwrap_or(&self.language);

        let (selected, repo_key) = if is_fetched {
            let (snippet, repo) = self
                .fetched_snippets
                .get(idx)
                .map(|(s, r)| (s.as_str(), Some(r.as_str())))
                .unwrap_or((embedded[0], None));
            (snippet, repo)
        } else {
            (embedded.get(idx).copied().unwrap_or(embedded[0]), None)
        };
        let text = fit_snippet_to_target(selected, target_words);

        self.last_source = if let Some(repo) = repo_key {
            format!("{} \u{b7} {}", display_name, repo)
        } else {
            format!("{} \u{b7} built-in", display_name)
        };

        text
    }
}

fn approx_token_count(text: &str) -> usize {
    text.split_whitespace().count()
}

fn fit_snippet_to_target(snippet: &str, target_units: usize) -> String {
    let max_units = target_units
        .saturating_mul(3)
        .saturating_div(2)
        .max(target_units);
    if approx_token_count(snippet) <= max_units {
        return snippet.to_string();
    }

    let mut out_lines: Vec<&str> = Vec::new();
    let mut units = 0usize;
    for line in snippet.lines() {
        out_lines.push(line);
        units = units.saturating_add(approx_token_count(line));
        if units >= target_units && out_lines.len() >= 2 {
            break;
        }
    }

    if out_lines.is_empty() {
        snippet.to_string()
    } else {
        out_lines.join("\n")
    }
}

/// Download code from a repo and save extracted snippets to cache.
pub fn download_code_repo_to_cache_with_progress<F>(
    cache_dir: &str,
    language_key: &str,
    repo: &CodeRepo,
    block_style: &BlockStyle,
    snippets_limit: usize,
    mut on_progress: F,
) -> bool
where
    F: FnMut(u64, Option<u64>),
{
    if let Err(_) = fs::create_dir_all(cache_dir) {
        return false;
    }

    let mut all_snippets = Vec::new();

    for url in repo.urls {
        let bytes = fetch_url_bytes_with_progress(url, &mut on_progress);
        if let Some(bytes) = bytes {
            if let Ok(content) = String::from_utf8(bytes) {
                let snippets = extract_code_snippets(&content, block_style);
                all_snippets.extend(snippets);
            }
        }
    }

    if all_snippets.is_empty() {
        return false;
    }

    all_snippets.truncate(snippets_limit);

    let cache_path =
        std::path::Path::new(cache_dir).join(format!("{}_{}.txt", language_key, repo.key));
    let sources_path =
        std::path::Path::new(cache_dir).join(format!("{}_{}.sources.txt", language_key, repo.key));
    let combined = all_snippets.join("\n---SNIPPET---\n");
    if fs::write(cache_path, combined).is_err() {
        return false;
    }

    let mut sources = String::from(
        "Downloaded snippet sources for keydr code drill cache.\n\
         Upstream licenses remain with original repositories.\n\
         Source URLs:\n",
    );
    for url in repo.urls {
        sources.push_str("- ");
        sources.push_str(url);
        sources.push('\n');
    }
    let _ = fs::write(sources_path, sources);
    true
}

/// Extract function-length snippets from raw source code, preserving whitespace.
/// Uses the given `BlockStyle` to determine how to find and delimit code blocks.
/// When keyword-based extraction yields fewer than 20 snippets, runs a structural
/// fallback pass to capture blocks by structure (brace depth, indentation, etc.).
pub fn extract_code_snippets(source: &str, block_style: &BlockStyle) -> Vec<String> {
    let lines: Vec<&str> = source.lines().collect();

    let mut snippets = keyword_extract(&lines, block_style);

    if snippets.len() < 20 {
        let structural = structural_extract(&lines, block_style);
        for s in structural {
            if !snippets.contains(&s) {
                snippets.push(s);
            }
        }
    }

    snippets.truncate(200);
    snippets
}

/// Check if a snippet is "noise" (import-only, single-statement body, etc.)
fn is_noise_snippet(snippet: &str) -> bool {
    let meaningful_lines: Vec<&str> = snippet
        .lines()
        .filter(|l| {
            let t = l.trim();
            !t.is_empty()
                && !t.starts_with("//")
                && !t.starts_with('#')
                && !t.starts_with("/*")
                && !t.starts_with('*')
                && !t.starts_with("*/")
        })
        .collect();

    if meaningful_lines.is_empty() {
        return true;
    }

    // Reject if first meaningful line is just `{` or `}`
    let first = meaningful_lines[0].trim();
    if first == "{" || first == "}" {
        return true;
    }

    // Reject if body consists entirely of import/use/require/include statements
    let import_prefixes = [
        "import ",
        "from ",
        "use ",
        "require",
        "#include",
        "using ",
        "package ",
        "module ",
        "extern crate ",
    ];
    let body_lines: Vec<&str> = meaningful_lines.iter().skip(1).copied().collect();
    if !body_lines.is_empty()
        && body_lines.iter().all(|l| {
            let t = l.trim();
            import_prefixes.iter().any(|p| t.starts_with(p)) || t == "{" || t == "}"
        })
    {
        return true;
    }

    // Reject single-statement body (only 1 non-blank body line after opening)
    let non_blank_body: Vec<&str> = snippet
        .lines()
        .skip(1)
        .filter(|l| !l.trim().is_empty() && l.trim() != "}" && l.trim() != "end")
        .collect();
    if non_blank_body.len() <= 1 && snippet.lines().count() <= 3 {
        return true;
    }

    false
}

/// Validate a candidate snippet for quality.
fn is_valid_snippet(snippet: &str) -> bool {
    let line_count = snippet.lines().count();
    if line_count < 3 || line_count > 30 {
        return false;
    }
    let char_count = snippet.chars().filter(|c| !c.is_whitespace()).count();
    if char_count < 20 || snippet.len() > 800 {
        return false;
    }
    if !snippet.contains('\n') {
        return false;
    }
    !is_noise_snippet(snippet)
}

/// Keyword-based extraction (the original algorithm).
fn keyword_extract(lines: &[&str], block_style: &BlockStyle) -> Vec<String> {
    let mut snippets = Vec::new();
    let mut i = 0;

    while i < lines.len() {
        let trimmed = lines[i].trim();

        match block_style {
            BlockStyle::Braces(patterns) => {
                if patterns.iter().any(|p| trimmed.starts_with(p)) {
                    let mut snippet_lines = Vec::new();
                    let mut depth = 0i32;
                    let mut j = i;

                    while j < lines.len() && snippet_lines.len() < 30 {
                        let l = lines[j];
                        snippet_lines.push(l);
                        depth += l.chars().filter(|&c| c == '{').count() as i32;
                        depth -= l.chars().filter(|&c| c == '}').count() as i32;
                        if depth <= 0 && j > i {
                            break;
                        }
                        j += 1;
                    }

                    let snippet = snippet_lines.join("\n");
                    if is_valid_snippet(&snippet) {
                        snippets.push(snippet);
                    }
                    i = j + 1;
                } else {
                    i += 1;
                }
            }
            BlockStyle::Indentation(patterns) => {
                if patterns.iter().any(|p| trimmed.starts_with(p)) {
                    let base_indent = lines[i].len() - lines[i].trim_start().len();
                    let mut snippet_lines = vec![lines[i]];
                    let mut j = i + 1;

                    while j < lines.len() && snippet_lines.len() < 30 {
                        let l = lines[j];
                        if l.trim().is_empty() {
                            snippet_lines.push(l);
                            j += 1;
                            continue;
                        }
                        let indent = l.len() - l.trim_start().len();
                        if indent > base_indent {
                            snippet_lines.push(l);
                            j += 1;
                        } else {
                            break;
                        }
                    }

                    while snippet_lines.last().map_or(false, |l| l.trim().is_empty()) {
                        snippet_lines.pop();
                    }

                    let snippet = snippet_lines.join("\n");
                    if is_valid_snippet(&snippet) {
                        snippets.push(snippet);
                    }
                    i = j;
                } else {
                    i += 1;
                }
            }
            BlockStyle::EndDelimited(patterns) => {
                if patterns.iter().any(|p| trimmed.starts_with(p)) {
                    let base_indent = lines[i].len() - lines[i].trim_start().len();
                    let mut snippet_lines = vec![lines[i]];
                    let mut j = i + 1;

                    while j < lines.len() && snippet_lines.len() < 30 {
                        let l = lines[j];
                        snippet_lines.push(l);
                        let l_trimmed = l.trim();
                        let l_indent = l.len() - l.trim_start().len();
                        if l_trimmed == "end" && l_indent <= base_indent {
                            break;
                        }
                        j += 1;
                    }

                    let snippet = snippet_lines.join("\n");
                    if is_valid_snippet(&snippet) {
                        snippets.push(snippet);
                    }
                    i = j + 1;
                } else {
                    i += 1;
                }
            }
        }
    }

    snippets
}

/// Structural fallback: extract code blocks by structure when keywords don't
/// find enough. Captures anonymous functions, nested blocks, and other constructs.
fn structural_extract(lines: &[&str], block_style: &BlockStyle) -> Vec<String> {
    match block_style {
        BlockStyle::Braces(_) => structural_extract_braces(lines),
        BlockStyle::Indentation(_) => structural_extract_indent(lines),
        BlockStyle::EndDelimited(_) => structural_extract_end(lines),
    }
}

/// Structural extraction for brace-delimited languages.
/// Scans for lines containing `{` where brace depth transitions from low levels,
/// captures until depth returns.
fn structural_extract_braces(lines: &[&str]) -> Vec<String> {
    let mut snippets = Vec::new();
    let mut global_depth = 0i32;
    let mut i = 0;

    while i < lines.len() {
        let l = lines[i];
        let opens = l.chars().filter(|&c| c == '{').count() as i32;
        let closes = l.chars().filter(|&c| c == '}').count() as i32;
        let new_depth = global_depth + opens - closes;

        // Detect transition from depth 0→1 or 1→2 (entering a new block)
        if opens > 0 && (global_depth == 0 || global_depth == 1) && new_depth > global_depth {
            let start_depth = global_depth;
            let mut snippet_lines = Vec::new();
            let mut depth = global_depth;
            let mut j = i;

            while j < lines.len() && snippet_lines.len() < 30 {
                let sl = lines[j];
                snippet_lines.push(sl);
                depth += sl.chars().filter(|&c| c == '{').count() as i32;
                depth -= sl.chars().filter(|&c| c == '}').count() as i32;
                if depth <= start_depth && j > i {
                    break;
                }
                j += 1;
            }

            let snippet = snippet_lines.join("\n");
            if is_valid_snippet(&snippet) {
                snippets.push(snippet);
            }
            // Continue from after the block
            global_depth = depth;
            i = j + 1;
        } else {
            global_depth = new_depth;
            i += 1;
        }
    }

    snippets
}

/// Structural extraction for indentation-based languages.
/// Captures top-level non-blank lines followed by indented blocks.
fn structural_extract_indent(lines: &[&str]) -> Vec<String> {
    let mut snippets = Vec::new();
    let mut i = 0;

    while i < lines.len() {
        let l = lines[i];
        if l.trim().is_empty() {
            i += 1;
            continue;
        }

        let base_indent = l.len() - l.trim_start().len();
        // Only consider top-level or near-top-level lines (indent 0 or 4)
        if base_indent > 4 {
            i += 1;
            continue;
        }

        // Check if next non-blank line is indented more
        let mut has_body = false;
        let mut peek = i + 1;
        while peek < lines.len() {
            if lines[peek].trim().is_empty() {
                peek += 1;
                continue;
            }
            let peek_indent = lines[peek].len() - lines[peek].trim_start().len();
            has_body = peek_indent > base_indent;
            break;
        }

        if !has_body {
            i += 1;
            continue;
        }

        let mut snippet_lines = vec![lines[i]];
        let mut j = i + 1;

        while j < lines.len() && snippet_lines.len() < 30 {
            let sl = lines[j];
            if sl.trim().is_empty() {
                snippet_lines.push(sl);
                j += 1;
                continue;
            }
            let indent = sl.len() - sl.trim_start().len();
            if indent > base_indent {
                snippet_lines.push(sl);
                j += 1;
            } else {
                break;
            }
        }

        while snippet_lines
            .last()
            .map_or(false, |sl| sl.trim().is_empty())
        {
            snippet_lines.pop();
        }

        let snippet = snippet_lines.join("\n");
        if is_valid_snippet(&snippet) {
            snippets.push(snippet);
        }
        i = j;
    }

    snippets
}

/// Structural extraction for end-delimited languages (Ruby, Lua, Elixir).
/// Captures top-level lines followed by body ending with `end`.
fn structural_extract_end(lines: &[&str]) -> Vec<String> {
    let mut snippets = Vec::new();
    let mut i = 0;

    while i < lines.len() {
        let l = lines[i];
        if l.trim().is_empty() {
            i += 1;
            continue;
        }

        let base_indent = l.len() - l.trim_start().len();
        // Only consider top-level or near-top-level lines
        if base_indent > 4 {
            i += 1;
            continue;
        }

        // Look ahead for a matching `end` at same or lesser indent
        let mut snippet_lines = vec![lines[i]];
        let mut j = i + 1;
        let mut found_end = false;

        while j < lines.len() && snippet_lines.len() < 30 {
            let sl = lines[j];
            snippet_lines.push(sl);
            let sl_trimmed = sl.trim();
            let sl_indent = sl.len() - sl.trim_start().len();
            if sl_trimmed == "end" && sl_indent <= base_indent {
                found_end = true;
                break;
            }
            j += 1;
        }

        if found_end {
            let snippet = snippet_lines.join("\n");
            if is_valid_snippet(&snippet) {
                snippets.push(snippet);
            }
            i = j + 1;
        } else {
            i += 1;
        }
    }

    snippets
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_raw_string_snippets_preserved() {
        // Verify rust snippet content is correct after raw string conversion
        let snippets = CodeSyntaxGenerator::rust_snippets();
        let main_snippet = snippets[0];
        assert!(main_snippet.contains("fn main()"));
        assert!(main_snippet.contains("println!"));
        assert!(main_snippet.contains('\n'));
        assert_eq!(main_snippet.matches('{').count(), 1);
        assert_eq!(main_snippet.matches('}').count(), 1);

        // Verify Python indentation preserved
        let py_snippets = CodeSyntaxGenerator::python_snippets();
        let class_snippet = py_snippets[3]; // class Point
        assert!(class_snippet.contains("class Point:"));
        assert!(class_snippet.contains("    def __init__"));
        assert!(class_snippet.contains("        self.x = x"));

        // Verify Go tabs preserved
        let go_snippets = CodeSyntaxGenerator::go_snippets();
        let main_go = go_snippets[0];
        assert!(main_go.contains('\t'));
        assert!(main_go.contains("fmt.Println"));

        // Verify JavaScript content
        let js_snippets = CodeSyntaxGenerator::javascript_snippets();
        assert!(js_snippets[1].contains("function add"));
    }

    #[test]
    fn test_snippet_counts_unchanged() {
        assert_eq!(CodeSyntaxGenerator::rust_snippets().len(), 30);
        assert_eq!(CodeSyntaxGenerator::python_snippets().len(), 25);
        assert_eq!(CodeSyntaxGenerator::javascript_snippets().len(), 23);
        assert_eq!(CodeSyntaxGenerator::go_snippets().len(), 20);
        assert_eq!(CodeSyntaxGenerator::typescript_snippets().len(), 12);
        assert_eq!(CodeSyntaxGenerator::java_snippets().len(), 12);
        assert_eq!(CodeSyntaxGenerator::c_snippets().len(), 12);
        assert_eq!(CodeSyntaxGenerator::cpp_snippets().len(), 12);
        assert_eq!(CodeSyntaxGenerator::ruby_snippets().len(), 12);
        assert_eq!(CodeSyntaxGenerator::swift_snippets().len(), 12);
        assert_eq!(CodeSyntaxGenerator::bash_snippets().len(), 12);
        assert_eq!(CodeSyntaxGenerator::lua_snippets().len(), 12);
    }

    #[test]
    fn test_languages_with_content_includes_builtin() {
        let langs = languages_with_content("/nonexistent/path");
        assert!(langs.contains(&"rust"));
        assert!(langs.contains(&"python"));
        assert!(langs.contains(&"javascript"));
        assert!(langs.contains(&"go"));
        assert!(langs.contains(&"typescript"));
        assert!(langs.contains(&"java"));
        assert!(langs.contains(&"c"));
        assert!(langs.contains(&"cpp"));
        assert!(langs.contains(&"ruby"));
        assert!(langs.contains(&"swift"));
        assert!(langs.contains(&"bash"));
        assert!(langs.contains(&"lua"));
        // Network-only languages should NOT appear without cache
        assert!(!langs.contains(&"kotlin"));
        assert!(!langs.contains(&"scala"));
    }

    #[test]
    fn test_code_language_options() {
        let options = code_language_options();
        assert!(options.iter().any(|(k, _)| *k == "rust"));
        assert!(options.iter().any(|(k, _)| *k == "all"));
        assert_eq!(options.first().unwrap().0, "all");
        assert_eq!(options.first().unwrap().1, "All (random)");
    }

    #[test]
    fn test_code_language_options_sorted_after_all() {
        let options = code_language_options();
        assert!(!options.is_empty());
        assert_eq!(options[0].0, "all");
        for i in 1..options.len().saturating_sub(1) {
            let a = options[i].1.to_lowercase();
            let b = options[i + 1].1.to_lowercase();
            assert!(
                a <= b,
                "Language options are not sorted at index {i}: '{}' > '{}'",
                options[i].1,
                options[i + 1].1
            );
        }
    }

    #[test]
    fn test_language_by_key() {
        assert!(language_by_key("rust").is_some());
        assert_eq!(language_by_key("rust").unwrap().display_name, "Rust");
        assert!(language_by_key("nonexistent").is_none());
    }

    #[test]
    fn test_is_language_cached_empty_dir() {
        assert!(!is_language_cached("/nonexistent/path", "rust"));
    }

    #[test]
    fn test_config_code_language_options_valid() {
        let options = code_language_options();
        let keys: Vec<&str> = options.iter().map(|(k, _)| *k).collect();
        // All CODE_LANGUAGES keys should appear
        for lang in CODE_LANGUAGES {
            assert!(keys.contains(&lang.key), "Missing key: {}", lang.key);
        }
    }

    #[test]
    fn test_build_download_queue_single_language() {
        // With a nonexistent cache dir, all repos should be queued
        let queue = build_code_download_queue("rust", "/nonexistent/cache/dir");
        let rust_lang = language_by_key("rust").unwrap();
        assert_eq!(queue.len(), rust_lang.repos.len());
        for (lang_key, _) in &queue {
            assert_eq!(lang_key, "rust");
        }
    }

    #[test]
    fn test_build_download_queue_all_languages() {
        let queue = build_code_download_queue("all", "/nonexistent/cache/dir");
        // Should include repos from every language
        let total_repos: usize = CODE_LANGUAGES.iter().map(|l| l.repos.len()).sum();
        assert_eq!(queue.len(), total_repos);
        // Should include items from multiple languages
        let unique_langs: std::collections::HashSet<&str> =
            queue.iter().map(|(k, _)| k.as_str()).collect();
        assert!(unique_langs.len() > 1);
    }

    #[test]
    fn test_build_download_queue_invalid_language() {
        let queue = build_code_download_queue("nonexistent_lang", "/nonexistent/cache/dir");
        assert!(queue.is_empty());
    }

    #[test]
    fn test_build_download_queue_skips_cached() {
        // Create a temp dir with a cached file for one rust repo
        let tmp = std::env::temp_dir().join("keydr_test_queue_cache");
        let _ = fs::create_dir_all(&tmp);
        let rust_lang = language_by_key("rust").unwrap();
        let first_repo = &rust_lang.repos[0];
        let cache_file = tmp.join(format!("rust_{}.txt", first_repo.key));
        fs::write(&cache_file, "some cached content").unwrap();

        let queue = build_code_download_queue("rust", tmp.to_str().unwrap());
        // Should NOT include the cached repo
        assert!(
            !queue.iter().any(|(_, idx)| *idx == 0),
            "Cached repo should be skipped"
        );
        // Should still include other uncached repos
        assert_eq!(queue.len(), rust_lang.repos.len() - 1);

        // Cleanup
        let _ = fs::remove_dir_all(&tmp);
    }

    #[test]
    fn test_build_download_queue_empty_cache_file_not_skipped() {
        // An empty cache file should still be queued (treated as uncached)
        let tmp = std::env::temp_dir().join("keydr_test_queue_empty");
        let _ = fs::create_dir_all(&tmp);
        let rust_lang = language_by_key("rust").unwrap();
        let first_repo = &rust_lang.repos[0];
        let cache_file = tmp.join(format!("rust_{}.txt", first_repo.key));
        fs::write(&cache_file, "").unwrap();

        let queue = build_code_download_queue("rust", tmp.to_str().unwrap());
        // Empty file should still be in queue
        assert_eq!(queue.len(), rust_lang.repos.len());

        let _ = fs::remove_dir_all(&tmp);
    }

    #[test]
    fn test_extract_braces_style() {
        let source = r#"fn hello() {
    println!("hello");
    println!("world");
}

fn other() {
    let x = 1;
    let y = 2;
}
"#;
        let style = BlockStyle::Braces(&["fn "]);
        let snippets = extract_code_snippets(source, &style);
        assert_eq!(snippets.len(), 2);
        assert!(snippets[0].contains("hello"));
        assert!(snippets[1].contains("other"));
    }

    #[test]
    fn test_extract_indentation_style() {
        let source = r#"def greet(name):
    msg = "Hello, " + name
    print(msg)
    return msg

x = 42

def add(a, b):
    result = a + b
    return result
"#;
        let style = BlockStyle::Indentation(&["def "]);
        let snippets = extract_code_snippets(source, &style);
        assert_eq!(snippets.len(), 2);
        assert!(snippets[0].contains("greet"));
        assert!(snippets[1].contains("add"));
    }

    #[test]
    fn test_extract_end_delimited_style() {
        let source = r#"def fibonacci(n)
  return n if n <= 1
  fibonacci(n - 1) + fibonacci(n - 2)
end

def hello
  puts "hello"
  puts "world"
end
"#;
        let style = BlockStyle::EndDelimited(&["def "]);
        let snippets = extract_code_snippets(source, &style);
        assert_eq!(snippets.len(), 2);
        assert!(snippets[0].contains("fibonacci"));
        assert!(snippets[1].contains("hello"));
    }

    #[test]
    fn test_extract_rejects_short_snippets() {
        let source = r#"fn a() {
    x
}
"#;
        let style = BlockStyle::Braces(&["fn "]);
        let snippets = extract_code_snippets(source, &style);
        // 3 lines but < 20 non-whitespace chars
        assert_eq!(snippets.len(), 0);
    }

    #[test]
    fn test_extract_indentation_with_blank_lines() {
        let source = r#"def complex():
    x = 1

    y = 2

    return x + y + 42 + 100

z = 99
"#;
        let style = BlockStyle::Indentation(&["def "]);
        let snippets = extract_code_snippets(source, &style);
        assert_eq!(snippets.len(), 1);
        assert!(snippets[0].contains("x = 1"));
        assert!(snippets[0].contains("y = 2"));
        assert!(snippets[0].contains("return"));
    }

    #[test]
    fn test_total_language_count() {
        // 12 built-in + 18 network-only = 30
        assert_eq!(CODE_LANGUAGES.len(), 30);
        let builtin_count = CODE_LANGUAGES.iter().filter(|l| l.has_builtin).count();
        assert_eq!(builtin_count, 12);
        let network_count = CODE_LANGUAGES.iter().filter(|l| !l.has_builtin).count();
        assert_eq!(network_count, 18);
    }

    #[test]
    fn test_fit_snippet_to_target_trims_large_snippet() {
        let snippet = "line one words here\nline two words here\nline three words here\nline four words here\nline five words here";
        let fitted = fit_snippet_to_target(snippet, 6);
        assert!(approx_token_count(&fitted) <= 9); // 1.5x target
        assert!(fitted.lines().count() >= 2);
    }

    /// Fetches every repo URL for all languages, runs extraction, and prints
    /// a summary with example snippets. Run with:
    ///   cargo test --features network test_verify_repo_urls -- --ignored --nocapture
    #[test]
    #[ignore]
    fn test_verify_repo_urls() {
        use crate::generator::cache::fetch_url;

        let mut total_ok = 0usize;
        let mut total_fail = 0usize;
        let mut langs_with_no_snippets: Vec<&str> = Vec::new();

        for lang in CODE_LANGUAGES {
            println!("\n{}", "=".repeat(60));
            println!("Language: {} ({})", lang.display_name, lang.key);
            println!("  Built-in: {}", lang.has_builtin);
            println!("  Repos: {}", lang.repos.len());

            let mut lang_total_snippets = 0usize;

            for repo in lang.repos {
                println!("\n  Repo: {}", repo.key);

                for url in repo.urls {
                    let short_url = if url.len() > 80 {
                        format!("{}...", &url[..77])
                    } else {
                        url.to_string()
                    };

                    match fetch_url(url) {
                        Some(content) => {
                            let lines = content.lines().count();
                            let bytes = content.len();
                            println!("    OK  {short_url}");
                            println!("        ({lines} lines, {bytes} bytes)");
                            total_ok += 1;

                            let snippets = extract_code_snippets(&content, &lang.block_style);
                            println!("        Extracted {} snippets", snippets.len());
                            lang_total_snippets += snippets.len();

                            // Show first 2 snippets (truncated)
                            for (si, snippet) in snippets.iter().take(2).enumerate() {
                                let preview: String =
                                    snippet.lines().take(5).collect::<Vec<_>>().join("\n");
                                let suffix = if snippet.lines().count() > 5 {
                                    "\n            ..."
                                } else {
                                    ""
                                };
                                let indented: String = preview
                                    .lines()
                                    .map(|l| format!("            {l}"))
                                    .collect::<Vec<_>>()
                                    .join("\n");
                                println!(
                                    "        --- snippet {} ---\n{}{}",
                                    si + 1,
                                    indented,
                                    suffix,
                                );
                            }
                        }
                        None => {
                            println!("    FAIL {short_url}");
                            total_fail += 1;
                        }
                    }
                }
            }

            println!(
                "\n  TOTAL for {}: {} snippets",
                lang.key, lang_total_snippets
            );
            if lang_total_snippets == 0 && !lang.repos.is_empty() {
                langs_with_no_snippets.push(lang.key);
            }
        }

        println!("\n{}", "=".repeat(60));
        println!("SUMMARY");
        println!("  URLs fetched OK:   {total_ok}");
        println!("  URLs failed:       {total_fail}");
        println!(
            "  Languages with 0 extracted snippets: {:?}",
            langs_with_no_snippets
        );

        if total_fail > 0 {
            println!("\nWARNING: {total_fail} URL(s) failed to fetch");
        }
        if !langs_with_no_snippets.is_empty() {
            println!(
                "\nWARNING: {} language(s) produced 0 snippets from downloads",
                langs_with_no_snippets.len()
            );
        }
    }

    #[test]
    fn test_all_languages_have_extraction_patterns() {
        for lang in CODE_LANGUAGES {
            let pattern_count = match &lang.block_style {
                BlockStyle::Braces(pats) => pats.len(),
                BlockStyle::Indentation(pats) => pats.len(),
                BlockStyle::EndDelimited(pats) => pats.len(),
            };
            assert!(
                pattern_count > 0,
                "Language '{}' has empty extraction patterns — downloads will never yield snippets",
                lang.key
            );
        }
    }
}
