-- exact match by file name
local icons_by_filename = {
  [".babelrc"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "Babelrc",
  },
  [".bash_profile"] = {
    icon = "",
    color = "#89e051",
    cterm_color = "113",
    name = "BashProfile",
  },
  [".bashrc"] = {
    icon = "",
    color = "#89e051",
    cterm_color = "113",
    name = "Bashrc",
  },
  [".ds_store"] = {
    icon = "",
    color = "#41535b",
    cterm_color = "239",
    name = "DsStore",
  },
  [".eslintrc"] = {
    icon = "",
    color = "#4b32c3",
    cterm_color = "56",
    name = "Eslintrc",
  },
  [".gitattributes"] = {
    icon = "",
    color = "#41535b",
    cterm_color = "239",
    name = "GitAttributes",
  },
  [".gitconfig"] = {
    icon = "",
    color = "#41535b",
    cterm_color = "239",
    name = "GitConfig",
  },
  [".gitignore"] = {
    icon = "",
    color = "#41535b",
    cterm_color = "239",
    name = "GitIgnore",
  },
  [".gitlab-ci.yml"] = {
    icon = "",
    color = "#e24329",
    cterm_color = "196",
    name = "GitlabCI",
  },
  [".gitmodules"] = {
    icon = "",
    color = "#41535b",
    cterm_color = "239",
    name = "GitModules",
  },
  [".gvimrc"] = {
    icon = "",
    color = "#019833",
    cterm_color = "28",
    name = "Gvimrc",
  },
  [".npmignore"] = {
    icon = "",
    color = "#E8274B",
    cterm_color = "197",
    name = "NPMIgnore",
  },
  [".npmrc"] = {
    icon = "",
    color = "#E8274B",
    cterm_color = "197",
    name = "NPMrc",
  },
  [".settings.json"] = {
    icon = "",
    color = "#854CC7",
    cterm_color = "98",
    name = "SettingsJson",
  },
  [".vimrc"] = {
    icon = "",
    color = "#019833",
    cterm_color = "28",
    name = "Vimrc",
  },
  [".zprofile"] = {
    icon = "",
    color = "#89e051",
    cterm_color = "113",
    name = "Zshprofile",
  },
  [".zshenv"] = {
    icon = "",
    color = "#89e051",
    cterm_color = "113",
    name = "Zshenv",
  },
  [".zshrc"] = {
    icon = "",
    color = "#89e051",
    cterm_color = "113",
    name = "Zshrc",
  },
  ["brewfile"] = {
    icon = "",
    color = "#701516",
    cterm_color = "52",
    name = "Brewfile",
  },
  ["cmakelists.txt"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "CMakeLists",
  },
  ["commit_editmsg"] = {
    icon = "",
    color = "#41535b",
    cterm_color = "239",
    name = "GitCommit",
  },
  ["containerfile"] = {
    icon = "󰡨",
    color = "#458ee6",
    cterm_color = "68",
    name = "Dockerfile",
  },
  ["copying"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "License",
  },
  ["copying.lesser"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "License",
  },
  ["docker-compose.yml"] = {
    icon = "󰡨",
    color = "#458ee6",
    cterm_color = "68",
    name = "Dockerfile",
  },
  ["docker-compose.yaml"] = {
    icon = "󰡨",
    color = "#458ee6",
    cterm_color = "68",
    name = "Dockerfile",
  },
  [".dockerignore"] = {
    icon = "󰡨",
    color = "#458ee6",
    cterm_color = "68",
    name = "Dockerfile",
  },
  ["gemfile$"] = {
    icon = "",
    color = "#701516",
    cterm_color = "52",
    name = "Gemfile",
  },
  ["license"] = {
    icon = "",
    color = "#d0bf41",
    cterm_color = "185",
    name = "License",
  },
  ["r"] = {
    icon = "󰟔",
    color = "#358a5b",
    cterm_color = "29",
    name = "R",
  },
  ["rmd"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Rmd",
  },
  ["vagrantfile$"] = {
    icon = "",
    color = "#1563FF",
    cterm_color = "27",
    name = "Vagrantfile",
  },
  ["_gvimrc"] = {
    icon = "",
    color = "#019833",
    cterm_color = "28",
    name = "Gvimrc",
  },
  ["_vimrc"] = {
    icon = "",
    color = "#019833",
    cterm_color = "28",
    name = "Vimrc",
  },
  ["package.json"] = {
    icon = "",
    color = "#e8274b",
    name = "PackageJson",
  },
  ["package-lock.json"] = {
    icon = "",
    color = "#7a0d21",
    name = "PackageLockJson",
  },
  ["node_modules"] = {
    icon = "",
    color = "#E8274B",
    cterm_color = "197",
    name = "NodeModules",
  },
  ["favicon.ico"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "Favicon",
  },
  ["gnumakefile"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "Makefile",
  },
  ["makefile"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "Makefile",
  },
  ["mix.lock"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "MixLock",
  },
  [".env"] = {
    icon = "",
    color = "#faf743",
    cterm_color = "227",
    name = "Env",
  },
  ["gruntfile"] = {
    icon = "",
    color = "#e37933",
    cterm_color = "166",
    name = "Gruntfile",
  },
  ["gulpfile"] = {
    icon = "",
    color = "#cc3e44",
    cterm_color = "167",
    name = "Gulpfile",
  },
  ["webpack"] = {
    icon = "󰜫",
    color = "#519aba",
    cterm_color = "74",
    name = "Webpack",
  },
  ["rakefile"] = {
    icon = "",
    color = "#701516",
    cterm_color = "52",
    name = "Rakefile",
  },
  ["procfile"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Procfile",
  },
  ["dockerfile"] = {
    icon = "󰡨",
    color = "#458ee6",
    cterm_color = "68",
    name = "Dockerfile",
  },
  ["build"] = {
    icon = "",
    color = "#89e051",
    cterm_color = "113",
    name = "BazelBuild",
  },
  ["workspace"] = {
    icon = "",
    color = "#89e051",
    cterm_color = "113",
    name = "BazelWorkspace",
  },
  ["unlicense"] = {
    icon = "",
    color = "#d0bf41",
    cterm_color = "185",
    name = "License",
  },
}

