From 8505db3ca9882563da1f5743c5a60ca17193b3ce Mon Sep 17 00:00:00 2001 From: Mayel de Borniol Date: Sun, 17 Mar 2024 14:26:46 +0000 Subject: [PATCH] https://github.com/bonfire-networks/bonfire-app/issues/910 --- .github/workflows/docs.yaml | 2 +- .github/workflows/release.yaml | 2 +- .github/workflows/test.yaml | 4 +- .github/workflows/test.yaml.old | 2 +- .tool-versions | 2 +- flavours/classic/config/config.exs | 21 +++- flavours/classic/config/flavour_classic.exs | 5 - flavours/classic/config/runtime.exs | 1 + .../community/config/flavour_community.exs | 3 - .../config/flavour_cooperation.exs | 3 - .../config/flavour_cooperation.exs | 3 - lib/mix/mess.exs | 53 ++++++--- lib/mix/mixer.ex | 109 +++++++++++++++--- mix.exs | 11 +- mix.lock | 16 ++- 15 files changed, 174 insertions(+), 63 deletions(-) diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 78d0bebddb..6cde85fad7 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -8,7 +8,7 @@ jobs: docs: name: Generate docs (upon new release) runs-on: ubuntu-latest - container: hexpm/elixir:1.16.2-erlang-26.2.3-alpine-3.19.1 + container: hexpm/elixir:1.16.2-erlang-26.2.2-alpine-3.19.1 env: FLAVOUR: cooperation FLAVOUR_PATH: flavours/cooperation diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 0557235201..662f058f18 100755 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -20,7 +20,7 @@ jobs: FLAVOUR: ${{ matrix.flavour }} DOCKER_REPO: bonfire ALPINE_VERSION: 3.19.1 - ERLANG_VERSION: 26.2.3 + ERLANG_VERSION: 26.2.2 ELIXIR_VERSION: 1.16.2 steps: - diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index a1f4356400..3d437a9987 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -14,8 +14,8 @@ jobs: strategy: matrix: flavour: ['classic'] # 'community', 'cooperation' - otp: ['26.2.3', '25.2.3'] - elixir: ['1.16.2', '1.14.5'] + otp: ['26.2.2', '25.2.3'] + elixir: ['1.16.2'] # '1.14.5' # ^ test with latest versions + oldest supported (i.e. versions available in debian stable) env: FLAVOUR: ${{matrix.flavour}} diff --git a/.github/workflows/test.yaml.old b/.github/workflows/test.yaml.old index 1745080c3c..87cf8396c5 100644 --- a/.github/workflows/test.yaml.old +++ b/.github/workflows/test.yaml.old @@ -11,7 +11,7 @@ jobs: test_classic_flavour: name: Test classic flavour runs-on: ubuntu-latest - container: hexpm/elixir:1.16.2-erlang-26.2.3-alpine-3.19.1 + container: hexpm/elixir:1.16.2-erlang-26.2.2-alpine-3.19.1 env: FLAVOUR: classic MIX_ENV: test diff --git a/.tool-versions b/.tool-versions index b1ca07587a..4c7b5b101e 100755 --- a/.tool-versions +++ b/.tool-versions @@ -1,6 +1,6 @@ # You can use asdf or [mise](https://github.com/jdx/mise) to install these # NOTE: see upgrade instructions in .tool-versions.env -erlang 26.2.3 +erlang 26.2.2 elixir 1.16.2-otp-26 # erlang 25.3.2.8 # elixir 1.13.4-otp-25 diff --git a/flavours/classic/config/config.exs b/flavours/classic/config/config.exs index 27f78b820a..22e204e2d5 100755 --- a/flavours/classic/config/config.exs +++ b/flavours/classic/config/config.exs @@ -211,8 +211,7 @@ config :sentry, # NOTE: enabling errors with `Found two source files in different source root paths with the same relative path` enable_source_code_context: false, root_source_code_paths: - ([project_root] ++ Bonfire.Mixer.dep_paths(Bonfire.Mixer.deps_names_for(:bonfire))) - |> IO.inspect(), + [project_root] ++ Bonfire.Mixer.dep_paths(Bonfire.Mixer.deps_names_for(:bonfire)), source_code_exclude_patterns: [ ~r/\/flavours\//, ~r/\/extensions\//, @@ -224,6 +223,24 @@ config :sentry, context_lines: 15, tags: %{app_version: Mix.Project.config()[:version]} +for dep <- + Bonfire.Mixer.mess_other_flavour_dep_names(flavour) + |> IO.inspect( + label: + "NOTE: these extensions are not part of the #{flavour} flavour and will be available but disabled by default" + ) do + config dep, + modularity: :disabled +end + +if System.get_env("WITH_API_GRAPHQL") != "yes" do + config :bonfire_api_graphql, + modularity: :disabled +else + config :bonfire_api_graphql, + modularity: true +end + # include Bonfire-specific config files for config <- "bonfire_*.exs" |> Path.expand(__DIR__) |> Path.wildcard() do # IO.inspect(include_config: config) diff --git a/flavours/classic/config/flavour_classic.exs b/flavours/classic/config/flavour_classic.exs index a482c8e21e..8dda266854 100644 --- a/flavours/classic/config/flavour_classic.exs +++ b/flavours/classic/config/flavour_classic.exs @@ -1,10 +1,5 @@ import Config -if System.get_env("WITH_API_GRAPHQL") != "yes" do - config :bonfire_api_graphql, - modularity: :disabled -end - config :bonfire_social, Bonfire.Social.Pins, modularity: :disabled config :bonfire, :ui, diff --git a/flavours/classic/config/runtime.exs b/flavours/classic/config/runtime.exs index 43b322363c..a84c26cebe 100755 --- a/flavours/classic/config/runtime.exs +++ b/flavours/classic/config/runtime.exs @@ -6,6 +6,7 @@ import Config IO.puts("🔥 Welcome to Bonfire!") +flavour = System.get_env("FLAVOUR", "classic") host = System.get_env("HOSTNAME", "localhost") server_port = String.to_integer(System.get_env("SERVER_PORT", "4000")) public_port = String.to_integer(System.get_env("PUBLIC_PORT", "4000")) diff --git a/flavours/community/config/flavour_community.exs b/flavours/community/config/flavour_community.exs index d71ed8740a..c519d5ff88 100644 --- a/flavours/community/config/flavour_community.exs +++ b/flavours/community/config/flavour_community.exs @@ -3,9 +3,6 @@ import Config config :bonfire_ui_topics, modularity: :disabled -config :bonfire_api_graphql, - modularity: :disabled - # Please note that most of these are defaults meant to be overridden by instance admins in Settings rather than edited here config :bonfire, :ui, # end theme diff --git a/flavours/cooperation/config/flavour_cooperation.exs b/flavours/cooperation/config/flavour_cooperation.exs index f18d6a3d77..6d9b9cc90c 100644 --- a/flavours/cooperation/config/flavour_cooperation.exs +++ b/flavours/cooperation/config/flavour_cooperation.exs @@ -1,8 +1,5 @@ import Config -# config :bonfire_api_graphql, -# modularity: :disabled - # Please note that most of these are defaults meant to be overridden by instance admins in Settings rather than edited here config :bonfire, :ui, theme: [ diff --git a/flavours/coordination/config/flavour_cooperation.exs b/flavours/coordination/config/flavour_cooperation.exs index f18d6a3d77..6d9b9cc90c 100644 --- a/flavours/coordination/config/flavour_cooperation.exs +++ b/flavours/coordination/config/flavour_cooperation.exs @@ -1,8 +1,5 @@ import Config -# config :bonfire_api_graphql, -# modularity: :disabled - # Please note that most of these are defaults meant to be overridden by instance admins in Settings rather than edited here config :bonfire, :ui, theme: [ diff --git a/lib/mix/mess.exs b/lib/mix/mess.exs index 29ce52fa70..6757a989ba 100644 --- a/lib/mix/mess.exs +++ b/lib/mix/mess.exs @@ -18,9 +18,11 @@ if not Code.ensure_loaded?(Mess) do opts = opts(opts) (sources || sources(opts[:use_local_forks?])) - # |> IO.inspect() |> enum_deps() + # |> IO.inspect(label: "enum_deps") |> deps_packages(extra_deps, opts) + + # |> IO.inspect(label: "deps_packages") end defp sources(true), do: [path: "deps.path", git: "deps.git", hex: "deps.hex"] @@ -49,8 +51,16 @@ if not Code.ensure_loaded?(Mess) do # |> IO.inspect(label: "opts for #{File.cwd!}") end - defp enum_deps({k, v}) do - read(v, k) + defp enum_deps({:disabled, sublist}) do + sublist + |> Enum.flat_map(&enum_deps/1) + |> Enum.map(&Map.put(&1, :disabled, true)) + + # |> IO.inspect(label: "disabled") + end + + defp enum_deps({kind, path}) do + maybe_read(path, kind) end defp enum_deps(sublist) when is_list(sublist) do @@ -133,7 +143,7 @@ if not Code.ensure_loaded?(Mess) do if opts[:use_local_forks?] and File.exists?(path) do [path, "#{config_dir}deps.flavour.path"] - |> Enum.flat_map(&read(&1, :path)) + |> Enum.flat_map(&maybe_read(&1, :path)) |> Enum.flat_map(&dep_spec(&1, opts)) else IO.warn("did not load #{path}") @@ -141,7 +151,7 @@ if not Code.ensure_loaded?(Mess) do end end - defp read(path, kind) when is_binary(path), do: have_read(File.read(path), path, kind) + defp maybe_read(path, kind) when is_binary(path), do: have_read(File.read(path), path, kind) defp have_read({:error, :enoent}, _path, _kind) do # IO.puts("Could not find #{path} in #{File.cwd!()}") @@ -156,35 +166,42 @@ if not Code.ensure_loaded?(Mess) do defp dep_spec(%{"package" => ""}, _opts), do: [] - defp dep_spec(%{"package" => p, "value" => v, :kind => :hex}, _opts), - do: pkg(p, v, override: true) + defp dep_spec(%{"package" => p, "value" => v, :kind => :hex} = params, _opts), + do: pkg(p, v, override: true, runtime: !params[:disabled]) - defp dep_spec(%{"package" => p, "value" => v, :kind => :path}, opts) do + defp dep_spec(%{"package" => p, "value" => v, :kind => :path} = params, opts) do umbrella_path = opts[:umbrella_path] if umbrella_path && String.starts_with?(v, umbrella_path) do if opts[:umbrella_root?] do - pkg(p, from_umbrella: true, override: true, path: "../../#{v}") + pkg(p, + from_umbrella: true, + override: true, + path: "../../#{v}", + runtime: !params[:disabled] + ) + # |> IO.inspect(label: "from_umbrella: #{p}") else - pkg(p, in_umbrella: true, override: true) + pkg(p, in_umbrella: true, override: true, runtime: !params[:disabled]) # |> IO.inspect(label: "in_umbrella: #{p}") end else - pkg(p, path: v, override: true) + pkg(p, path: v, override: true, runtime: !params[:disabled]) end end - defp dep_spec(%{"package" => p, "value" => v, :kind => :git}, _opts), do: git(v, p) + defp dep_spec(%{"package" => p, "value" => v, :kind => :git} = params, _opts), + do: git(v, p, !params[:disabled]) - defp git(line, p) when is_binary(line), - do: git(Regex.named_captures(@git_branch, line), p) + defp git(line, p, runtime) when is_binary(line), + do: git(Regex.named_captures(@git_branch, line), p, runtime) - defp git(%{"branch" => "", "repo" => r}, p), - do: pkg(p, git: r, override: true) + defp git(%{"branch" => "", "repo" => r}, p, runtime), + do: pkg(p, git: r, override: true, runtime: runtime) - defp git(%{"branch" => b, "repo" => r}, p), - do: pkg(p, git: r, branch: b, override: true) + defp git(%{"branch" => b, "repo" => r}, p, runtime), + do: pkg(p, git: r, branch: b, override: true, runtime: runtime) defp pkg(name, opts), do: [{String.to_atom(name), opts}] defp pkg(name, version, opts), do: [{String.to_atom(name), version, opts}] diff --git a/lib/mix/mixer.ex b/lib/mix/mixer.ex index 932c988127..4a186a2903 100644 --- a/lib/mix/mixer.ex +++ b/lib/mix/mixer.ex @@ -55,9 +55,13 @@ if not Code.ensure_loaded?(Bonfire.Mixer) do |> Enum.map(&dep_name/1) end - def deps_names(deps \\ deps()) do + def deps_names_list(deps \\ deps(), as_atom \\ true) do deps - |> Enum.map(&dep_name/1) + |> Enum.map(&dep_name(&1, as_atom)) + end + + def deps_names(deps \\ deps()) do + deps_names_list(deps, false) |> Enum.join(" ") end @@ -126,40 +130,109 @@ if not Code.ensure_loaded?(Bonfire.Mixer) do def flavour(config), do: System.get_env("FLAVOUR") || config[:default_flavour] - def config_path(_config_or_flavour \\ nil, filename), - do: Path.expand(Path.join(["config", filename])) + def config_path(path \\ nil, filename), + do: Path.expand(Path.join([path || "config", filename])) # flavour_path(config_or_flavour) def forks_path(), do: System.get_env("FORKS_PATH", "extensions/") - def mess_sources(config_or_flavour) do + def mess_sources(flavour) do mess_source_files(System.get_env("WITH_FORKS", "1"), System.get_env("WITH_GIT_DEPS", "1")) - |> enum_mess_sources(config_or_flavour) + |> maybe_all_flavour_sources(flavour, System.get_env("WITH_ALL_FLAVOUR_DEPS", "1")) + + # |> IO.inspect(label: "messy") end - defp enum_mess_sources({k, v}, config_or_flavour) do - {k, config_path(config_or_flavour, v)} + def mess_other_flavour_deps(current_flavour \\ System.get_env("FLAVOUR", "classic")) do + current_flavour_sources = + mess_source_files(System.get_env("WITH_FORKS", "1"), System.get_env("WITH_GIT_DEPS", "1")) + + current_flavour_deps = + enum_mess_sources(current_flavour_sources) + # |> IO.inspect(label: "current_mess_sources") + |> Mess.deps([], []) + |> deps_names_list() + + # |> IO.inspect(label: "current_flavour_deps", limit: :infinity) + + other_flavours_sources = other_flavour_sources(current_flavour_sources, current_flavour) + # |> IO.inspect(label: "other_flavours_sources") + + Mess.deps(other_flavours_sources, [], []) + # |> IO.inspect(label: "other_flavours_deps") + |> Enum.reject(fn + {dep, _} -> dep in current_flavour_deps + {dep, _, _} -> dep in current_flavour_deps + end) + + # |> IO.inspect(label: "other_flavour_deps") end - defp enum_mess_sources(sublist, config_or_flavour) when is_list(sublist) do + def mess_other_flavour_dep_names(current_flavour \\ System.get_env("FLAVOUR", "classic")) do + mess_other_flavour_deps(current_flavour) + |> deps_names_list() + end + + defp maybe_all_flavour_sources( + existing_sources, + current_flavour, + "1" = _WITH_ALL_FLAVOUR_DEPS + ) do + enum_mess_sources(existing_sources) ++ + [disabled: other_flavour_sources(existing_sources, current_flavour)] + end + + defp maybe_all_flavour_sources(existing_sources, _flavour, _not_WITH_ALL_FLAVOUR_DEPS) do + enum_mess_sources(existing_sources) + end + + def other_flavour_sources( + existing_sources \\ mess_source_files( + System.get_env("WITH_FORKS", "1"), + System.get_env("WITH_GIT_DEPS", "1") + ), + current_flavour \\ System.get_env("FLAVOUR", "classic") + ) do + flavour_paths = + for path <- "flavours/*/config/" |> Path.wildcard() do + path + end + |> Enum.reject(&(&1 == "flavours/#{current_flavour}/config")) + + # |> IO.inspect(label: "creams") + + Enum.map( + flavour_paths, + &(List.first(existing_sources) + |> enum_mess_sources(&1)) + ) + end + + defp enum_mess_sources(sublist, path \\ nil) + + defp enum_mess_sources(sublist, path) when is_list(sublist) do sublist - |> Enum.map(&enum_mess_sources(&1, config_or_flavour)) + |> Enum.map(&enum_mess_sources(&1, path)) end - defp mess_source_files("0", "0"), + defp enum_mess_sources({k, v}, path) do + {k, config_path(path, v)} + end + + defp mess_source_files("0" = _not_WITH_FORKS, "0" = _not_WITH_GIT_DEPS), do: [[hex: "deps.flavour.hex"], [hex: "deps.hex"]] - defp mess_source_files("0", "1"), + defp mess_source_files("0" = _not_WITH_FORKS, "1" = _WITH_GIT_DEPS), do: [[git: "deps.flavour.git", hex: "deps.flavour.hex"], [git: "deps.git", hex: "deps.hex"]] - defp mess_source_files("1", "0"), + defp mess_source_files("1" = _WITH_FORKS, "0" = _not_WITH_GIT_DEPS), do: [ [path: "deps.flavour.path", hex: "deps.flavour.hex"], [path: "deps.path", hex: "deps.hex"] ] - defp mess_source_files("1", "1"), + defp mess_source_files("1" = _WITH_FORKS, "1" = _WITH_GIT_DEPS), do: [ [path: "deps.flavour.path", git: "deps.flavour.git", hex: "deps.flavour.hex"], [path: "deps.path", git: "deps.git", hex: "deps.hex"] @@ -328,9 +401,11 @@ if not Code.ensure_loaded?(Bonfire.Mixer) do is_list(spec) && spec[:git] && !spec[:commit] end - def dep_name(dep) when is_tuple(dep), do: elem(dep, 0) |> dep_name() - def dep_name(dep) when is_atom(dep), do: Atom.to_string(dep) - def dep_name(dep) when is_binary(dep), do: dep + def dep_name(dep, as_atom \\ false) + def dep_name(dep, as_atom) when is_tuple(dep), do: elem(dep, 0) |> dep_name(as_atom) + def dep_name(dep, false) when is_atom(dep), do: Atom.to_string(dep) + def dep_name(dep, true) when is_binary(dep), do: String.to_existing_atom(dep) + def dep_name(dep, _), do: dep def dep_path(dep, force? \\ false) diff --git a/mix.exs b/mix.exs index 04c538c34b..05aa09ecc9 100755 --- a/mix.exs +++ b/mix.exs @@ -5,6 +5,9 @@ defmodule Bonfire.Umbrella.MixProject do use Mix.Project alias Bonfire.Mixer + @default_flavour "classic" + @flavour System.get_env("FLAVOUR") || @default_flavour + # we only behave as an umbrella im dev/test env @use_local_forks System.get_env("WITH_FORKS", "1") == "1" ext_forks_path = Mixer.forks_path() @@ -117,11 +120,11 @@ defmodule Bonfire.Umbrella.MixProject do ] # TODO: put these in ENV or an external writeable config file similar to deps.* - @default_flavour "classic" @config [ # note that the flavour will automatically be added where the dash appears version: "0.9.10-beta.5", elixir: ">= #{System.get_env("ELIXIR_VERSION", "1.13.4")}", + flavour: @flavour, default_flavour: @default_flavour, logo: "assets/static/images/bonfire-icon.png", guides: [ @@ -212,13 +215,13 @@ defmodule Bonfire.Umbrella.MixProject do ] ], deps: - Mess.deps(Mixer.mess_sources(@default_flavour), @extra_deps, + Mess.deps(Mixer.mess_sources(@flavour), @extra_deps, use_local_forks?: @use_local_forks, use_umbrella?: @use_umbrella?, umbrella_root?: @use_local_forks, umbrella_path: @umbrella_path ) - |> IO.inspect(limit: :infinity) + # |> IO.inspect(limit: :infinity) ] def config, do: @config @@ -246,7 +249,7 @@ defmodule Bonfire.Umbrella.MixProject do config_path: "config/config.exs", releases: [ bonfire: [ - runtime_config_path: Mixer.config_path(config(), "runtime.exs"), + runtime_config_path: Mixer.config_path("runtime.exs"), # should BEAM files should have their debug information, documentation chunks, and other non-essential metadata? strip_beams: false, applications: [ diff --git a/mix.lock b/mix.lock index 081b9397eb..5d9853114a 100644 --- a/mix.lock +++ b/mix.lock @@ -1,5 +1,6 @@ %{ "absinthe": {:hex, :absinthe, "1.7.6", "0b897365f98d068cfcb4533c0200a8e58825a4aeeae6ec33633ebed6de11773b", [:mix], [{:dataloader, "~> 1.0.0 or ~> 2.0", [hex: :dataloader, repo: "hexpm", optional: true]}, {:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:opentelemetry_process_propagator, "~> 0.2.1", [hex: :opentelemetry_process_propagator, repo: "hexpm", optional: true]}, {:telemetry, "~> 1.0 or ~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e7626951ca5eec627da960615b51009f3a774765406ff02722b1d818f17e5778"}, + "absinthe_client": {:git, "https://github.com/bonfire-networks/absinthe_client", "6fba146bba117db18b783610e5e7c1271924cc35", [branch: "master"]}, "absinthe_error_payload": {:hex, :absinthe_error_payload, "1.1.4", "502ff239148c8deaac028ddb600d6502d5be68d24fece0c93f4c3cf7e74c1a4d", [:make, :mix], [{:absinthe, "~> 1.3", [hex: :absinthe, repo: "hexpm", optional: false]}, {:ecto, "~> 3.1", [hex: :ecto, repo: "hexpm", optional: false]}], "hexpm", "9e262ef2fd4a2c644075e0cdde2573b1f713c0676ab905c8640eaa8a882b2aca"}, "absinthe_phoenix": {:hex, :absinthe_phoenix, "2.0.2", "e607b438db900049b9b3760f8ecd0591017a46122fffed7057bf6989020992b5", [:mix], [{:absinthe, "~> 1.5", [hex: :absinthe, repo: "hexpm", optional: false]}, {:absinthe_plug, "~> 1.5", [hex: :absinthe_plug, repo: "hexpm", optional: false]}, {:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.5", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.13 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}], "hexpm", "d36918925c380dc7d2ed7d039c9a3b4182ec36723f7417a68745ade5aab22f8d"}, "absinthe_plug": {:hex, :absinthe_plug, "1.5.8", "38d230641ba9dca8f72f1fed2dfc8abd53b3907d1996363da32434ab6ee5d6ab", [:mix], [{:absinthe, "~> 1.5", [hex: :absinthe, repo: "hexpm", optional: false]}, {:plug, "~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "bbb04176647b735828861e7b2705465e53e2cf54ccf5a73ddd1ebd855f996e5a"}, @@ -9,6 +10,7 @@ "argon2_elixir": {:hex, :argon2_elixir, "4.0.0", "7f6cd2e4a93a37f61d58a367d82f830ad9527082ff3c820b8197a8a736648941", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "f9da27cf060c9ea61b1bd47837a28d7e48a8f6fa13a745e252556c14f9132c7f"}, "arrows": {:hex, :arrows, "0.1.1", "c414e21173115987578bda1bf35a60cde228a16d7e52d9f6c76e1c8914c22c79", [:mix], [], "hexpm", "ce6de75d7cb43a032e9856826c5bace8f43434ee574e4a6a412f9d3b3931062e"}, "assert_value": {:hex, :assert_value, "0.10.4", "0f0e528f048734e1b9c7ed947696a18d387cb052b68c20d973ed28ee03623b5a", [:mix], [], "hexpm", "802784272bbff2c257b04b264c02fddc072a625502d615f111dd4769f6b1d2c0"}, + "astro": {:hex, :astro, "1.0.0", "b42e028ada7ff20dded85f778092e607cb98847e7b8db4608733d2d415757235", [:mix], [{:geo, "~> 3.0", [hex: :geo, repo: "hexpm", optional: false]}, {:tz_world, "~> 1.0", [hex: :tz_world, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.1", [hex: :tzdata, repo: "hexpm", optional: true]}], "hexpm", "fda3e3adc52144b3f4e799f97af6931bb5b9cc4099b8213246ffdca191b823bd"}, "bamboo": {:hex, :bamboo, "2.3.0", "d2392a2cabe91edf488553d3c70638b532e8db7b76b84b0a39e3dfe492ffd6fc", [:mix], [{:hackney, ">= 1.15.2", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.4 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "dd0037e68e108fd04d0e8773921512c940e35d981e097b5793543e3b2f9cd3f6"}, "bamboo_campaign_monitor": {:hex, :bamboo_campaign_monitor, "0.1.0", "e4b60354a2186c75e9a338fdd932e027b8bbeba9c274245546291429671e8753", [:mix], [{:bamboo, ">= 1.2.0", [hex: :bamboo, repo: "hexpm", optional: false]}, {:hackney, ">= 1.6.5", [hex: :hackney, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "5b60a27ab2b8596f274f22d3cb8bd8d8f3865667f1ec181bfa6635aa7646d79a"}, "bamboo_mailjet": {:hex, :bamboo_mailjet, "0.1.0", "8f1a6e2df2548544bc74f3d9fb9dfe7112ffeff5f8c0fc4ebece94364655e636", [:mix], [{:bamboo, "~> 1.2", [hex: :bamboo, repo: "hexpm", optional: false]}], "hexpm", "cb213439a14dfe0f8a54dbcb7b40790399d5207025378b64d9717271072e8427"}, @@ -49,6 +51,7 @@ "bonfire_messages": {:git, "https://github.com/bonfire-networks/bonfire_messages", "669586ca419abbaf5046c8de12a78ee0da5f7c85", []}, "bonfire_open_id": {:git, "https://github.com/bonfire-networks/bonfire_open_id", "d4677da6303ddd6d45231c97f5de78926b2f5711", [branch: "main"]}, "bonfire_open_science": {:git, "https://github.com/bonfire-networks/bonfire_open_science", "0965ca8cae674ba2b641d684c345180dbbc30eb2", [branch: "main"]}, + "bonfire_pages": {:git, "https://github.com/bonfire-networks/bonfire_pages", "5109facd7ecaeaa7faab15d01388b7886c86d596", [branch: "main"]}, "bonfire_posts": {:git, "https://github.com/bonfire-networks/bonfire_posts", "92d40004ab1948370b737a7f72757df72e0b252a", []}, "bonfire_search": {:git, "https://github.com/bonfire-networks/bonfire_search", "dacc7bc88957a54fb8dbe3c3f82af7618c8e68ca", [branch: "main"]}, "bonfire_social": {:git, "https://github.com/bonfire-networks/bonfire_social", "83251c8c955ee605062dcefd5806917ee64bee44", [branch: "main"]}, @@ -60,6 +63,7 @@ "bonfire_ui_moderation": {:git, "https://github.com/bonfire-networks/bonfire_ui_moderation", "f945aa4a281013c7454155b6d7ab942b7a68da0f", []}, "bonfire_ui_posts": {:git, "https://github.com/bonfire-networks/bonfire_ui_posts", "8cd9784c02dc5bf891798d2563ff624ea3f1960e", []}, "bonfire_ui_reactions": {:git, "https://github.com/bonfire-networks/bonfire_ui_reactions", "8b7c46f11a5cb094e70df636f486b5847c932964", []}, + "bonfire_ui_reflow": {:git, "https://github.com/bonfire-networks/bonfire_ui_reflow", "23727455ad89639251dd69b30a40f72aaa51b1fd", [branch: "main"]}, "bonfire_ui_social": {:git, "https://github.com/bonfire-networks/bonfire_ui_social", "168eb9fe9c6c3c5b3abffe4282152a21db8343be", [branch: "main"]}, "bonfire_ui_social_graph": {:git, "https://github.com/bonfire-networks/bonfire_ui_social_graph", "ddfb90866718e68aed56b8d49d4c84d142e149df", []}, "boruta": {:hex, :boruta, "2.3.2", "6e4d8a3e9056e8fc90af1057c5334eef21a2a78e4da4dda992067b786a3057d4", [:mix], [{:ecto_sql, ">= 3.5.2", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ex_json_schema, "~> 0.6", [hex: :ex_json_schema, repo: "hexpm", optional: false]}, {:finch, "~> 0.16", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:joken, "~> 2.0", [hex: :joken, repo: "hexpm", optional: false]}, {:jose, "~> 1.11", [hex: :jose, repo: "hexpm", optional: false]}, {:nebulex, "~> 2.0", [hex: :nebulex, repo: "hexpm", optional: false]}, {:owl, "~> 0.8.0", [hex: :owl, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:puid, "~> 1.0", [hex: :puid, repo: "hexpm", optional: false]}, {:secure_random, "~> 0.5", [hex: :secure_random, repo: "hexpm", optional: false]}, {:shards, "~> 1.0", [hex: :shards, repo: "hexpm", optional: false]}], "hexpm", "6fa1cdca9ac3d4660b6f6454edd7e1b730077e05bb19a232465eecaae17880c1"}, @@ -144,10 +148,14 @@ "floki": {:hex, :floki, "0.35.4", "cc947b446024732c07274ac656600c5c4dc014caa1f8fb2dfff93d275b83890d", [:mix], [], "hexpm", "27fa185d3469bd8fc5947ef0f8d5c4e47f0af02eb6b070b63c868f69e3af0204"}, "flow": {:hex, :flow, "0.15.0", "503717c0e367b5713336181d5305106840f64abbad32c75d7af5ef1bb0908e38", [:mix], [{:gen_stage, "~> 0.14.0", [hex: :gen_stage, repo: "hexpm", optional: false]}], "hexpm", "d7ecbd4dd38a188494bc996d5014ef8335f436a0b262140a1f6441ae94714581"}, "forecastr": {:git, "https://github.com/bonfire-networks/forecastr", "84235e51e4cd36ca4df03a24718b4367e296c053", []}, + "formula2": {:hex, :formula2, "0.1.0", "034c82015bffbf178b697f5c4c4b1020e58854bada138f839d8184ce0ffd5ef8", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:stream_data, "~> 0.5", [hex: :stream_data, repo: "hexpm", optional: false]}], "hexpm", "c0ef724f3b5db0eed4ede3f927868648bbaf889475a66769f424dc733ac6505b"}, "furlex": {:git, "https://github.com/bonfire-networks/furlex", "d4ab3a3627003f46e28f9c1e700cffc28125ac73", [branch: "main"]}, "gen_smtp": {:hex, :gen_smtp, "1.2.0", "9cfc75c72a8821588b9b9fe947ae5ab2aed95a052b81237e0928633a13276fd3", [:rebar3], [{:ranch, ">= 1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "5ee0375680bca8f20c4d85f58c2894441443a743355430ff33a783fe03296779"}, "gen_stage": {:hex, :gen_stage, "0.14.3", "d0c66f1c87faa301c1a85a809a3ee9097a4264b2edf7644bf5c123237ef732bf", [:mix], [], "hexpm", "8453e2289d94c3199396eb517d65d6715ef26bcae0ee83eb5ff7a84445458d76"}, "geo": {:hex, :geo, "3.6.0", "00c9c6338579f67e91cd5950af4ae2eb25cdce0c3398718c232539f61625d0bd", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "1dbdebf617183b54bc3c8ad7a36531a9a76ada8ca93f75f573b0ae94006168da"}, + "geo_postgis": {:hex, :geo_postgis, "3.6.0", "dbb7874ac04515235bc8e018a3bf4b1b6f3833a870b3371cfa81c983152969f2", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:geo, "~> 3.6", [hex: :geo, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0 or ~> 4.0 or ~> 5.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: false]}], "hexpm", "0fa927b52a2bb17ad8526657ece025867277148c9206c87e165c85a57e56f5f9"}, + "geocoder": {:hex, :geocoder, "1.1.6", "3c2907c07eb6b006d2fdcec4875aedac25ee15debf3c8fa656d9fda497d2c014", [:mix], [{:geohash, "~> 1.2", [hex: :geohash, repo: "hexpm", optional: false]}, {:httpoison, "~> 2.1", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:towel, "~> 0.2.2", [hex: :towel, repo: "hexpm", optional: false]}], "hexpm", "ace06d0f17c09b40245d25aff57df3e69c04c7adcb279af1297593d03bfa27d5"}, + "geohash": {:hex, :geohash, "1.2.2", "4e95a65594afde96ba8c003d43947eb06e97b1a4ad25a21f863922918e3819e8", [:mix], [], "hexpm", "98ed91f7e4682f71a21cb9eeec7ca70e2f578f600c1c9335cc6c55b1b9a30ee2"}, "gettext": {:hex, :gettext, "0.24.0", "6f4d90ac5f3111673cbefc4ebee96fe5f37a114861ab8c7b7d5b30a1108ce6d8", [:mix], [{:expo, "~> 0.5.1", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"}, "git_cli": {:hex, :git_cli, "0.3.0", "a5422f9b95c99483385b976f5d43f7e8233283a47cda13533d7c16131cb14df5", [:mix], [], "hexpm", "78cb952f4c86a41f4d3511f1d3ecb28edb268e3a7df278de2faa1bd4672eaf9b"}, "git_diff": {:hex, :git_diff, "0.6.4", "ec53ebf8bf83b4527d938d6433e3686b47a3e2a23135a21038f76736c16bb6e0", [:mix], [], "hexpm", "9e05563c136c91e960a306fd296156b2e8d74e294ae60961e69a36e118023a5f"}, @@ -209,7 +217,7 @@ "neuron": {:hex, :neuron, "5.1.0", "dd321d5c2d9c03706ee7161ab49f8af634bfd1becb6fb95d8caa28bc95b6c655", [:mix], [{:httpoison, "~> 1.0 or ~> 2.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "23cddb0e0dd9c0eea247bc5b4bc3e1f8b52dbaf63f1637623920ec0b2385b6ce"}, "nimble_csv": {:hex, :nimble_csv, "1.2.0", "4e26385d260c61eba9d4412c71cea34421f296d5353f914afe3f2e71cce97722", [:mix], [], "hexpm", "d0628117fcc2148178b034044c55359b26966c6eaa8e2ce15777be3bbc91b12a"}, "nimble_options": {:hex, :nimble_options, "1.1.0", "3b31a57ede9cb1502071fade751ab0c7b8dbe75a9a4c2b5bbb0943a690b63172", [:mix], [], "hexpm", "8bbbb3941af3ca9acc7835f5655ea062111c9c27bcac53e004460dfd19008a99"}, - "nimble_ownership": {:hex, :nimble_ownership, "0.2.1", "3e44c72ebe8dd213db4e13aff4090aaa331d158e72ce1891d02e0ffb05a1eb2d", [:mix], [], "hexpm", "bf38d2ef4fb990521a4ecf112843063c1f58a5c602484af4c7977324042badee"}, + "nimble_ownership": {:hex, :nimble_ownership, "0.3.1", "99d5244672fafdfac89bfad3d3ab8f0d367603ce1dc4855f86a1c75008bce56f", [:mix], [], "hexpm", "4bf510adedff0449a1d6e200e43e57a814794c8b5b6439071274d248d272a549"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"}, "nimble_pool": {:hex, :nimble_pool, "1.0.0", "5eb82705d138f4dd4423f69ceb19ac667b3b492ae570c9f5c900bb3d2f50a847", [:mix], [], "hexpm", "80be3b882d2d351882256087078e1b1952a28bf98d0a287be87e4a24a710b67a"}, "nodeinfo": {:git, "https://github.com/bonfire-networks/nodeinfo", "243bc8cac91b981db43223e65f4c7f13b687d625", [branch: "main"]}, @@ -270,19 +278,21 @@ "recon": {:hex, :recon, "2.5.4", "05dd52a119ee4059fa9daa1ab7ce81bc7a8161a2f12e9d42e9d551ffd2ba901c", [:mix, :rebar3], [], "hexpm", "e9ab01ac7fc8572e41eb59385efeb3fb0ff5bf02103816535bacaedf327d0263"}, "redirect": {:hex, :redirect, "0.4.0", "98b46053504ee517bc3ad2fd04c064b64b48d339e1e18266355b30c4f8bb52b0", [:mix], [{:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}, {:plug, "~> 1.8.3 or ~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "dfa29a8ecbad066ed0b73b34611cf24c78101719737f37bdf750f39197d67b97"}, "remote_ip": {:hex, :remote_ip, "1.1.0", "cb308841595d15df3f9073b7c39243a1dd6ca56e5020295cb012c76fbec50f2d", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "616ffdf66aaad6a72fc546dabf42eed87e2a99e97b09cbd92b10cc180d02ed74"}, - "req": {:hex, :req, "0.4.13", "6fde45b78e606e2a46fc3a7e4a74828c220cd0b16951f4321c1214f955402d72", [:mix], [{:aws_signature, "~> 0.3.2", [hex: :aws_signature, repo: "hexpm", optional: true]}, {:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:nimble_ownership, "~> 0.2.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "e01a596b74272de799bc57191883e5d4d3875be63f0480223edc5a0086bfe31b"}, + "req": {:hex, :req, "0.4.14", "103de133a076a31044e5458e0f850d5681eef23dfabf3ea34af63212e3b902e2", [:mix], [{:aws_signature, "~> 0.3.2", [hex: :aws_signature, repo: "hexpm", optional: true]}, {:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:nimble_ownership, "~> 0.2.0 or ~> 0.3.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "2ddd3d33f9ab714ced8d3c15fd03db40c14dbf129003c4a3eb80fac2cc0b1b08"}, "rewrite": {:hex, :rewrite, "0.10.0", "5d756b6dc67679e7156ff6055f9654be02dbaeb177aaf1ff6af7ee8da8718248", [:mix], [{:glob_ex, "~> 0.1", [hex: :glob_ex, repo: "hexpm", optional: false]}, {:sourceror, "~> 0.13", [hex: :sourceror, repo: "hexpm", optional: false]}], "hexpm", "68d7808cf549e7bf51b0119a8edc14d50970bad479115249030baa580c1d7b50"}, "rustler_precompiled": {:hex, :rustler_precompiled, "0.7.1", "ecadf02cc59a0eccbaed6c1937303a5827fbcf60010c541595e6d3747d3d0f9f", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "b9e4657b99a1483ea31502e1d58c464bedebe9028808eda45c3a429af4550c66"}, "scribe": {:hex, :scribe, "0.10.0", "90e61b21fee884f58b955d1f45d7fa3e75f161ecb62bad8af6087aef3955c74f", [:mix], [{:pane, "~> 0.2", [hex: :pane, repo: "hexpm", optional: false]}], "hexpm", "3829da9c6a28b2105f0ec50e40f447bf768fb7d96717fbfceb602573f1a3c62e"}, "secure_random": {:hex, :secure_random, "0.5.1", "c5532b37c89d175c328f5196a0c2a5680b15ebce3e654da37129a9fe40ebf51b", [:mix], [], "hexpm", "1b9754f15e3940a143baafd19da12293f100044df69ea12db5d72878312ae6ab"}, "sentry": {:hex, :sentry, "10.1.0", "5d73c23deb5d95f3027fbb09801bd8e787065be61f0065418aed3961becbbe9f", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_options, "~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:plug, "~> 1.6", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, "~> 2.3", [hex: :plug_cowboy, repo: "hexpm", optional: true]}], "hexpm", "f4319e7491133046912b4cf7cbe6f5226b309275d1a6d05386cce2ac7f97b2d2"}, "shards": {:hex, :shards, "1.1.0", "ed3032e63ae99f0eaa6d012b8b9f9cead48b9a810b3f91aeac266cfc4118eff6", [:make, :rebar3], [], "hexpm", "1d188e565a54a458a7a601c2fd1e74f5cfeba755c5a534239266d28b7ff124c7"}, + "simple_slug": {:hex, :simple_slug, "0.1.1", "d966384a6dd03dd7103b03ef50831410cfc943a69ded12c80c403c83eb122f6c", [:mix], [], "hexpm", "477c19c7bc8755a1378bdd4ec591e4819071c72353b7e470b90329e63ef67a72"}, "sleeplocks": {:hex, :sleeplocks, "1.1.2", "d45aa1c5513da48c888715e3381211c859af34bee9b8290490e10c90bb6ff0ca", [:rebar3], [], "hexpm", "9fe5d048c5b781d6305c1a3a0f40bb3dfc06f49bf40571f3d2d0c57eaa7f59a5"}, "sobelow": {:hex, :sobelow, "0.12.2", "45f4d500e09f95fdb5a7b94c2838d6b26625828751d9f1127174055a78542cf5", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "2f0b617dce551db651145662b84c8da4f158e7abe049a76daaaae2282df01c5d"}, "solid": {:hex, :solid, "0.15.2", "6921af98a3a862041bb6af72b5f6e094dbf0242366b142f98a92cabe4ed30d2a", [:mix], [{:nimble_parsec, "~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "18b062b04948b7f7b99ac4a9360681dac7e0bd142df5e62a7761696c7384be45"}, "sourceror": {:hex, :sourceror, "1.0.1", "ec2c41726d181adce888ac94b3f33b359a811b46e019c084509e02c70042e424", [:mix], [], "hexpm", "28225464ffd68bda1843c974f3ff7ccef35e29be09a65dfe8e3df3f7e3600c57"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, "statistex": {:hex, :statistex, "1.0.0", "f3dc93f3c0c6c92e5f291704cf62b99b553253d7969e9a5fa713e5481cd858a5", [:mix], [], "hexpm", "ff9d8bee7035028ab4742ff52fc80a2aa35cece833cf5319009b52f1b5a86c27"}, + "stream_data": {:hex, :stream_data, "0.6.0", "e87a9a79d7ec23d10ff83eb025141ef4915eeb09d4491f79e52f2562b73e5f47", [:mix], [], "hexpm", "b92b5031b650ca480ced047578f1d57ea6dd563f5b57464ad274718c9c29501c"}, "surface": {:hex, :surface, "0.11.2", "97f9e0a390d4383ad54d604fd173c558206f7bb66799e0c3225835e0b860086d", [:mix], [{:phoenix_html, "~> 3.3.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19.0 or ~> 0.20.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:sourceror, "~> 1.0.0", [hex: :sourceror, repo: "hexpm", optional: false]}], "hexpm", "71c49daad5b043c5601ca3ee1459f4794287db508f2d33dde5d973bb0e6971cb"}, "sweet_xml": {:hex, :sweet_xml, "0.7.4", "a8b7e1ce7ecd775c7e8a65d501bc2cd933bff3a9c41ab763f5105688ef485d08", [:mix], [], "hexpm", "e7c4b0bdbf460c928234951def54fe87edf1a170f6896675443279e2dbeba167"}, "table_rex": {:hex, :table_rex, "4.0.0", "3c613a68ebdc6d4d1e731bc973c233500974ec3993c99fcdabb210407b90959b", [:mix], [], "hexpm", "c35c4d5612ca49ebb0344ea10387da4d2afe278387d4019e4d8111e815df8f55"}, @@ -296,9 +306,11 @@ "thousand_island": {:hex, :thousand_island, "1.3.5", "6022b6338f1635b3d32406ff98d68b843ba73b3aa95cfc27154223244f3a6ca5", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2be6954916fdfe4756af3239fb6b6d75d0b8063b5df03ba76fd8a4c87849e180"}, "timex": {:hex, :timex, "3.7.11", "bb95cb4eb1d06e27346325de506bcc6c30f9c6dea40d1ebe390b262fad1862d1", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.20", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.1", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "8b9024f7efbabaf9bd7aa04f65cf8dcd7c9818ca5737677c7b76acbc6a94d1aa"}, "tls_certificate_check": {:hex, :tls_certificate_check, "1.21.0", "042ab2c0c860652bc5cf69c94e3a31f96676d14682e22ec7813bd173ceff1788", [:rebar3], [{:ssl_verify_fun, "~> 1.1", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "6cee6cffc35a390840d48d463541d50746a7b0e421acaadb833cfc7961e490e7"}, + "towel": {:git, "https://github.com/CyrusOfEden/towel", "7a9632f6450593176db387c8202580b626b57760", []}, "twinkle_star": {:git, "https://github.com/bonfire-networks/twinkle_star", "bd793b68502276fd38fd8c9dd88b901506a58589", []}, "typed_struct": {:hex, :typed_struct, "0.3.0", "939789e3c1dca39d7170c87f729127469d1315dcf99fee8e152bb774b17e7ff7", [:mix], [], "hexpm", "c50bd5c3a61fe4e198a8504f939be3d3c85903b382bde4865579bc23111d1b6d"}, "tz": {:hex, :tz, "0.26.5", "bfe8efa345670f90351c5c31d22455d0307c5d9895fbdede7deeb215a7b60dbe", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:mint, "~> 1.5", [hex: :mint, repo: "hexpm", optional: true]}], "hexpm", "c4f9392d710582c7108b6b8c635f4981120ec4b2072adbd242290fc842338183"}, + "tz_world": {:hex, :tz_world, "1.3.2", "15d331ad1ff22735dfcc8c98bfc7b2a9fdc17f1f071e31e21cdafe2d9318a300", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:geo, "~> 1.0 or ~> 2.0 or ~> 3.3", [hex: :geo, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "d1a345e07b3378c4c902ad54fbd5d54c8c3dd55dba883b7407fe57bcec45ff2a"}, "tzdata": {:hex, :tzdata, "1.1.1", "20c8043476dfda8504952d00adac41c6eda23912278add38edc140ae0c5bcc46", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "a69cec8352eafcd2e198dea28a34113b60fdc6cb57eb5ad65c10292a6ba89787"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, "unsafe": {:hex, :unsafe, "1.0.2", "23c6be12f6c1605364801f4b47007c0c159497d0446ad378b5cf05f1855c0581", [:mix], [], "hexpm", "b485231683c3ab01a9cd44cb4a79f152c6f3bb87358439c6f68791b85c2df675"},