From 0a5cd96ccfb1127a10728fb29c004858b4c05023 Mon Sep 17 00:00:00 2001 From: Jamil Bou Kheir Date: Thu, 9 Jul 2020 18:38:47 -0700 Subject: [PATCH] Checkpoint --- .tool-versions | 1 + apps/fg_http/lib/fg_http/users/session.ex | 5 - .../controllers/session_controller.ex | 4 +- .../templates/device/edit.html.eex | 2 +- .../templates/device/form.html.eex | 34 ++++--- .../templates/device/index.html.eex | 4 +- .../fg_http_web/templates/rule/edit.html.eex | 2 +- .../fg_http_web/templates/rule/form.html.eex | 97 ++++++++++++------- .../fg_http_web/templates/rule/index.html.eex | 48 +++++---- .../fg_http_web/templates/rule/show.html.eex | 2 +- .../templates/session/new.html.eex | 6 +- .../lib/fg_http_web/views/rule_view.ex | 4 + .../controllers/session_controller_test.exs | 4 +- mix.exs | 3 +- mix.lock | 5 +- 15 files changed, 134 insertions(+), 87 deletions(-) diff --git a/.tool-versions b/.tool-versions index d8606fb6f..bd6ca00f1 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,4 @@ elixir 1.10.3-otp-23 erlang 23.0.2 nodejs 10.20.1 +python 3.7.7 diff --git a/apps/fg_http/lib/fg_http/users/session.ex b/apps/fg_http/lib/fg_http/users/session.ex index 1c79e5807..dd0bea0d2 100644 --- a/apps/fg_http/lib/fg_http/users/session.ex +++ b/apps/fg_http/lib/fg_http/users/session.ex @@ -17,15 +17,10 @@ defmodule FgHttp.Users.Session do def create_changeset(session, attrs \\ %{}) do session |> cast(attrs, [:email, :password, :last_signed_in_at]) - |> log_it() |> authenticate_user() |> set_last_signed_in_at() end - defp log_it(changeset) do - changeset - end - defp set_last_signed_in_at(%Ecto.Changeset{valid?: true} = changeset) do last_signed_in_at = DateTime.utc_now() change(changeset, last_signed_in_at: last_signed_in_at) diff --git a/apps/fg_http/lib/fg_http_web/controllers/session_controller.ex b/apps/fg_http/lib/fg_http_web/controllers/session_controller.ex index 6ff135490..9e90d8f11 100644 --- a/apps/fg_http/lib/fg_http_web/controllers/session_controller.ex +++ b/apps/fg_http/lib/fg_http_web/controllers/session_controller.ex @@ -24,14 +24,14 @@ defmodule FgHttpWeb.SessionController do |> clear_session() |> put_session(:user_id, session.id) |> assign(:session, session) - |> put_flash(:info, "Session created successfully") + |> put_flash(:info, "Signed in successfully.") |> redirect(to: Routes.device_path(conn, :index)) {:error, changeset} -> conn |> clear_session() |> assign(:session, nil) - |> put_flash(:error, "Error creating session.") + |> put_flash(:error, "Error signing in.") |> render("new.html", changeset: changeset) end diff --git a/apps/fg_http/lib/fg_http_web/templates/device/edit.html.eex b/apps/fg_http/lib/fg_http_web/templates/device/edit.html.eex index b011f3920..f25354674 100644 --- a/apps/fg_http/lib/fg_http_web/templates/device/edit.html.eex +++ b/apps/fg_http/lib/fg_http_web/templates/device/edit.html.eex @@ -1,4 +1,4 @@ -

Edit Device

+

Edit Device

<%= render "form.html", Map.put(assigns, :action, Routes.device_path(@conn, :update, @device)) %> diff --git a/apps/fg_http/lib/fg_http_web/templates/device/form.html.eex b/apps/fg_http/lib/fg_http_web/templates/device/form.html.eex index 2cd1a0abe..c54dda416 100644 --- a/apps/fg_http/lib/fg_http_web/templates/device/form.html.eex +++ b/apps/fg_http/lib/fg_http_web/templates/device/form.html.eex @@ -1,15 +1,25 @@ -<%= form_for @changeset, @action, fn f -> %> - <%= if @changeset.action do %> -
-