-- fuzzy match by extension
local icons_by_file_extension = {
  ["ai"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "Ai",
  },
  ["awk"] = {
    icon = "",
    color = "#4d5a5e",
    cterm_color = "240",
    name = "Awk",
  },
  ["bash"] = {
    icon = "",
    color = "#89e051",
    cterm_color = "113",
    name = "Bash",
  },
  ["bat"] = {
    icon = "",
    color = "#C1F12E",
    cterm_color = "191",
    name = "Bat",
  },
  ["bazel"] = {
    icon = "",
    color = "#89e051",
    cterm_color = "113",
    name = "Bazel",
  },
  ["bzl"] = {
    icon = "",
    color = "#89e051",
    cterm_color = "113",
    name = "Bzl",
  },
  ["bmp"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Bmp",
  },
  ["c"] = {
    icon = "",
    color = "#599eff",
    cterm_color = "111",
    name = "C",
  },
  ["c++"] = {
    icon = "",
    color = "#f34b7d",
    cterm_color = "204",
    name = "CPlusPlus",
  },
  ["cbl"] = {
    icon = "⚙",
    color = "#005ca5",
    cterm_color = "25",
    name = "Cobol",
  },
  ["cc"] = {
    icon = "",
    color = "#f34b7d",
    cterm_color = "204",
    name = "CPlusPlus",
  },
  ["cfg"] = {
    icon = "",
    color = "#ECECEC",
    cterm_color = "255",
    name = "Configuration",
  },
  ["cjs"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "Cjs",
  },
  ["clj"] = {
    icon = "",
    color = "#8dc149",
    cterm_color = "113",
    name = "Clojure",
  },
  ["cljc"] = {
    icon = "",
    color = "#8dc149",
    cterm_color = "113",
    name = "ClojureC",
  },
  ["cljs"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "ClojureJS",
  },
  ["cljd"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "ClojureDart",
  },
  ["cmake"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "CMake",
  },
  ["cob"] = {
    icon = "⚙",
    color = "#005ca5",
    cterm_color = "25",
    name = "Cobol",
  },
  ["cobol"] = {
    icon = "⚙",
    color = "#005ca5",
    cterm_color = "25",
    name = "Cobol",
  },
  ["coffee"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "Coffee",
  },
  ["conf"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "Conf",
  },
  ["config.ru"] = {
    icon = "",
    color = "#701516",
    cterm_color = "52",
    name = "ConfigRu",
  },
  ["cp"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Cp",
  },
  ["cpp"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Cpp",
  },
  ["cpy"] = {
    icon = "⚙",
    color = "#005ca5",
    cterm_color = "25",
    name = "Cobol",
  },
  ["cr"] = {
    icon = "",
    color = "#c8c8c8",
    cterm_color = "251",
    name = "Crystal",
  },
  ["cs"] = {
    icon = "󰌛",
    color = "#596706",
    cterm_color = "58",
    name = "Cs",
  },
  ["csh"] = {
    icon = "",
    color = "#4d5a5e",
    cterm_color = "240",
    name = "Csh",
  },
  ["cson"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "Cson",
  },
  ["css"] = {
    icon = "",
    color = "#42a5f5",
    cterm_color = "75",
    name = "Css",
  },
  ["csv"] = {
    icon = "󰈙",
    color = "#89e051",
    cterm_color = "113",
    name = "Csv",
  },
  ["cxx"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Cxx",
  },
  ["d"] = {
    icon = "",
    color = "#427819",
    cterm_color = "28",
    name = "D",
  },
  ["dart"] = {
    icon = "",
    color = "#03589C",
    cterm_color = "25",
    name = "Dart",
  },
  ["db"] = {
    icon = "",
    color = "#dad8d8",
    cterm_color = "188",
    name = "Db",
  },
  ["desktop"] = {
    icon = "",
    color = "#563d7c",
    cterm_color = "54",
    name = "DesktopEntry",
  },
  ["diff"] = {
    icon = "",
    color = "#41535b",
    cterm_color = "239",
    name = "Diff",
  },
  ["doc"] = {
    icon = "󰈬",
    color = "#185abd",
    cterm_color = "26",
    name = "Doc",
  },
  ["docx"] = {
    icon = "󰈬",
    color = "#185abd",
    cterm_color = "26",
    name = "Docx",
  },
  ["drl"] = {
    icon = "",
    color = "#ffafaf",
    cterm_color = "217",
    name = "Drools",
  },
  ["dropbox"] = {
    icon = "",
    color = "#0061FE",
    cterm_color = "27",
    name = "Dropbox",
  },
  ["dump"] = {
    icon = "",
    color = "#dad8d8",
    cterm_color = "188",
    name = "Dump",
  },
  ["edn"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Edn",
  },
  ["eex"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Eex",
  },
  ["ejs"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "Ejs",
  },
  ["elm"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Elm",
  },
  ["epp"] = {
    icon = "",
    color = "#FFA61A",
    name = "Epp",
  },
  ["erb"] = {
    icon = "",
    color = "#701516",
    cterm_color = "214",
    name = "Erb",
  },
  ["erl"] = {
    icon = "",
    color = "#B83998",
    cterm_color = "163",
    name = "Erl",
  },
  ["ex"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Ex",
  },
  ["exs"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Exs",
  },
  ["f#"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Fsharp",
  },
  ["f90"] = {
    icon = "󱈚",
    color = "#734f96",
    cterm_color = "97",
    name = "Fortran",
  },
  ["fnl"] = {
    color = "#fff3d7",
    icon = "🌜",
    cterm_color = "230",
    name = "Fennel",
  },
  ["fish"] = {
    icon = "",
    color = "#4d5a5e",
    cterm_color = "240",
    name = "Fish",
  },
  ["fs"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Fs",
  },
  ["fsi"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Fsi",
  },
  ["fsscript"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Fsscript",
  },
  ["fsx"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Fsx",
  },
  ["gd"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "GDScript",
  },
  ["gemspec"] = {
    icon = "",
    color = "#701516",
    cterm_color = "52",
    name = "Gemspec",
  },
  ["gif"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Gif",
  },
  ["git"] = {
    icon = "",
    color = "#F14C28",
    cterm_color = "196",
    name = "GitLogo",
  },
  ["glb"] = {
    icon = "",
    color = "#FFB13B",
    cterm_color = "214",
    name = "BinaryGLTF",
  },
  ["go"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Go",
  },
  ["godot"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "GodotProject",
  },
  ["graphql"] = {
    icon = "",
    color = "#e535ab",
    cterm_color = "199",
    name = "GraphQL",
  },
  ["gql"] = {
    icon = "",
    color = "#e535ab",
    cterm_color = "199",
    name = "GraphQL",
  },
  ["h"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "H",
  },
  ["haml"] = {
    icon = "",
    color = "#eaeae1",
    cterm_color = "255",
    name = "Haml",
  },
  ["hbs"] = {
    icon = "",
    color = "#f0772b",
    cterm_color = "202",
    name = "Hbs",
  },
  ["heex"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Heex",
  },
  ["hh"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Hh",
  },
  ["hpp"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Hpp",
  },
  ["hrl"] = {
    icon = "",
    color = "#B83998",
    cterm_color = "163",
    name = "Hrl",
  },
  ["hs"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Hs",
  },
  ["htm"] = {
    icon = "",
    color = "#e34c26",
    cterm_color = "196",
    name = "Htm",
  },
  ["html"] = {
    icon = "",
    color = "#e44d26",
    cterm_color = "196",
    name = "Html",
  },
  ["hxx"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Hxx",
  },
  ["ico"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "Ico",
  },
  ["import"] = {
    icon = "",
    color = "#ECECEC",
    cterm_color = "255",
    name = "ImportConfiguration",
  },
  ["ini"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "Ini",
  },
  ["java"] = {
    icon = "",
    color = "#cc3e44",
    cterm_color = "167",
    name = "Java",
  },
  ["jl"] = {
    icon = "",
    color = "#a270ba",
    cterm_color = "133",
    name = "Jl",
  },
  ["jpeg"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Jpeg",
  },
  ["jpg"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Jpg",
  },
  ["js"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "Js",
  },
  ["test.js"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "TestJs",
  },
  ["spec.js"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "SpecJs",
  },
  ["json"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "Json",
  },
  ["json5"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "Json5",
  },
  ["jsx"] = {
    icon = "",
    color = "#20c2e3",
    cterm_color = "45",
    name = "Jsx",
  },
  ["test.jsx"] = {
    icon = "",
    color = "#20c2e3",
    cterm_color = "45",
    name = "JavaScriptReactTest",
  },
  ["spec.jsx"] = {
    icon = "",
    color = "#20c2e3",
    cterm_color = "45",
    name = "JavaScriptReactSpec",
  },
  ["ksh"] = {
    icon = "",
    color = "#4d5a5e",
    cterm_color = "240",
    name = "Ksh",
  },
  ["kt"] = {
    icon = "",
    color = "#7F52FF",
    cterm_color = "99",
    name = "Kotlin",
  },
  ["kts"] = {
    icon = "",
    color = "#7F52FF",
    cterm_color = "99",
    name = "KotlinScript",
  },
  ["leex"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Leex",
  },
  ["less"] = {
    icon = "",
    color = "#563d7c",
    cterm_color = "54",
    name = "Less",
  },
  ["lhs"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Lhs",
  },
  ["license"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "License",
  },
  ["lua"] = {
    icon = "",
    color = "#51a0cf",
    cterm_color = "74",
    name = "Lua",
  },
  ["luau"] = {
    icon = "",
    color = "#51a0cf",
    cterm_color = "74",
    name = "Luau",
  },
  ["gnumakefile"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "Makefile",
  },
  ["makefile"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "Makefile",
  },
  ["mk"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "Makefile",
  },
  ["markdown"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Markdown",
  },
  ["material"] = {
    icon = "󰔉",
    color = "#B83998",
    cterm_color = "163",
    name = "Material",
  },
  ["md"] = {
    icon = "",
    color = "#ffffff",
    cterm_color = "231",
    name = "Md",
  },
  ["mdx"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Mdx",
  },
  ["mint"] = {
    icon = "󰌪",
    color = "#87c095",
    cterm_color = "108",
    name = "Mint",
  },
  ["mjs"] = {
    icon = "",
    color = "#f1e05a",
    cterm_color = "185",
    name = "Mjs",
  },
  ["ml"] = {
    icon = "λ",
    color = "#e37933",
    cterm_color = "166",
    name = "Ml",
  },
  ["mli"] = {
    icon = "λ",
    color = "#e37933",
    cterm_color = "166",
    name = "Mli",
  },
  ["mo"] = {
    icon = "∞",
    color = "#9772FB",
    cterm_color = "135",
    name = "Motoko",
  },
  ["mustache"] = {
    icon = "",
    color = "#e37933",
    cterm_color = "166",
    name = "Mustache",
  },
  ["nim"] = {
    icon = "",
    color = "#f3d400",
    cterm_color = "220",
    name = "Nim",
  },
  ["nix"] = {
    icon = "",
    color = "#7ebae4",
    cterm_color = "110",
    name = "Nix",
  },
  ["opus"] = {
    icon = "󰈣",
    color = "#F88A02",
    cterm_color = "208",
    name = "OPUS",
  },
  ["org"] = {
    icon = "",
    color = "#77AA99",
    cterm_color = "73",
    name = "OrgMode",
  },
  ["otf"] = {
    icon = "",
    color = "#ECECEC",
    cterm_color = "255",
    name = "OpenTypeFont",
  },
  ["pck"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "PackedResource",
  },
  ["pdf"] = {
    icon = "",
    color = "#b30b00",
    cterm_color = "124",
    name = "Pdf",
  },
  ["php"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Php",
  },
  ["pl"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Pl",
  },
  ["pm"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Pm",
  },
  ["png"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Png",
  },
  ["pp"] = {
    icon = "",
    color = "#FFA61A",
    name = "Pp",
  },
  ["ppt"] = {
    icon = "󰈧",
    color = "#cb4a32",
    cterm_color = "214",
    name = "Ppt",
  },
  ["pro"] = {
    icon = "",
    color = "#e4b854",
    cterm_color = "179",
    name = "Prolog",
  },
  ["ps1"] = {
    icon = "󰨊",
    color = "#4273ca",
    cterm_color = "68",
    name = "PsScriptfile",
  },
  ["psd1"] = {
    icon = "󰨊",
    color = "#6975c4",
    cterm_color = "68",
    name = "PsManifestfile",
  },
  ["psm1"] = {
    icon = "󰨊",
    color = "#6975c4",
    cterm_color = "68",
    name = "PsScriptModulefile",
  },
  ["psb"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Psb",
  },
  ["psd"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Psd",
  },
  ["py"] = {
    icon = "",
    color = "#ffbc03",
    cterm_color = "214",
    name = "Py",
  },
  ["pyc"] = {
    icon = "",
    color = "#ffe291",
    cterm_color = "222",
    name = "Pyc",
  },
  ["pyd"] = {
    icon = "",
    color = "#ffe291",
    cterm_color = "222",
    name = "Pyd",
  },
  ["pyo"] = {
    icon = "",
    color = "#ffe291",
    cterm_color = "222",
    name = "Pyo",
  },
  ["query"] = {
    icon = "",
    color = "#90a850",
    cterm_color = "107",
    name = "Query",
  },
  ["r"] = {
    icon = "󰟔",
    color = "#358a5b",
    cterm_color = "29",
    name = "R",
  },
  ["rake"] = {
    icon = "",
    color = "#701516",
    cterm_color = "52",
    name = "Rake",
  },
  ["rb"] = {
    icon = "",
    color = "#701516",
    cterm_color = "52",
    name = "Rb",
  },
  ["res"] = {
    icon = "",
    color = "#cc3e44",
    cterm_color = "167",
    name = "ReScript",
  },
  ["resi"] = {
    icon = "",
    color = "#f55385",
    cterm_color = "204",
    name = "ReScriptInterface",
  },
  ["rlib"] = {
    icon = "",
    color = "#dea584",
    cterm_color = "216",
    name = "Rlib",
  },
  ["rmd"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Rmd",
  },
  ["rproj"] = {
    icon = "󰗆",
    color = "#358a5b",
    cterm_color = "29",
    name = "Rproj",
  },
  ["rs"] = {
    icon = "",
    color = "#dea584",
    cterm_color = "216",
    name = "Rs",
  },
  ["rss"] = {
    icon = "",
    color = "#FB9D3B",
    cterm_color = "215",
    name = "Rss",
  },
  ["sass"] = {
    icon = "",
    color = "#f55385",
    cterm_color = "204",
    name = "Sass",
  },
  ["sbt"] = {
    icon = "",
    color = "#cc3e44",
    cterm_color = "167",
    name = "sbt",
  },
  ["scala"] = {
    icon = "",
    color = "#cc3e44",
    cterm_color = "167",
    name = "Scala",
  },
  ["scm"] = {
    icon = "󰘧",
    color = "#000000",
    cterm_color = "16",
    name = "Scheme",
  },
  ["scss"] = {
    icon = "",
    color = "#f55385",
    cterm_color = "204",
    name = "Scss",
  },
  ["sh"] = {
    icon = "",
    color = "#4d5a5e",
    cterm_color = "240",
    name = "Sh",
  },
  ["sig"] = {
    icon = "λ",
    color = "#e37933",
    cterm_color = "166",
    name = "Sig",
  },
  ["slim"] = {
    icon = "",
    color = "#e34c26",
    cterm_color = "196",
    name = "Slim",
  },
  ["sln"] = {
    icon = "",
    color = "#854CC7",
    cterm_color = "98",
    name = "Sln",
  },
  ["sml"] = {
    icon = "λ",
    color = "#e37933",
    cterm_color = "166",
    name = "Sml",
  },
  ["sql"] = {
    icon = "",
    color = "#dad8d8",
    cterm_color = "188",
    name = "Sql",
  },
  ["sqlite"] = {
    icon = "",
    color = "#dad8d8",
    cterm_color = "188",
    name = "Sql",
  },
  ["sqlite3"] = {
    icon = "",
    color = "#dad8d8",
    cterm_color = "188",
    name = "Sql",
  },
  ["styl"] = {
    icon = "",
    color = "#8dc149",
    cterm_color = "113",
    name = "Styl",
  },
  ["sublime"] = {
    icon = "",
    color = "#e37933",
    cterm_color = "166",
    name = "Suo",
  },
  ["suo"] = {
    icon = "",
    color = "#854CC7",
    cterm_color = "98",
    name = "Suo",
  },
  ["sv"] = {
    icon = "󰍛",
    color = "#019833",
    cterm_color = "28",
    name = "SystemVerilog",
  },
  ["svelte"] = {
    icon = "",
    color = "#ff3e00",
    cterm_color = "196",
    name = "Svelte",
  },
  ["svh"] = {
    icon = "󰍛",
    color = "#019833",
    cterm_color = "28",
    name = "SystemVerilog",
  },
  ["svg"] = {
    icon = "󰜡",
    color = "#FFB13B",
    cterm_color = "214",
    name = "Svg",
  },
  ["swift"] = {
    icon = "",
    color = "#e37933",
    cterm_color = "166",
    name = "Swift",
  },
  ["t"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Tor",
  },
  ["tbc"] = {
    icon = "󰛓",
    color = "#1e5cb3",
    cterm_color = "25",
    name = "Tcl",
  },
  ["tcl"] = {
    icon = "󰛓",
    color = "#1e5cb3",
    cterm_color = "25",
    name = "Tcl",
  },
  ["terminal"] = {
    icon = "",
    color = "#31B53E",
    cterm_color = "34",
    name = "Terminal",
  },
  ["tex"] = {
    icon = "󰙩",
    color = "#3D6117",
    cterm_color = "22",
    name = "Tex",
  },
  ["tf"] = {
    icon = "",
    color = "#5F43E9",
    cterm_color = "93",
    name = "Terraform",
  },
  ["tfvars"] = {
    icon = "",
    color = "#5F43E9",
    cterm_color = "93",
    name = "TFVars",
  },
  ["toml"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "Toml",
  },
  ["tres"] = {
    icon = "",
    color = "#cbcb41",
    cterm_color = "185",
    name = "TextResource",
  },
  ["ts"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "Ts",
  },
  ["test.ts"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "TestTs",
  },
  ["spec.ts"] = {
    icon = "",
    color = "#519aba",
    cterm_color = "74",
    name = "SpecTs",
  },
  ["tscn"] = {
    icon = "󰎁",
    color = "#a074c4",
    cterm_color = "140",
    name = "TextScene",
  },
  ["tsx"] = {
    icon = "",
    color = "#1354bf",
    cterm_color = "26",
    name = "Tsx",
  },
  ["test.tsx"] = {
    icon = "",
    color = "#1354bf",
    cterm_color = "26",
    name = "TypeScriptReactTest",
  },
  ["spec.tsx"] = {
    icon = "",
    color = "#1354bf",
    cterm_color = "26",
    name = "TypeScriptReactSpec",
  },
  ["twig"] = {
    icon = "",
    color = "#8dc149",
    cterm_color = "113",
    name = "Twig",
  },
  ["txt"] = {
    icon = "󰈙",
    color = "#89e051",
    cterm_color = "113",
    name = "Txt",
  },
  ["v"] = {
    icon = "󰍛",
    color = "#019833",
    cterm_color = "28",
    name = "Verilog",
  },
  ["vala"] = {
    icon = "",
    color = "#7239b3",
    cterm_color = "91",
    name = "Vala",
  },
  ["vh"] = {
    icon = "󰍛",
    color = "#019833",
    cterm_color = "28",
    name = "Verilog",
  },
  ["vhd"] = {
    icon = "󰍛",
    color = "#019833",
    cterm_color = "28",
    name = "VHDL",
  },
  ["vhdl"] = {
    icon = "󰍛",
    color = "#019833",
    cterm_color = "28",
    name = "VHDL",
  },
  ["vim"] = {
    icon = "",
    color = "#019833",
    cterm_color = "28",
    name = "Vim",
  },
  ["vue"] = {
    icon = "",
    color = "#8dc149",
    cterm_color = "113",
    name = "Vue",
  },
  ["webmanifest"] = {
    icon = "",
    color = "#f1e05a",
    cterm_color = "185",
    name = "Webmanifest",
  },
  ["webp"] = {
    icon = "",
    color = "#a074c4",
    cterm_color = "140",
    name = "Webp",
  },
  ["webpack"] = {
    icon = "󰜫",
    color = "#519aba",
    cterm_color = "74",
    name = "Webpack",
  },
  ["xcplayground"] = {
    icon = "",
    color = "#e37933",
    cterm_color = "166",
    name = "XcPlayground",
  },
  ["xls"] = {
    icon = "󰈛",
    color = "#207245",
    cterm_color = "29",
    name = "Xls",
  },
  ["xlsx"] = {
    icon = "󰈛",
    color = "#207245",
    cterm_color = "29",
    name = "Xlsx",
  },
  ["xml"] = {
    icon = "󰗀",
    color = "#e37933",
    cterm_color = "166",
    name = "Xml",
  },
  ["xul"] = {
    icon = "",
    color = "#e37933",
    cterm_color = "166",
    name = "Xul",
  },
  ["yaml"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "Yaml",
  },
  ["yml"] = {
    icon = "",
    color = "#6d8086",
    cterm_color = "66",
    name = "Yml",
  },
  ["zig"] = {
    icon = "",
    color = "#f69a1b",
    cterm_color = "172",
    name = "Zig",
  },
  ["zsh"] = {
    icon = "",
    color = "#89e051",
    cterm_color = "113",
    name = "Zsh",
  },
  ["sol"] = {
    icon = "󰞻",
    color = "#519aba",
    cterm_color = "74",
    name = "Solidity",
  },
  ["prisma"] = {
    icon = "󰔶",
    color = "#ffffff",
    cterm_color = "231",
    name = "Prisma",
  },
  ["lock"] = {
    icon = "",
    color = "#bbbbbb",
    cterm_color = "250",
    name = "Lock",
  },
  ["log"] = {
    icon = "󰌱",
    color = "#ffffff",
    cterm_color = "231",
    name = "Log",
  },
  ["wasm"] = {
    icon = "",
    color = "#5c4cdb",
    cterm_color = "62",
    name = "Wasm",
  },
  ["liquid"] = {
    icon = "",
    color = "#95BF47",
    cterm_color = "106",
    name = "Liquid",
  },
}

