{
	inputs = {
		# SOURCE: https://github.com/NixOS/nixpkgs
		nixpkgs.url         = "github:nixos/nixpkgs/nixos-24.11";
		nixpkgsUnstable.url = "github:nixos/nixpkgs/nixos-unstable";
		nixpkgsMaster.url   = "github:nixos/nixpkgs/master";

		# SOURCE: https://github.com/nix-community/home-manager
		home-manager = {
			url = "github:nix-community/home-manager/release-24.11";
			inputs.nixpkgs.follows = "nixpkgs";
		};

		# SOURCE: https://github.com/nix-community/nix-on-droid
		nix-on-droid = {
			url = "github:t184256/nix-on-droid/release-24.05";
			inputs = {
				home-manager.follows = "home-manager";
				nixpkgs.follows      = "nixpkgs";
			};
		};

		# SOURCE: https://github.com/LilleAila/nix-cursors
		nix-cursors = {
			url = "github:LilleAila/nix-cursors";
			inputs.nixpkgs.follows = "nixpkgs";
		};

		# SOURCE: https://github.com/danth/stylix
		stylix = {
			url = "github:danth/stylix/release-24.05";
			inputs = {
				home-manager.follows = "home-manager";
				nixpkgs.follows      = "nixpkgs";
			};
		};

		nixpkgsJobber.url    = "github:nixos/nixpkgs/051f920625ab5aabe37c920346e3e69d7d34400e";
		poetry2nixJobber.url = "github:nix-community/poetry2nix/304f8235fb0729fd48567af34fcd1b58d18f9b95";

		nvimAlign           = { flake = false; url = "github:echasnovski/mini.align"; };
		nvimAutoclose       = { flake = false; url = "github:m4xshen/autoclose.nvim"; };
		nvimBufferline      = { flake = false; url = "github:akinsho/bufferline.nvim"; };
		nvimCloseBuffers    = { flake = false; url = "github:kazhala/close-buffers.nvim"; };
		nvimColorizer       = { flake = false; url = "github:brenoprata10/nvim-highlight-colors"; };
		nvimDevicons        = { flake = false; url = "github:nvim-tree/nvim-web-devicons"; };
		nvimDressing        = { flake = false; url = "github:stevearc/dressing.nvim"; };
		nvimGen             = { flake = false; url = "github:David-Kunz/gen.nvim"; };
		nvimGitsigns        = { flake = false; url = "github:lewis6991/gitsigns.nvim"; };
		nvimGruvboxMaterial = { flake = false; url = "github:sainnhe/gruvbox-material"; };
		nvimIndentoMatic    = { flake = false; url = "github:Darazaki/indent-o-matic"; };
		nvimLspconfig       = { flake = false; url = "github:neovim/nvim-lspconfig"; };
		nvimPlenary         = { flake = false; url = "github:nvim-lua/plenary.nvim"; };
		nvimTelescope       = { flake = false; url = "github:nvim-telescope/telescope.nvim"; };
		nvimTodo            = { flake = false; url = "github:folke/todo-comments.nvim"; };
		nvimTree            = { flake = false; url = "github:nvim-tree/nvim-tree.lua"; };
		nvimTreesitter      = { flake = false; url = "github:nvim-treesitter/nvim-treesitter"; };
		nvimTrouble         = { flake = false; url = "github:folke/trouble.nvim"; };
	};

	outputs = {
		home-manager,
		nix-on-droid,
		nixpkgs,
		nixpkgsJobber,
		nixpkgsMaster,
		nixpkgsUnstable,
		poetry2nixJobber,
		self,
		stylix,
		...
	} @inputs: {
		const = {
			droidStateVersion = "24.05";
			stateVersion      = "24.11";
			timeZone = "Europe/Moscow";
			url = "https://git.voronind.com/voronind/nix.git";
		};

		__findFile = _: p: ./${p};

		ls = path: map (f: "${path}/${f}") (
			builtins.filter (i: builtins.readFileType "${path}/${i}" == "regular") (
				builtins.attrNames (builtins.readDir path)
			)
		);

		devShells = let
			# lib    = nixpkgs.lib;
			pkgs   = nixpkgs.legacyPackages.${system};
			system = "x86_64-linux";
		in {
			${system}.default = pkgs.mkShell {
				nativeBuildInputs = with pkgs; [
					nixd
				];
				# buildInputs = with pkgs; [ ];

				# LD_LIBRARY_PATH   = "${lib.makeLibraryPath buildInputs}";
				# SOURCE_DATE_EPOCH = "${toString self.lastModified}";
			};
		};

		nixosConfigurations = let
			mkHost = { system, hostname }: nixpkgs.lib.nixosSystem {
				inherit system;
				modules = [
					# Make a device hostname match the one from this config.
					{ networking.hostName = hostname; }

					# Specify current release version.
					{ system.stateVersion = self.const.stateVersion; }

					# Add Home Manager module.
					home-manager.nixosModules.home-manager

					# Add Stylix module.
					stylix.nixosModules.stylix

					# HM config.
					./home/NixOs.nix
				]
				++ (self.ls ./host/${system}/${hostname})
				++ (self.ls ./option)
				++ (self.ls ./config)
				++ (self.ls ./overlay)
				++ (self.ls ./system)
				;
				specialArgs = let
					lib  = nixpkgs.lib;
					util = import ./lib/Util.nix { inherit lib; };
				in {
					inherit (self) const __findFile;
					inherit inputs self poetry2nixJobber util;
					pkgsJobber   = nixpkgsJobber.legacyPackages.${system}.pkgs;
					pkgsMaster   = nixpkgsMaster.legacyPackages.${system}.pkgs;
					pkgsUnstable = nixpkgsUnstable.legacyPackages.${system}.pkgs;
					secret       = import ./secret { };
				};
			};

			mkSystem = system: hostname: { "${hostname}" = mkHost { inherit system hostname; }; };
		in nixpkgs.lib.foldl' (acc: h: acc // h) { } (
			map (system: nixpkgs.lib.foldl' (acc: h: acc // h) { } (
				map (host: mkSystem system host) (builtins.attrNames (builtins.readDir ./host/${system}))
			)) (builtins.attrNames (builtins.readDir ./host))
		);

		nixOnDroidConfigurations.default = let
			# config       = self.nixOnDroidConfigurations.default.config;
			lib          = nixpkgs.lib;
			pkgs         = nixpkgs.legacyPackages.${system}.pkgs;
			pkgsMaster   = nixpkgsMaster.legacyPackages.${system}.pkgs;
			pkgsUnstable = nixpkgsUnstable.legacyPackages.${system}.pkgs;
			system       = "aarch64-linux";
		in nix-on-droid.lib.nixOnDroidConfiguration {
			inherit pkgs;
			modules = [
				{ home.android.enable = true; }
				{ home-manager.config.stylix.autoEnable = lib.mkForce false; }
				./home/Android.nix
			]
			++ (self.ls ./option)
			;
			extraSpecialArgs = {
				inherit inputs self pkgsMaster pkgsUnstable;
				inherit (self) const __findFile;
				secret = import ./secret { };
				util   = import ./lib/Util.nix { inherit lib; };
			};
		};
	};
}