Oops, something went wrong! Please check the errors below.

-
- <% end %> +
+
+ <%= form_for @changeset, @action, fn f -> %> + <%= if @changeset.action do %> +
+

Oops, something went wrong! Please check the errors below.

+
+ <% end %> - <%= label f, :name %> - <%= text_input f, :name %> - <%= error_tag f, :name %> +
+ <%= label f, :name, class: "label" %> +
+ <%= text_input f, :name, class: "input" %> +
+

+ <%= error_tag f, :name %> +

+
-
- <%= submit "Save" %> +
+ <%= submit "Save", class: "button is-primary" %> +
+ <% end %>
-<% end %> +
diff --git a/apps/fg_http/lib/fg_http_web/templates/device/index.html.eex b/apps/fg_http/lib/fg_http_web/templates/device/index.html.eex index 291a5c024..0ef201812 100644 --- a/apps/fg_http/lib/fg_http_web/templates/device/index.html.eex +++ b/apps/fg_http/lib/fg_http_web/templates/device/index.html.eex @@ -25,6 +25,4 @@ -

- <%= link "New Device", to: Routes.device_path(@conn, :new) %> -

+<%= link "New Device", to: Routes.device_path(@conn, :new) %> diff --git a/apps/fg_http/lib/fg_http_web/templates/rule/edit.html.eex b/apps/fg_http/lib/fg_http_web/templates/rule/edit.html.eex index 473e03412..179b5f2ba 100644 --- a/apps/fg_http/lib/fg_http_web/templates/rule/edit.html.eex +++ b/apps/fg_http/lib/fg_http_web/templates/rule/edit.html.eex @@ -1,4 +1,4 @@ -

Edit Rule

+

Edit Rule

<%= render "form.html", Map.put(assigns, :action, Routes.rule_path(@conn, :update, @rule)) %> diff --git a/apps/fg_http/lib/fg_http_web/templates/rule/form.html.eex b/apps/fg_http/lib/fg_http_web/templates/rule/form.html.eex index bdf4a802a..cbe542139 100644 --- a/apps/fg_http/lib/fg_http_web/templates/rule/form.html.eex +++ b/apps/fg_http/lib/fg_http_web/templates/rule/form.html.eex @@ -1,41 +1,70 @@ -<%= form_for @changeset, @action, [class: "black-80"], fn f -> %> - <%= if @changeset.action do %> -
-

Oops, something went wrong! Please check the errors below.

-
- <% end %> +
+
+ <%= form_for @changeset, @action, [], fn f -> %> + <%= if @changeset.action do %> +
+

Oops, something went wrong! Please check the errors below.

+
+ <% end %> -
- <%= label f, :destination, class: "f6 b db mb2" %> - <%= text_input f, :destination, class: "input-reset ba b--black-20 pa2 mb2 db w-100" %> - <%= error_tag f, :destination %> -
+
+ <%= label f, :destination, class: "label" %> +
+ <%= + text_input f, + :destination, + class: "input", + placeholder: "IPv4/6 CIDR range or address" + %> +
+

+ <%= error_tag f, :destination %> +

+
-
- <%= label f, :port, class: "f6 b db mb2" %> - <%= text_input f, :port, class: "input-reset ba b--black-20 pa2 mb2 db w-100" %> - <%= error_tag f, :port %> -
+
+ <%= label f, :port, class: "label" %> +
+ <%= text_input f, :port, class: "input", placeholder: "1 - 65535" %> +
+

+ <%= error_tag f, :port %> +

+
-
- <%= label f, :protocol, class: "f6 b db mb2" %> - <%= text_input f, :protocol, class: "input-reset ba b--black-20 pa2 mb2 db w-100" %> - <%= error_tag f, :protocol %> -
+
+ <%= label f, :protocol, class: "label" %> +
+ <%= select f, :protocol, protocol_options_for_select() %> +
+