-- When adding new icons, remember to add an entry to the `filetypes` table, if applicable.
local icons

-- Set the current icons tables, depending on the 'background' option.
local function refresh_icons()
  local by_filename, by_file_extension
  if vim.o.background == "light" then
    by_filename = require("nvim-web-devicons-light").icons_by_filename
    by_file_extension = require("nvim-web-devicons-light").icons_by_file_extension
  else
    by_filename = icons_by_filename
    by_file_extension = icons_by_file_extension
  end
  icons = vim.tbl_extend("keep", {}, by_filename, by_file_extension)
end

-- Map of filetypes -> icon names
local filetypes = {
  ["bzl"] = "bzl",
  ["brewfile"] = "brewfile",
  ["commit"] = "commit_editmsg",
  ["copying"] = "copying",
  ["gemfile"] = "gemfile$",
  ["lesser"] = "copying.lesser",
  ["vagrantfile"] = "vagrantfile$",
  ["awk"] = "awk",
  ["bmp"] = "bmp",
  ["c"] = "c",
  ["cfg"] = "cfg",
  ["clojure"] = "clj",
  ["cmake"] = "cmake",
  ["cobol"] = "cobol",
  ["coffee"] = "coffee",
  ["conf"] = "conf",
  ["cp"] = "cp",
  ["cpp"] = "cpp",
  ["cr"] = "cr",
  ["cs"] = "cs",
  ["csh"] = "csh",
  ["cson"] = "cson",
  ["css"] = "css",
  ["csv"] = "csv",
  ["d"] = "d",
  ["dart"] = "dart",
  ["desktop"] = "desktop",
  ["diff"] = "diff",
  ["doc"] = "doc",
  ["docx"] = "docx",
  ["dockerfile"] = "dockerfile",
  ["dosbatch"] = "bat",
  ["dosini"] = "ini",
  ["drools"] = "drl",
  ["dropbox"] = "dropbox",
  ["dump"] = "dump",
  ["eex"] = "eex",
  ["ejs"] = "ejs",
  ["elixir"] = "ex",
  ["elm"] = "elm",
  ["epuppet"] = "epp",
  ["erlang"] = "erl",
  ["eruby"] = "erb",
  ["fennel"] = "fnl",
  ["fish"] = "fish",
  ["forth"] = "fs",
  ["fortran"] = "f90",
  ["fsharp"] = "f#",
  ["fsi"] = "fsi",
  ["fsscript"] = "fsscript",
  ["fsx"] = "fsx",
  ["gd"] = "gd",
  ["gif"] = "gif",
  ["git"] = "git",
  ["gitconfig"] = ".gitconfig",
  ["gitcommit"] = "commit_editmsg",
  ["gitignore"] = ".gitignore",
  ["gitattributes"] = ".gitattributes",
  ["glb"] = "glb",
  ["go"] = "go",
  ["godot"] = "godot",
  ["graphql"] = "graphql",
  ["gql"] = "gql",
  ["gruntfile"] = "gruntfile",
  ["gulpfile"] = "gulpfile",
  ["haml"] = "haml",
  ["haskell"] = "hs",
  ["hbs"] = "hbs",
  ["heex"] = "heex",
  ["html"] = "html",
  ["ico"] = "ico",
  ["idlang"] = "pro",
  ["import"] = "import",
  ["java"] = "java",
  ["javascript"] = "js",
  ["javascript.jsx"] = "jsx",
  ["javascriptreact"] = "jsx",
  ["jpeg"] = "jpeg",
  ["jpg"] = "jpg",
  ["json"] = "json",
  ["json5"] = "json5",
  ["julia"] = "jl",
  ["kotlin"] = "kt",
  ["leex"] = "leex",
  ["less"] = "less",
  ["liquid"] = "liquid",
  ["lhaskell"] = "lhs",
  ["license"] = "license",
  ["unlicense"] = "unlicense",
  ["log"] = "log",
  ["lock"] = "lock",
  ["lprolog"] = "sig",
  ["lua"] = "lua",
  ["make"] = "makefile",
  ["markdown"] = "markdown",
  ["material"] = "material",
  ["mdx"] = "mdx",
  ["mint"] = "mint",
  ["motoko"] = "mo",
  ["mustache"] = "mustache",
  ["nim"] = "nim",
  ["nix"] = "nix",
  ["node"] = "node_modules",
  ["ocaml"] = "ml",
  ["opus"] = "opus",
  ["otf"] = "otf",
  ["pck"] = "pck",
  ["pdf"] = "pdf",
  ["perl"] = "pl",
  ["php"] = "php",
  ["plaintex"] = "tex",
  ["png"] = "png",
  ["postscr"] = "ai",
  ["ppt"] = "ppt",
  ["prisma"] = "prisma",
  ["procfile"] = "procfile",
  ["prolog"] = "pro",
  ["ps1"] = "ps1",
  ["psd1"] = "psd1",
  ["psm1"] = "psm1",
  ["psb"] = "psb",
  ["psd"] = "psd",
  ["puppet"] = "pp",
  ["pyc"] = "pyc",
  ["pyd"] = "pyd",
  ["pyo"] = "pyo",
  ["python"] = "py",
  ["query"] = "query",
  ["r"] = "r",
  ["res"] = "rescript",
  ["resi"] = "rescript",
  ["rlib"] = "rlib",
  ["rmd"] = "rmd",
  ["rproj"] = "rproj",
  ["ruby"] = "rb",
  ["rust"] = "rs",
  ["sass"] = "sass",
  ["sbt"] = "sbt",
  ["scala"] = "scala",
  ["scheme"] = "scm",
  ["scss"] = "scss",
  ["sh"] = "sh",
  ["slim"] = "slim",
  ["sln"] = "sln",
  ["sml"] = "sml",
  ["solidity"] = "sol",
  ["sql"] = "sql",
  ["sqlite"] = "sqlite",
  ["sqlite3"] = "sqlite3",
  ["styl"] = "styl",
  ["sublime"] = "sublime",
  ["suo"] = "suo",
  ["svelte"] = "svelte",
  ["svg"] = "svg",
  ["swift"] = "swift",
  ["systemverilog"] = "sv",
  ["tads"] = "t",
  ["tcl"] = "tcl",
  ["terminal"] = "terminal",
  ["tex"] = "tex",
  ["toml"] = "toml",
  ["tres"] = "tres",
  ["tscn"] = "tscn",
  ["twig"] = "twig",
  ["txt"] = "txt",
  ["typescript"] = "ts",
  ["typescriptreact"] = "tsx",
  ["vala"] = "vala",
  ["verilog"] = "v",
  ["vhdl"] = "vhd",
  ["vim"] = "vim",
  ["vue"] = "vue",
  ["wasm"] = "wasm",
  ["webp"] = "webp",
  ["webpack"] = "webpack",
  ["xcplayground"] = "xcplayground",
  ["xls"] = "xls",
  ["xlsx"] = "xlsx",
  ["xml"] = "xml",
  ["yaml"] = "yaml",
  ["zig"] = "zig",
  ["zsh"] = "zsh",
}

