diff --git a/lib/chess/board.ex b/lib/chess/board.ex new file mode 100644 index 0000000..20e8880 --- /dev/null +++ b/lib/chess/board.ex @@ -0,0 +1,73 @@ +defmodule Chess.Board do + defstruct a1: %{ square_color: "white", figure: {"black", "rook"}}, + b1: %{ square_color: "black", figure: {"black", "knight"}}, + c1: %{ square_color: "white", figure: {"black", "bishop"}}, + d1: %{ square_color: "black", figure: {"black", "queen"}}, + e1: %{ square_color: "white", figure: {"black", "king"}}, + f1: %{ square_color: "black", figure: {"black", "bishop"}}, + g1: %{ square_color: "white", figure: {"black", "knight"}}, + h1: %{ square_color: "black", figure: {"black", "rook"}}, + + a2: %{ square_color: "black", figure: {"black", "pawn"}}, + b2: %{ square_color: "white", figure: {"black", "pawn"}}, + c2: %{ square_color: "black", figure: {"black", "pawn"}}, + d2: %{ square_color: "white", figure: {"black", "pawn"}}, + e2: %{ square_color: "black", figure: {"black", "pawn"}}, + f2: %{ square_color: "white", figure: {"black", "pawn"}}, + g2: %{ square_color: "black", figure: {"black", "pawn"}}, + h2: %{ square_color: "white", figure: {"black", "pawn"}}, + + a3: %{ square_color: "white", figure: nil}, + b3: %{ square_color: "black", figure: nil}, + c3: %{ square_color: "white", figure: nil}, + d3: %{ square_color: "black", figure: nil}, + e3: %{ square_color: "white", figure: nil}, + f3: %{ square_color: "black", figure: nil}, + g3: %{ square_color: "white", figure: nil}, + h3: %{ square_color: "black", figure: nil}, + + a4: %{ square_color: "black", figure: nil}, + b4: %{ square_color: "white", figure: nil}, + c4: %{ square_color: "black", figure: nil}, + d4: %{ square_color: "white", figure: nil}, + e4: %{ square_color: "black", figure: nil}, + f4: %{ square_color: "white", figure: nil}, + g4: %{ square_color: "black", figure: nil}, + h4: %{ square_color: "white", figure: nil}, + + a5: %{ square_color: "white", figure: nil}, + b5: %{ square_color: "black", figure: nil}, + c5: %{ square_color: "white", figure: nil}, + d5: %{ square_color: "black", figure: nil}, + e5: %{ square_color: "white", figure: nil}, + f5: %{ square_color: "black", figure: nil}, + g5: %{ square_color: "white", figure: nil}, + h5: %{ square_color: "black", figure: nil}, + + a6: %{ square_color: "black", figure: nil}, + b6: %{ square_color: "white", figure: nil}, + c6: %{ square_color: "black", figure: nil}, + d6: %{ square_color: "white", figure: nil}, + e6: %{ square_color: "black", figure: nil}, + f6: %{ square_color: "white", figure: nil}, + g6: %{ square_color: "black", figure: nil}, + h6: %{ square_color: "white", figure: nil}, + + a7: %{ square_color: "white", figure: {"white", "pawn"}}, + b7: %{ square_color: "black", figure: {"white", "pawn"}}, + c7: %{ square_color: "white", figure: {"white", "pawn"}}, + d7: %{ square_color: "black", figure: {"white", "pawn"}}, + e7: %{ square_color: "white", figure: {"white", "pawn"}}, + f7: %{ square_color: "black", figure: {"white", "pawn"}}, + g7: %{ square_color: "white", figure: {"white", "pawn"}}, + h7: %{ square_color: "black", figure: {"white", "pawn"}}, + + a8: %{ square_color: "black", figure: {"white", "rook"}}, + b8: %{ square_color: "white", figure: {"white", "knight"}}, + c8: %{ square_color: "black", figure: {"white", "bishop"}}, + d8: %{ square_color: "white", figure: {"white", "queen"}}, + e8: %{ square_color: "black", figure: {"white", "king"}}, + f8: %{ square_color: "white", figure: {"white", "bishop"}}, + g8: %{ square_color: "black", figure: {"white", "knight"}}, + h8: %{ square_color: "white", figure: {"white", "rook"}} +end diff --git a/lib/chess/dashboard.ex b/lib/chess/dashboard.ex new file mode 100644 index 0000000..4cbe580 --- /dev/null +++ b/lib/chess/dashboard.ex @@ -0,0 +1,83 @@ +defmodule Chess.Dashboard do + + alias Chess.Board + alias Chess.Coordinate + + def build_dashboard() do + new_board = %Board{} + coordinate = [:a1, + :b1, + :c1, + :d1, + :e1, + :f1, + :g1, + :h1, + + :a2, + :b2, + :c2, + :d2, + :e2, + :f2, + :g2, + :h2, + + :a3, + :b3, + :c3, + :d3, + :e3, + :f3, + :g3, + :h3, + + :a4, + :b4, + :c4, + :d4, + :e4, + :f4, + :g4, + :h4, + + :a5, + :b5, + :c5, + :d5, + :e5, + :f5, + :g5, + :h5, + + :a6, + :b6, + :c6, + :d6, + :e6, + :f6, + :g6, + :h6, + + :a7, + :b7, + :c7, + :d7, + :e7, + :f7, + :g7, + :h7, + + :a8, + :b8, + :c8, + :d8, + :e8, + :f8, + :g8, + :h8 + ] + {%Board{}, coordinate} + end + +end diff --git a/lib/chess/figure_move.ex b/lib/chess/figure_move.ex new file mode 100644 index 0000000..2001472 --- /dev/null +++ b/lib/chess/figure_move.ex @@ -0,0 +1,96 @@ +defmodule Chess.FigureMove do + + @rows [1, 2, 3, 4 ,5 ,6 ,7, 8] + + @columns [1, 2, 3, 4 ,5 ,6 ,7, 8] + @columns_value %{ "a" => 1, "b" => 2, "c" => 3, "d" => 4, "e" => 5, "f" => 6, "g" => 7, "h" => 8 } + @columns_key %{ 1 => "a", 2 => "b", 3 => "c", 4 => "d", 5 => "e", 6 => "f", 7 => "g", 8 => "h" } + + def move(%{"cor" => cor, "player" => "white", "figure" => "pawn"}) do + [column, row] = String.codepoints(cor) + row = String.to_integer(row) + moves = Enum.filter(@columns, fn y -> row > y end) + + total_move = case length(moves) == 6 do + true -> [ row - 1 , row - 2] + false -> [ row - 1 ] + end + + Enum.map(total_move, fn move -> column <> "#{move}" end) + end + + def move(%{"cor" => cor, "player" => "black", "figure" => "pawn"}) do + [column, row] = String.codepoints(cor) + row = String.to_integer(row) + moves = Enum.filter(@columns, fn y -> row < y end) + + total_move = case length(moves) == 6 do + true -> [ row + 1 , row + 2] + false -> [ row + 1 ] + end + + Enum.map(total_move, fn move -> column <> "#{move}" end) + end + + def move(%{"cor" => cor, "player" => player, "figure" => "rook"}) do + [x, y] = String.codepoints(cor) + move_x_y(x, y) + end + + def move(%{"cor" => cor, "player" => player, "figure" => "bishop"}) do + [x, y] = String.codepoints(cor) + diagonal_move(x, y) + end + + def kill?(%{"cor" => cor, "player" => player} = params, coordinate, active_player, _move, {_color, "pawn"}) do + [column_kill, row_kill] = String.codepoints(cor) + row_kill = String.to_integer(row_kill) + + figure = Atom.to_string(coordinate) + + [column, row] = String.codepoints(figure) + + row_left = String.to_integer(row) + 1 + row_right = String.to_integer(row) - 1 + + column_value = Map.get(@columns_value, column) + column_kill_value = Map.get(@columns_value, column_kill) + + column_left = column_value - 1 + column_right = column_value + 1 + + (row_left == row_kill or row_right == row_kill) and (column_left == column_kill_value or column_right == column_kill_value) and player != active_player + end + + def kill?(%{"cor" => cor, "player" => player} = params, _coordinate, active_player, move, {_color, "rook"}) do + Enum.member?(move, cor) and player != active_player + end + + defp move_x_y(x,y) do + x_value = Map.get(@columns_value, x) + y = String.to_integer(y) + + x_left = Enum.filter(@columns, fn column -> x_value < column end) + x_right = Enum.filter(@columns, fn column -> x_value > column end) + + x_left = Enum.map(x_left, fn x_number -> Map.get(@columns_key, x_number) end) + x_right = Enum.map(x_right, fn x_number -> Map.get(@columns_key, x_number) end) + + move_in_x = x_left ++ x_right + + y_up = Enum.filter(@rows, fn row -> row < y end) + y_down = Enum.filter(@rows, fn row -> row > y end) + + move_in_y = y_up ++ y_down + + move_in_x = Enum.map(move_in_x, fn move -> move <> "#{y}" end) + move_in_y = Enum.map(move_in_y, fn move -> x <> "#{move}" end) + + move_in_x ++ move_in_y + end + + defp diagonal_move(x, y) do + # aqui va la logica en diagonal del alfil + + end +end diff --git a/lib/chess_web/live/components/square/index.ex b/lib/chess_web/live/components/square/index.ex new file mode 100644 index 0000000..7bd0641 --- /dev/null +++ b/lib/chess_web/live/components/square/index.ex @@ -0,0 +1,22 @@ +defmodule ChessWeb.SquareLiveComponent do + + use ChessWeb, :live_component + use Phoenix.HTML + + def square( %{id: id, square: %{square_color: square_color, figure: {player, figure_type}} } = assigns) do + square_color = "square" <> " " <> square_color + figure = "figure" <> " " <> player <> " " <> figure_type + ~H""" +
+
+
+ """ + end + + def square( %{id: id, square: %{square_color: square_color, figure: nil} } = assigns) do + square_color = "square" <> " " <> square_color + ~H""" +
+ """ + end +end diff --git a/lib/chess_web/live/page/game/index.ex b/lib/chess_web/live/page/game/index.ex new file mode 100644 index 0000000..f03329b --- /dev/null +++ b/lib/chess_web/live/page/game/index.ex @@ -0,0 +1,88 @@ +defmodule ChessWeb.GameLive.Index do + + use ChessWeb, :live_view + + alias Chess.Dashboard + alias ChessWeb.SquareLiveComponent + alias Chess.FigureMove + alias Chess.Board + + def mount(_params, _session, socket) do + {:ok, assign_initial_game(socket)} + end + + def handle_event("select", %{"player" => figure_color, "cor" => cor } = params, + %{assigns: %{move: nil, selected_figure: nil, + board: board, player: player}} = socket) do + case figure_color == player do + true -> move = FigureMove.move(params) + coordinate = String.to_atom(cor) + selected_coordinate = Map.get(board, coordinate) + {:noreply, socket + |> assign(move: move) + |> assign(selected_figure: Map.get(selected_coordinate, :figure)) + |> assign(prev_coordinate: coordinate ) + } + false -> {:noreply, socket} + end + end + + def handle_event("select", %{"player" => figure_color, "cor" => cor } = params, + %{assigns: %{move: move, selected_figure: selected_figure, + board: board, prev_coordinate: prev_coordinate, player: player}} = socket) do + IO.puts "KILL" + IO.inspect selected_figure + case FigureMove.kill?(params, prev_coordinate, player, move, selected_figure) do + true -> update_board(cor, socket) + false -> {:noreply, socket} + end + end + + def handle_event("select", %{"cor" => cor}, socket) do + move = socket.assigns.move || [] + case Enum.member?(move, cor) do + true -> update_board(cor, socket) + false -> {:noreply, socket} + end + end + + defp assign_initial_game(socket) do + {new_board, coordinates} = Dashboard.build_dashboard() + socket + |> assign(board: new_board) + |> assign(coordinates: coordinates) + |> assign(player: "white") + |> assign(move: nil) + |> assign(selected_figure: nil) + end + + defp update_board(cor, socket) do + coordinate = String.to_atom(cor) + + first_change = socket.assigns.board + |> Map.get(socket.assigns.prev_coordinate) + |> Map.replace(:figure, nil) + + second_change = socket.assigns.board + |> Map.get(coordinate) + |> Map.replace(:figure, socket.assigns.selected_figure) + + board = socket.assigns.board + |> Map.replace(coordinate, second_change) + |> Map.replace(socket.assigns.prev_coordinate, first_change) + + player = case socket.assigns.player == "white" do + true -> "black" + false -> "white" + end + + {:noreply, + socket + |> assign(board: board) + |> assign(player: player) + |> assign(move: nil) + |> assign(selected_figure: nil) + } + end + +end diff --git a/lib/chess_web/live/page/game/index.html.heex b/lib/chess_web/live/page/game/index.html.heex new file mode 100644 index 0000000..0020b53 --- /dev/null +++ b/lib/chess_web/live/page/game/index.html.heex @@ -0,0 +1,11 @@ +
+
Player <%= @player %>
+
+ <%= for coordinate <- @coordinates do %> + + <% end %> +
+
\ No newline at end of file diff --git a/lib/chess_web/live/page/home/index.ex b/lib/chess_web/live/page/home/index.ex new file mode 100644 index 0000000..f6740f7 --- /dev/null +++ b/lib/chess_web/live/page/home/index.ex @@ -0,0 +1,13 @@ +defmodule ChessWeb.HomeLive.Index do + + use ChessWeb, :live_view + + def mount(_params, _session, socket) do + {:ok, socket} + end + + def handle_event("create_game", _value, socket) do + { :noreply, push_redirect(socket, to: "/game")} + end + +end diff --git a/lib/chess_web/live/page/home/index.html.heex b/lib/chess_web/live/page/home/index.html.heex new file mode 100644 index 0000000..0bbf00a --- /dev/null +++ b/lib/chess_web/live/page/home/index.html.heex @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/lib/chess_web/router.ex b/lib/chess_web/router.ex index 6545232..1e0137c 100644 --- a/lib/chess_web/router.ex +++ b/lib/chess_web/router.ex @@ -17,7 +17,13 @@ defmodule ChessWeb.Router do scope "/", ChessWeb do pipe_through :browser - get "/", PageController, :index + get "/dashboard", PageController, :index + + # live "/", Page.Home.Index, :index + live_session :default do + live "/", HomeLive.Index, :index + live "/game", GameLive.Index, :index + end end # Other scopes may use custom stacks. diff --git a/mix.lock b/mix.lock new file mode 100644 index 0000000..e827ca2 --- /dev/null +++ b/mix.lock @@ -0,0 +1,25 @@ +%{ + "castore": {:hex, :castore, "0.1.18", "deb5b9ab02400561b6f5708f3e7660fc35ca2d51bfc6a940d2f513f89c2975fc", [:mix], [], "hexpm", "61bbaf6452b782ef80b33cdb45701afbcf0a918a45ebe7e73f1130d661e66a06"}, + "cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"}, + "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, + "cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"}, + "esbuild": {:hex, :esbuild, "0.5.0", "d5bb08ff049d7880ee3609ed5c4b864bd2f46445ea40b16b4acead724fb4c4a3", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "f183a0b332d963c4cfaf585477695ea59eef9a6f2204fdd0efa00e099694ffe5"}, + "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, + "floki": {:hex, :floki, "0.33.1", "f20f1eb471e726342b45ccb68edb9486729e7df94da403936ea94a794f072781", [:mix], [{:html_entities, "~> 0.5.0", [hex: :html_entities, repo: "hexpm", optional: false]}], "hexpm", "461035fd125f13fdf30f243c85a0b1e50afbec876cbf1ceefe6fddd2e6d712c6"}, + "html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"}, + "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"}, + "mime": {:hex, :mime, "2.0.3", "3676436d3d1f7b81b5a2d2bd8405f412c677558c81b1c92be58c00562bb59095", [:mix], [], "hexpm", "27a30bf0db44d25eecba73755acf4068cbfe26a4372f9eb3e4ea3a45956bff6b"}, + "phoenix": {:hex, :phoenix, "1.6.14", "57678366dc1d5bad49832a0fc7f12c2830c10d3eacfad681bfe9602cd4445f04", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d48c0da00b3d4cd1aad6055387917491af9f6e1f1e96cedf6c6b7998df9dba26"}, + "phoenix_html": {:hex, :phoenix_html, "3.2.0", "1c1219d4b6cb22ac72f12f73dc5fad6c7563104d083f711c3fcd8551a1f4ae11", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "36ec97ba56d25c0136ef1992c37957e4246b649d620958a1f9fa86165f8bc54f"}, + "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.3.3", "3a53772a6118d5679bf50fc1670505a290e32a1d195df9e069d8c53ab040c054", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "766796676e5f558dbae5d1bdb066849673e956005e3730dfd5affd7a6da4abac"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "0.17.12", "74f4c0ad02d7deac2d04f50b52827a5efdc5c6e7fac5cede145f5f0e4183aedc", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.0 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "af6dd5e0aac16ff43571f527a8e0616d62cb80b10eb87aac82170243e50d99c8"}, + "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"}, + "phoenix_view": {:hex, :phoenix_view, "1.1.2", "1b82764a065fb41051637872c7bd07ed2fdb6f5c3bd89684d4dca6e10115c95a", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "7ae90ad27b09091266f6adbb61e1d2516a7c3d7062c6789d46a7554ec40f3a56"}, + "plug": {:hex, :plug, "1.13.6", "187beb6b67c6cec50503e940f0434ea4692b19384d47e5fdfd701e93cadb4cc2", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "02b9c6b9955bce92c829f31d6284bf53c591ca63c4fb9ff81dfd0418667a34ff"}, + "plug_cowboy": {:hex, :plug_cowboy, "2.5.2", "62894ccd601cf9597e2c23911ff12798a8a18d237e9739f58a6b04e4988899fe", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ea6e87f774c8608d60c8d34022a7d073bd7680a0a013f049fc62bf35efea1044"}, + "plug_crypto": {:hex, :plug_crypto, "1.2.3", "8f77d13aeb32bfd9e654cb68f0af517b371fb34c56c9f2b58fe3df1235c1251a", [:mix], [], "hexpm", "b5672099c6ad5c202c45f5a403f21a3411247f164e4a8fab056e5cd8a290f4a2"}, + "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, + "telemetry": {:hex, :telemetry, "1.1.0", "a589817034a27eab11144ad24d5c0f9fab1f58173274b1e9bae7074af9cbee51", [:rebar3], [], "hexpm", "b727b2a1f75614774cff2d7565b64d0dfa5bd52ba517f16543e6fc7efcc0df48"}, + "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"}, + "telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"}, +}