+ <%= error_tag f, :protocol %> +

+
-
- <%= label f, :priority, class: "f6 b db mb2" %> - <%= text_input f, :priority, class: "input-reset ba b--black-20 pa2 mb2 db w-100" %> - <%= error_tag f, :priority %> -
+
+ <%= label f, :priority, class: "label" %> +
+ <%= text_input f, :priority, class: "input" %> +
+

+ <%= error_tag f, :priority %> +

+
-
- <%= label f, :enabled, class: "f6 b db mb2" %> - <%= checkbox f, :enabled %> - <%= error_tag f, :enabled %> -
+
+ +

+ <%= error_tag f, :enabled %> +

+
-
- <%= submit "Save" %> +
+ <%= submit "Save", class: "button is-primary" %> +
+ <% end %>
-<% end %> +
diff --git a/apps/fg_http/lib/fg_http_web/templates/rule/index.html.eex b/apps/fg_http/lib/fg_http_web/templates/rule/index.html.eex index 6624cef3a..cbac5cd0e 100644 --- a/apps/fg_http/lib/fg_http_web/templates/rule/index.html.eex +++ b/apps/fg_http/lib/fg_http_web/templates/rule/index.html.eex @@ -1,29 +1,33 @@ -

Listing Rules for Device <%= @device.name %>

+

Listing Rules for Device <%= @device.name %>

- - - - - - - - - +
ActionDestinationPortProtocolPriorityEnabled
+ + + + + + + + + + <%= for rule <- @rules do %> - - - - - - - - + + + + + + + + @@ -31,6 +35,8 @@
ActionDestinationPortProtocolPriorityEnabled
<%= rule.action %><%= rule.destination %><%= rule.port %><%= rule.protocol %><%= rule.priority %><%= rule.enabled %>
<%= rule.action %><%= rule.destination %><%= rule.port %><%= rule.protocol %><%= rule.priority %><%= rule.enabled %> <%= link "Show", to: Routes.rule_path(@conn, :show, rule) %> + | <%= link "Edit", to: Routes.rule_path(@conn, :edit, rule) %> + | <%= link "Delete", to: Routes.rule_path(@conn, :delete, rule), method: :delete, data: [confirm: "Are you sure?"] %>
-

- <%= link "New Rule", to: Routes.device_rule_path(@conn, :new, @device) %> -

+<%= + link "New Rule", + to: Routes.device_rule_path(@conn, :new, @device), + class: "button is-primary" +%> diff --git a/apps/fg_http/lib/fg_http_web/templates/rule/show.html.eex b/apps/fg_http/lib/fg_http_web/templates/rule/show.html.eex index 90198176b..f9afe3814 100644 --- a/apps/fg_http/lib/fg_http_web/templates/rule/show.html.eex +++ b/apps/fg_http/lib/fg_http_web/templates/rule/show.html.eex @@ -1,4 +1,4 @@ -

Show Rule

+