local default_icon = {
  icon = "",
  color = "#6d8086",
  cterm_color = "66",
  name = "Default",
}

local global_opts = {
  override = {},
  strict = false,
  default = false,
  color_icons = true,
}

local function get_highlight_name(data)
  if not global_opts.color_icons then
    data = default_icon
  end

  return data.name and "DevIcon" .. data.name
end

local nvim_set_hl = vim.api.nvim_set_hl
local function set_up_highlight(icon_data)
  if not global_opts.color_icons then
    icon_data = default_icon
  end

  local hl_group = get_highlight_name(icon_data)
  if hl_group and (icon_data.color or icon_data.cterm_color) then
    nvim_set_hl(0, get_highlight_name(icon_data), {
      fg = icon_data.color,
      ctermfg = tonumber(icon_data.cterm_color),
    })
  end
end

local nvim_get_hl_by_name = vim.api.nvim_get_hl_by_name
local function highlight_exists(group)
  if not group then
    return
  end

  local ok, hl = pcall(nvim_get_hl_by_name, group, true)
  return ok and not (hl or {})[true]
end

local function set_up_highlights(allow_override)
  if not global_opts.color_icons then
    set_up_highlight(default_icon)
    return
  end

  for _, icon_data in pairs(icons) do
    local has_color = icon_data.color or icon_data.cterm_color
    local name_valid = icon_data.name
    local defined_before = highlight_exists(get_highlight_name(icon_data))
    if has_color and name_valid and (allow_override or not defined_before) then
      set_up_highlight(icon_data)
    end
  end
end

local function get_highlight_foreground(icon_data)
  if not global_opts.color_icons then
    icon_data = default_icon
  end

  return string.format("#%06x", nvim_get_hl_by_name(get_highlight_name(icon_data), true).foreground)
end

local function get_highlight_ctermfg(icon_data)
  if not global_opts.color_icons then
    icon_data = default_icon
  end

  return nvim_get_hl_by_name(get_highlight_name(icon_data), false).foreground
end

local loaded = false

local if_nil = vim.F.if_nil
local function setup(opts)
  if loaded then
    return
  end

  loaded = true

  local user_icons = opts or {}

  if user_icons.default then
    global_opts.default = true
  end

  if user_icons.strict then
    global_opts.strict = true
  end

  global_opts.color_icons = if_nil(user_icons.color_icons, global_opts.color_icons)

  if user_icons.override and user_icons.override.default_icon then
    default_icon = user_icons.override.default_icon
  end

  local user_filename_icons = user_icons.override_by_filename
  local user_file_ext_icons = user_icons.override_by_extension

  icons =
    vim.tbl_extend("force", icons, user_icons.override or {}, user_filename_icons or {}, user_file_ext_icons or {})

  if user_filename_icons then
    icons_by_filename = vim.tbl_extend("force", icons_by_filename, user_filename_icons)
  end
  if user_file_ext_icons then
    icons_by_file_extension = vim.tbl_extend("force", icons_by_file_extension, user_file_ext_icons)
  end

  table.insert(icons, default_icon)

  set_up_highlights()

  vim.api.nvim_create_autocmd("ColorScheme", {
    desc = "Re-apply icon colors after changing colorschemes",
    group = vim.api.nvim_create_augroup("NvimWebDevicons", { clear = true }),
    callback = set_up_highlights,
  })