Show Rule

    diff --git a/apps/fg_http/lib/fg_http_web/templates/session/new.html.eex b/apps/fg_http/lib/fg_http_web/templates/session/new.html.eex index d2e40ff34..30a5793ba 100644 --- a/apps/fg_http/lib/fg_http_web/templates/session/new.html.eex +++ b/apps/fg_http/lib/fg_http_web/templates/session/new.html.eex @@ -4,8 +4,10 @@
    <%= form_for(@conn, Routes.session_path(@conn, :create), [as: :session], fn f -> %> - <%= if f.errors do %> - + <%= if assigns[:changeset] && @changeset.action do %> +
    +

    Oops, something went wrong! Please check the errors below.

    +
    <% end %>
    diff --git a/apps/fg_http/lib/fg_http_web/views/rule_view.ex b/apps/fg_http/lib/fg_http_web/views/rule_view.ex index 2337e808e..9e5c6c4e8 100644 --- a/apps/fg_http/lib/fg_http_web/views/rule_view.ex +++ b/apps/fg_http/lib/fg_http_web/views/rule_view.ex @@ -1,3 +1,7 @@ defmodule FgHttpWeb.RuleView do use FgHttpWeb, :view + + def protocol_options_for_select do + RuleProtocolEnum.__enum_map__() + end end diff --git a/apps/fg_http/test/fg_http_web/controllers/session_controller_test.exs b/apps/fg_http/test/fg_http_web/controllers/session_controller_test.exs index 23ed1eba8..b705e7c11 100644 --- a/apps/fg_http/test/fg_http_web/controllers/session_controller_test.exs +++ b/apps/fg_http/test/fg_http_web/controllers/session_controller_test.exs @@ -35,7 +35,7 @@ defmodule FgHttpWeb.SessionControllerTest do test_conn = post(conn, Routes.session_path(conn, :create), session: @valid_attrs) assert redirected_to(test_conn) == Routes.device_path(test_conn, :index) - assert get_flash(test_conn, :info) == "Session created successfully" + assert get_flash(test_conn, :info) == "Signed in successfully." assert get_session(test_conn, :user_id) == user.id end @@ -43,7 +43,7 @@ defmodule FgHttpWeb.SessionControllerTest do test_conn = post(conn, Routes.session_path(conn, :create), session: @invalid_attrs) assert html_response(test_conn, 200) =~ "Sign In" - assert get_flash(test_conn, :error) == "Error creating session." + assert get_flash(test_conn, :error) == "Error signing in." end end diff --git a/mix.exs b/mix.exs index 591eec1e5..ebe411172 100644 --- a/mix.exs +++ b/mix.exs @@ -40,7 +40,8 @@ defmodule FireguardUmbrella.MixProject do # Run "mix help deps" for examples and options. defp deps do [ - {:excoveralls, "~> 0.13", only: :test} + {:excoveralls, "~> 0.13", only: :test}, + {:mix_test_watch, "~> 1.0", only: :dev, runtime: false} ] end end diff --git a/mix.lock b/mix.lock index eadd1187c..a3c0ffe39 100644 --- a/mix.lock +++ b/mix.lock @@ -13,12 +13,12 @@ "ecto": {:hex, :ecto, "3.4.5", "2bcd262f57b2c888b0bd7f7a28c8a48aa11dc1a2c6a858e45dd8f8426d504265", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8c6d1d4d524559e9b7a062f0498e2c206122552d63eacff0a6567ffe7a8e8691"}, "ecto_enum": {:hex, :ecto_enum, "1.4.0", "d14b00e04b974afc69c251632d1e49594d899067ee2b376277efd8233027aec8", [:mix], [{:ecto, ">= 3.0.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "> 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:mariaex, ">= 0.0.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "8fb55c087181c2b15eee406519dc22578fa60dd82c088be376d0010172764ee4"}, "ecto_network": {:hex, :ecto_network, "1.3.0", "1e77fa37c20e0f6a426d3862732f3317b0fa4c18f123d325f81752a491d7304e", [:mix], [{:ecto_sql, ">= 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:phoenix_html, ">= 0.0.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.14.0", [hex: :postgrex, repo: "hexpm", optional: false]}], "hexpm", "053a5e46ef2837e8ea5ea97c82fa0f5494699209eddd764e663c85f11b2865bd"}, - "ecto_sql": {:hex, :ecto_sql, "3.4.4", "d28bac2d420f708993baed522054870086fd45016a9d09bb2cd521b9c48d32ea", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.4.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0 or ~> 0.4.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.0", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "edb49af715dd72f213b66adfd0f668a43c17ed510b5d9ac7528569b23af57fe8"}, + "ecto_sql": {:hex, :ecto_sql, "3.4.5", "30161f81b167d561a9a2df4329c10ae05ff36eca7ccc84628f2c8b9fa1e43323", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.4.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0 or ~> 0.4.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.0", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "31990c6a3579b36a3c0841d34a94c275e727de8b84f58509da5f1b2032c98ac2"}, "elixir_make": {:hex, :elixir_make, "0.6.0", "38349f3e29aff4864352084fc736fa7fa0f2995a819a737554f7ebd28b85aaab", [:mix], [], "hexpm", "d522695b93b7f0b4c0fcb2dfe73a6b905b1c301226a5a55cb42e5b14d509e050"}, "ex_machina": {:hex, :ex_machina, "2.4.0", "09a34c5d371bfb5f78399029194a8ff67aff340ebe8ba19040181af35315eabb", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "a20bc9ddc721b33ea913b93666c5d0bdca5cbad7a67540784ae277228832d72c"}, "excoveralls": {:hex, :excoveralls, "0.13.0", "4e1b7cc4e0351d8d16e9be21b0345a7e165798ee5319c7800b9138ce17e0b38e", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "fe2a56c8909564e2e6764765878d7d5e141f2af3bc8ff3b018a68ee2a218fced"}, "file_system": {:hex, :file_system, "0.2.8", "f632bd287927a1eed2b718f22af727c5aeaccc9a98d8c2bd7bff709e851dc986", [:mix], [], "hexpm", "97a3b6f8d63ef53bd0113070102db2ce05352ecf0d25390eb8d747c2bde98bca"}, - "floki": {:hex, :floki, "0.26.0", "4df88977e2e357c6720e1b650f613444bfb48c5acfc6a0c646ab007d08ad13bf", [:mix], [{:html_entities, "~> 0.5.0", [hex: :html_entities, repo: "hexpm", optional: false]}], "hexpm", "e7b66ce7feef5518a9cd9fc7b52dd62a64028bd9cb6d6ad282a0f0fc90a4ae52"}, + "floki": {:hex, :floki, "0.27.0", "6b29a14283f1e2e8fad824bc930eaa9477c462022075df6bea8f0ad811c13599", [:mix], [{:html_entities, "~> 0.5.0", [hex: :html_entities, repo: "hexpm", optional: false]}], "hexpm", "583b8c13697c37179f1f82443bcc7ad2f76fbc0bf4c186606eebd658f7f2631b"}, "gettext": {:hex, :gettext, "0.18.0", "406d6b9e0e3278162c2ae1de0a60270452c553536772167e2d701f028116f870", [:mix], [], "hexpm", "c3f850be6367ebe1a08616c2158affe4a23231c70391050bf359d5f92f66a571"}, "hackney": {:hex, :hackney, "1.16.0", "5096ac8e823e3a441477b2d187e30dd3fff1a82991a806b2003845ce72ce2d84", [:rebar3], [{:certifi, "2.5.2", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.1", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.0", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.6", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "3bf0bebbd5d3092a3543b783bf065165fa5d3ad4b899b836810e513064134e18"}, "html_entities": {:hex, :html_entities, "0.5.1", "1c9715058b42c35a2ab65edc5b36d0ea66dd083767bef6e3edb57870ef556549", [:mix], [], "hexpm", "30efab070904eb897ff05cd52fa61c1025d7f8ef3a9ca250bc4e6513d16c32de"}, @@ -27,6 +27,7 @@ "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, "mime": {:hex, :mime, "1.3.1", "30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8", [:mix], [], "hexpm", "6cbe761d6a0ca5a31a0931bf4c63204bceb64538e664a8ecf784a9a6f3b875f1"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, + "mix_test_watch": {:hex, :mix_test_watch, "1.0.2", "34900184cbbbc6b6ed616ed3a8ea9b791f9fd2088419352a6d3200525637f785", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "47ac558d8b06f684773972c6d04fcc15590abdb97aeb7666da19fcbfdc441a07"}, "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"}, "phoenix": {:hex, :phoenix, "1.5.3", "bfe0404e48ea03dfe17f141eff34e1e058a23f15f109885bbdcf62be303b49ff", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8e16febeb9640d8b33895a691a56481464b82836d338bb3a23125cd7b6157c25"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.1.0", "a044d0756d0464c5a541b4a0bf4bcaf89bffcaf92468862408290682c73ae50d", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.9", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "c5e666a341ff104d0399d8f0e4ff094559b2fde13a5985d4cb5023b2c2ac558b"},