end

local function get_default_icon()
  return default_icon
end

-- recursively iterate over each segment separated by '.' to parse extension with multiple dots in filename
local function iterate_multi_dotted_extension(name, icon_table)
  if name == nil then
    return nil
  end

  local compound_ext = name:match "%.(.*)"
  local icon = icon_table[compound_ext]
  if icon then
    return icon
  end

  return iterate_multi_dotted_extension(compound_ext, icon_table)
end

local function get_icon_by_extension(name, ext, opts)
  local is_strict = if_nil(opts and opts.strict, global_opts.strict)
  local icon_table = is_strict and icons_by_file_extension or icons

  if ext ~= nil then
    return icon_table[ext]
  end

  return iterate_multi_dotted_extension(name, icon_table)
end

local function get_icon(name, ext, opts)
  if type(name) == "string" then
    name = name:lower()
  end

  if not loaded then
    setup()
  end

  local has_default = if_nil(opts and opts.default, global_opts.default)
  local is_strict = if_nil(opts and opts.strict, global_opts.strict)
  local icon_data
  if is_strict then
    icon_data = icons_by_filename[name] or get_icon_by_extension(name, ext, opts) or (has_default and default_icon)
  else
    icon_data = icons[name] or get_icon_by_extension(name, ext, opts) or (has_default and default_icon)
  end

  if icon_data then
    return icon_data.icon, get_highlight_name(icon_data)
  end
end

local function get_icon_name_by_filetype(ft)
  return filetypes[ft]
end

local function get_icon_by_filetype(ft, opts)
  local name = get_icon_name_by_filetype(ft)
  opts = opts or {}
  opts.strict = false
  return get_icon(name or "", nil, opts)
end

local function get_icon_colors(name, ext, opts)
  if not loaded then
    setup()
  end

  local has_default = if_nil(opts and opts.default, global_opts.default)
  local is_strict = if_nil(opts and opts.strict, global_opts.strict)
  local icon_data
  if is_strict then
    icon_data = icons_by_filename[name] or get_icon_by_extension(name, ext, opts) or (has_default and default_icon)
  else
    icon_data = icons[name] or get_icon_by_extension(name, ext, opts) or (has_default and default_icon)
  end

  if icon_data then
    local color = icon_data.color
    local cterm_color = icon_data.cterm_color
    if icon_data.name and highlight_exists(get_highlight_name(icon_data)) then
      color = get_highlight_foreground(icon_data) or color
      cterm_color = get_highlight_ctermfg(icon_data) or cterm_color
    end
    return icon_data.icon, color, cterm_color
  end
end

local function get_icon_colors_by_filetype(ft, opts)
  local name = get_icon_name_by_filetype(ft)
  return get_icon_colors(name or "", nil, opts)
end

local function get_icon_color(name, ext, opts)
  local data = { get_icon_colors(name, ext, opts) }
  return data[1], data[2]
end

local function get_icon_color_by_filetype(ft, opts)
  local name = get_icon_name_by_filetype(ft)
  opts = opts or {}
  opts.strict = false
  return get_icon_color(name or "", nil, opts)
end

local function get_icon_cterm_color(name, ext, opts)
  local data = { get_icon_colors(name, ext, opts) }
  return data[1], data[3]
end

local function get_icon_cterm_color_by_filetype(ft, opts)
  local name = get_icon_name_by_filetype(ft)
  return get_icon_cterm_color(name or "", nil, opts)
end

local function set_icon(user_icons)
  icons = vim.tbl_extend("force", icons, user_icons or {})
  if not global_opts.color_icons then
    return
  end

  for _, icon_data in pairs(user_icons) do
    set_up_highlight(icon_data)
  end
end

local function set_default_icon(icon, color, cterm_color)
  default_icon.icon = icon
  default_icon.color = color
  default_icon.cterm_color = cterm_color
  set_up_highlight(default_icon)
end

-- Load the icons already, the loaded tables depend on the 'background' setting.
refresh_icons()

-- Change icon set on background change
vim.api.nvim_create_autocmd("OptionSet", {
  pattern = "background",
  callback = function()
    refresh_icons()
    set_up_highlights(true) -- Force update highlights
  end,
})

return {
  get_icon = get_icon,
  get_icon_colors = get_icon_colors,
  get_icon_color = get_icon_color,
  get_icon_cterm_color = get_icon_cterm_color,
  get_icon_name_by_filetype = get_icon_name_by_filetype,
  get_icon_by_filetype = get_icon_by_filetype,
  get_icon_colors_by_filetype = get_icon_colors_by_filetype,
  get_icon_color_by_filetype = get_icon_color_by_filetype,
  get_icon_cterm_color_by_filetype = get_icon_cterm_color_by_filetype,
  set_icon = set_icon,
  set_default_icon = set_default_icon,
  get_default_icon = get_default_icon,
  setup = setup,
  has_loaded = function()
    return loaded
  end,
  get_icons = function()
    return icons
  end,
  set_up_highlights = set_up_highlights,
}