From bbdad8556861c60ae1f526f63de9c5857c4ad547 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Fri, 8 May 2020 23:06:47 +0300 Subject: [PATCH 001/182] Initial implementation of image preview proxy. Media proxy tests refactoring. --- config/config.exs | 5 + lib/pleroma/helpers/mogrify_helper.ex | 25 ++++ .../web/mastodon_api/views/status_view.ex | 3 +- lib/pleroma/web/media_proxy/media_proxy.ex | 53 ++++++- .../web/media_proxy/media_proxy_controller.ex | 78 ++++++++-- lib/pleroma/web/router.ex | 2 + test/web/media_proxy/media_proxy_test.exs | 133 +++++++----------- 7 files changed, 198 insertions(+), 101 deletions(-) create mode 100644 lib/pleroma/helpers/mogrify_helper.ex diff --git a/config/config.exs b/config/config.exs index e703c1632..526901f83 100644 --- a/config/config.exs +++ b/config/config.exs @@ -388,6 +388,11 @@ config :pleroma, :media_proxy, ], whitelist: [] +config :pleroma, :media_preview_proxy, + enabled: false, + limit_dimensions: "400x200", + max_body_length: 25 * 1_048_576 + config :pleroma, :chat, enabled: true config :phoenix, :format_encoders, json: Jason diff --git a/lib/pleroma/helpers/mogrify_helper.ex b/lib/pleroma/helpers/mogrify_helper.ex new file mode 100644 index 000000000..67edb35c3 --- /dev/null +++ b/lib/pleroma/helpers/mogrify_helper.ex @@ -0,0 +1,25 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Helpers.MogrifyHelper do + @moduledoc """ + Handles common Mogrify operations. + """ + + @spec store_as_temporary_file(String.t(), binary()) :: {:ok, String.t()} | {:error, atom()} + @doc "Stores binary content fetched from specified URL as a temporary file." + def store_as_temporary_file(url, body) do + path = Mogrify.temporary_path_for(%{path: url}) + with :ok <- File.write(path, body), do: {:ok, path} + end + + @spec store_as_temporary_file(String.t(), String.t()) :: Mogrify.Image.t() | any() + @doc "Modifies file at specified path by resizing to specified limit dimensions." + def in_place_resize_to_limit(path, resize_dimensions) do + path + |> Mogrify.open() + |> Mogrify.resize_to_limit(resize_dimensions) + |> Mogrify.save(in_place: true) + end +end diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index 24167f66f..2a206f743 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -419,6 +419,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do [attachment_url | _] = attachment["url"] media_type = attachment_url["mediaType"] || attachment_url["mimeType"] || "image" href = attachment_url["href"] |> MediaProxy.url() + href_preview = attachment_url["href"] |> MediaProxy.preview_url() type = cond do @@ -434,7 +435,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do id: to_string(attachment["id"] || hash_id), url: href, remote_url: href, - preview_url: href, + preview_url: href_preview, text_url: href, type: type, description: attachment["name"], diff --git a/lib/pleroma/web/media_proxy/media_proxy.ex b/lib/pleroma/web/media_proxy/media_proxy.ex index b2b524524..f4791c758 100644 --- a/lib/pleroma/web/media_proxy/media_proxy.ex +++ b/lib/pleroma/web/media_proxy/media_proxy.ex @@ -20,6 +20,14 @@ defmodule Pleroma.Web.MediaProxy do end end + def preview_url(url) do + if disabled?() or whitelisted?(url) do + url + else + encode_preview_url(url) + end + end + defp disabled?, do: !Config.get([:media_proxy, :enabled], false) defp local?(url), do: String.starts_with?(url, Pleroma.Web.base_url()) @@ -43,17 +51,29 @@ defmodule Pleroma.Web.MediaProxy do end) end - def encode_url(url) do + defp base64_sig64(url) do base64 = Base.url_encode64(url, @base64_opts) sig64 = base64 - |> signed_url + |> signed_url() |> Base.url_encode64(@base64_opts) + {base64, sig64} + end + + def encode_url(url) do + {base64, sig64} = base64_sig64(url) + build_url(sig64, base64, filename(url)) end + def encode_preview_url(url) do + {base64, sig64} = base64_sig64(url) + + build_preview_url(sig64, base64, filename(url)) + end + def decode_url(sig, url) do with {:ok, sig} <- Base.url_decode64(sig, @base64_opts), signature when signature == sig <- signed_url(url) do @@ -71,10 +91,10 @@ defmodule Pleroma.Web.MediaProxy do if path = URI.parse(url_or_path).path, do: Path.basename(path) end - def build_url(sig_base64, url_base64, filename \\ nil) do + defp proxy_url(path, sig_base64, url_base64, filename) do [ Pleroma.Config.get([:media_proxy, :base_url], Web.base_url()), - "proxy", + path, sig_base64, url_base64, filename @@ -82,4 +102,29 @@ defmodule Pleroma.Web.MediaProxy do |> Enum.filter(& &1) |> Path.join() end + + def build_url(sig_base64, url_base64, filename \\ nil) do + proxy_url("proxy", sig_base64, url_base64, filename) + end + + def build_preview_url(sig_base64, url_base64, filename \\ nil) do + proxy_url("proxy/preview", sig_base64, url_base64, filename) + end + + def filename_matches(%{"filename" => _} = _, path, url) do + filename = filename(url) + + if filename && not basename_matches?(path, filename) do + {:wrong_filename, filename} + else + :ok + end + end + + def filename_matches(_, _, _), do: :ok + + defp basename_matches?(path, filename) do + basename = Path.basename(path) + basename == filename or URI.decode(basename) == filename or URI.encode(basename) == filename + end end diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 4657a4383..fe3f61c18 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -5,19 +5,21 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do use Pleroma.Web, :controller + alias Pleroma.Config + alias Pleroma.Helpers.MogrifyHelper alias Pleroma.ReverseProxy alias Pleroma.Web.MediaProxy @default_proxy_opts [max_body_length: 25 * 1_048_576, http: [follow_redirect: true]] def remote(conn, %{"sig" => sig64, "url" => url64} = params) do - with config <- Pleroma.Config.get([:media_proxy], []), - true <- Keyword.get(config, :enabled, false), + with config <- Config.get([:media_proxy], []), + {_, true} <- {:enabled, Keyword.get(config, :enabled, false)}, {:ok, url} <- MediaProxy.decode_url(sig64, url64), - :ok <- filename_matches(params, conn.request_path, url) do + :ok <- MediaProxy.filename_matches(params, conn.request_path, url) do ReverseProxy.call(conn, url, Keyword.get(config, :proxy_opts, @default_proxy_opts)) else - false -> + {:enabled, false} -> send_resp(conn, 404, Plug.Conn.Status.reason_phrase(404)) {:error, :invalid_signature} -> @@ -28,20 +30,68 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end - def filename_matches(%{"filename" => _} = _, path, url) do - filename = MediaProxy.filename(url) - - if filename && does_not_match(path, filename) do - {:wrong_filename, filename} + def preview(conn, %{"sig" => sig64, "url" => url64} = params) do + with {_, true} <- {:enabled, Config.get([:media_preview_proxy, :enabled], false)}, + {:ok, url} <- MediaProxy.decode_url(sig64, url64), + :ok <- MediaProxy.filename_matches(params, conn.request_path, url) do + handle_preview(conn, url) else - :ok + {:enabled, false} -> + send_resp(conn, 404, Plug.Conn.Status.reason_phrase(404)) + + {:error, :invalid_signature} -> + send_resp(conn, 403, Plug.Conn.Status.reason_phrase(403)) + + {:wrong_filename, filename} -> + redirect(conn, external: MediaProxy.build_preview_url(sig64, url64, filename)) end end - def filename_matches(_, _, _), do: :ok + defp handle_preview(conn, url) do + with {:ok, %{status: status} = head_response} when status in 200..299 <- Tesla.head(url), + {_, true} <- {:acceptable_content_length, acceptable_body_length?(head_response)} do + content_type = Tesla.get_header(head_response, "content-type") + handle_preview(content_type, conn, url) + else + {_, %{status: status}} -> + send_resp(conn, :failed_dependency, "Can't fetch HTTP headers (HTTP #{status}).") - defp does_not_match(path, filename) do - basename = Path.basename(path) - basename != filename and URI.decode(basename) != filename and URI.encode(basename) != filename + {:acceptable_content_length, false} -> + send_resp(conn, :unprocessable_entity, "Source file size exceeds limit.") + end + end + + defp handle_preview("image/" <> _, %{params: params} = conn, url) do + with {:ok, %{status: status, body: body}} when status in 200..299 <- Tesla.get(url), + {:ok, path} <- MogrifyHelper.store_as_temporary_file(url, body), + resize_dimensions <- + Map.get( + params, + "limit_dimensions", + Config.get([:media_preview_proxy, :limit_dimensions]) + ), + %Mogrify.Image{} <- MogrifyHelper.in_place_resize_to_limit(path, resize_dimensions) do + send_file(conn, 200, path) + else + {_, %{status: _}} -> + send_resp(conn, :failed_dependency, "Can't fetch the image.") + + _ -> + send_resp(conn, :failed_dependency, "Can't handle image preview.") + end + end + + defp handle_preview(content_type, conn, _url) do + send_resp(conn, :unprocessable_entity, "Unsupported content type: #{content_type}.") + end + + defp acceptable_body_length?(head_response) do + max_body_length = Config.get([:media_preview_proxy, :max_body_length], nil) + content_length = Tesla.get_header(head_response, "content-length") + content_length = with {int, _} <- Integer.parse(content_length), do: int + + content_length == :error or + max_body_length in [nil, :infinity] or + content_length <= max_body_length end end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 7a171f9fb..6fb47029a 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -663,6 +663,8 @@ defmodule Pleroma.Web.Router do end scope "/proxy/", Pleroma.Web.MediaProxy do + get("/preview/:sig/:url", MediaProxyController, :preview) + get("/preview/:sig/:url/:filename", MediaProxyController, :preview) get("/:sig/:url", MediaProxyController, :remote) get("/:sig/:url/:filename", MediaProxyController, :remote) end diff --git a/test/web/media_proxy/media_proxy_test.exs b/test/web/media_proxy/media_proxy_test.exs index 69c2d5dae..cad0acd30 100644 --- a/test/web/media_proxy/media_proxy_test.exs +++ b/test/web/media_proxy/media_proxy_test.exs @@ -5,42 +5,44 @@ defmodule Pleroma.Web.MediaProxyTest do use ExUnit.Case use Pleroma.Tests.Helpers - import Pleroma.Web.MediaProxy - alias Pleroma.Web.MediaProxy.MediaProxyController - setup do: clear_config([:media_proxy, :enabled]) - setup do: clear_config(Pleroma.Upload) + alias Pleroma.Config + alias Pleroma.Web.Endpoint + alias Pleroma.Web.MediaProxy + + defp decode_result(encoded) do + [_, "proxy", sig, base64 | _] = URI.parse(encoded).path |> String.split("/") + {:ok, decoded} = MediaProxy.decode_url(sig, base64) + decoded + end describe "when enabled" do - setup do - Pleroma.Config.put([:media_proxy, :enabled], true) - :ok - end + setup do: clear_config([:media_proxy, :enabled], true) test "ignores invalid url" do - assert url(nil) == nil - assert url("") == nil + assert MediaProxy.url(nil) == nil + assert MediaProxy.url("") == nil end test "ignores relative url" do - assert url("/local") == "/local" - assert url("/") == "/" + assert MediaProxy.url("/local") == "/local" + assert MediaProxy.url("/") == "/" end test "ignores local url" do - local_url = Pleroma.Web.Endpoint.url() <> "/hello" - local_root = Pleroma.Web.Endpoint.url() - assert url(local_url) == local_url - assert url(local_root) == local_root + local_url = Endpoint.url() <> "/hello" + local_root = Endpoint.url() + assert MediaProxy.url(local_url) == local_url + assert MediaProxy.url(local_root) == local_root end test "encodes and decodes URL" do url = "https://pleroma.soykaf.com/static/logo.png" - encoded = url(url) + encoded = MediaProxy.url(url) assert String.starts_with?( encoded, - Pleroma.Config.get([:media_proxy, :base_url], Pleroma.Web.base_url()) + Config.get([:media_proxy, :base_url], Pleroma.Web.base_url()) ) assert String.ends_with?(encoded, "/logo.png") @@ -50,62 +52,59 @@ defmodule Pleroma.Web.MediaProxyTest do test "encodes and decodes URL without a path" do url = "https://pleroma.soykaf.com" - encoded = url(url) + encoded = MediaProxy.url(url) assert decode_result(encoded) == url end test "encodes and decodes URL without an extension" do url = "https://pleroma.soykaf.com/path/" - encoded = url(url) + encoded = MediaProxy.url(url) assert String.ends_with?(encoded, "/path") assert decode_result(encoded) == url end test "encodes and decodes URL and ignores query params for the path" do url = "https://pleroma.soykaf.com/static/logo.png?93939393939&bunny=true" - encoded = url(url) + encoded = MediaProxy.url(url) assert String.ends_with?(encoded, "/logo.png") assert decode_result(encoded) == url end test "validates signature" do - secret_key_base = Pleroma.Config.get([Pleroma.Web.Endpoint, :secret_key_base]) + secret_key_base = Config.get([Endpoint, :secret_key_base]) + clear_config([Endpoint, :secret_key_base], secret_key_base) - on_exit(fn -> - Pleroma.Config.put([Pleroma.Web.Endpoint, :secret_key_base], secret_key_base) - end) + encoded = MediaProxy.url("https://pleroma.social") - encoded = url("https://pleroma.social") - - Pleroma.Config.put( - [Pleroma.Web.Endpoint, :secret_key_base], + Config.put( + [Endpoint, :secret_key_base], "00000000000000000000000000000000000000000000000" ) [_, "proxy", sig, base64 | _] = URI.parse(encoded).path |> String.split("/") - assert decode_url(sig, base64) == {:error, :invalid_signature} + assert MediaProxy.decode_url(sig, base64) == {:error, :invalid_signature} end - test "filename_matches preserves the encoded or decoded path" do - assert MediaProxyController.filename_matches( + test "`filename_matches/_` preserves the encoded or decoded path" do + assert MediaProxy.filename_matches( %{"filename" => "/Hello world.jpg"}, "/Hello world.jpg", "http://pleroma.social/Hello world.jpg" ) == :ok - assert MediaProxyController.filename_matches( + assert MediaProxy.filename_matches( %{"filename" => "/Hello%20world.jpg"}, "/Hello%20world.jpg", "http://pleroma.social/Hello%20world.jpg" ) == :ok - assert MediaProxyController.filename_matches( + assert MediaProxy.filename_matches( %{"filename" => "/my%2Flong%2Furl%2F2019%2F07%2FS.jpg"}, "/my%2Flong%2Furl%2F2019%2F07%2FS.jpg", "http://pleroma.social/my%2Flong%2Furl%2F2019%2F07%2FS.jpg" ) == :ok - assert MediaProxyController.filename_matches( + assert MediaProxy.filename_matches( %{"filename" => "/my%2Flong%2Furl%2F2019%2F07%2FS.jp"}, "/my%2Flong%2Furl%2F2019%2F07%2FS.jp", "http://pleroma.social/my%2Flong%2Furl%2F2019%2F07%2FS.jpg" @@ -116,7 +115,7 @@ defmodule Pleroma.Web.MediaProxyTest do # conn.request_path will return encoded url request_path = "/ANALYSE-DAI-_-LE-STABLECOIN-100-D%C3%89CENTRALIS%C3%89-BQ.jpg" - assert MediaProxyController.filename_matches( + assert MediaProxy.filename_matches( true, request_path, "https://mydomain.com/uploads/2019/07/ANALYSE-DAI-_-LE-STABLECOIN-100-DÉCENTRALISÉ-BQ.jpg" @@ -124,20 +123,12 @@ defmodule Pleroma.Web.MediaProxyTest do end test "uses the configured base_url" do - base_url = Pleroma.Config.get([:media_proxy, :base_url]) - - if base_url do - on_exit(fn -> - Pleroma.Config.put([:media_proxy, :base_url], base_url) - end) - end - - Pleroma.Config.put([:media_proxy, :base_url], "https://cache.pleroma.social") + clear_config([:media_proxy, :base_url], "https://cache.pleroma.social") url = "https://pleroma.soykaf.com/static/logo.png" - encoded = url(url) + encoded = MediaProxy.url(url) - assert String.starts_with?(encoded, Pleroma.Config.get([:media_proxy, :base_url])) + assert String.starts_with?(encoded, Config.get([:media_proxy, :base_url])) end # Some sites expect ASCII encoded characters in the URL to be preserved even if @@ -148,7 +139,7 @@ defmodule Pleroma.Web.MediaProxyTest do url = "https://pleroma.com/%20/%21/%22/%23/%24/%25/%26/%27/%28/%29/%2A/%2B/%2C/%2D/%2E/%2F/%30/%31/%32/%33/%34/%35/%36/%37/%38/%39/%3A/%3B/%3C/%3D/%3E/%3F/%40/%41/%42/%43/%44/%45/%46/%47/%48/%49/%4A/%4B/%4C/%4D/%4E/%4F/%50/%51/%52/%53/%54/%55/%56/%57/%58/%59/%5A/%5B/%5C/%5D/%5E/%5F/%60/%61/%62/%63/%64/%65/%66/%67/%68/%69/%6A/%6B/%6C/%6D/%6E/%6F/%70/%71/%72/%73/%74/%75/%76/%77/%78/%79/%7A/%7B/%7C/%7D/%7E/%7F/%80/%81/%82/%83/%84/%85/%86/%87/%88/%89/%8A/%8B/%8C/%8D/%8E/%8F/%90/%91/%92/%93/%94/%95/%96/%97/%98/%99/%9A/%9B/%9C/%9D/%9E/%9F/%C2%A0/%A1/%A2/%A3/%A4/%A5/%A6/%A7/%A8/%A9/%AA/%AB/%AC/%C2%AD/%AE/%AF/%B0/%B1/%B2/%B3/%B4/%B5/%B6/%B7/%B8/%B9/%BA/%BB/%BC/%BD/%BE/%BF/%C0/%C1/%C2/%C3/%C4/%C5/%C6/%C7/%C8/%C9/%CA/%CB/%CC/%CD/%CE/%CF/%D0/%D1/%D2/%D3/%D4/%D5/%D6/%D7/%D8/%D9/%DA/%DB/%DC/%DD/%DE/%DF/%E0/%E1/%E2/%E3/%E4/%E5/%E6/%E7/%E8/%E9/%EA/%EB/%EC/%ED/%EE/%EF/%F0/%F1/%F2/%F3/%F4/%F5/%F6/%F7/%F8/%F9/%FA/%FB/%FC/%FD/%FE/%FF" - encoded = url(url) + encoded = MediaProxy.url(url) assert decode_result(encoded) == url end @@ -159,77 +150,55 @@ defmodule Pleroma.Web.MediaProxyTest do url = "https://pleroma.com/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-._~:/?#[]@!$&'()*+,;=|^`{}" - encoded = url(url) + encoded = MediaProxy.url(url) assert decode_result(encoded) == url end test "preserve unicode characters" do url = "https://ko.wikipedia.org/wiki/위키백과:대문" - encoded = url(url) + encoded = MediaProxy.url(url) assert decode_result(encoded) == url end end describe "when disabled" do - setup do - enabled = Pleroma.Config.get([:media_proxy, :enabled]) - - if enabled do - Pleroma.Config.put([:media_proxy, :enabled], false) - - on_exit(fn -> - Pleroma.Config.put([:media_proxy, :enabled], enabled) - :ok - end) - end - - :ok - end + setup do: clear_config([:media_proxy, :enabled], false) test "does not encode remote urls" do - assert url("https://google.fr") == "https://google.fr" + assert MediaProxy.url("https://google.fr") == "https://google.fr" end end - defp decode_result(encoded) do - [_, "proxy", sig, base64 | _] = URI.parse(encoded).path |> String.split("/") - {:ok, decoded} = decode_url(sig, base64) - decoded - end - describe "whitelist" do - setup do - Pleroma.Config.put([:media_proxy, :enabled], true) - :ok - end + setup do: clear_config([:media_proxy, :enabled], true) test "mediaproxy whitelist" do - Pleroma.Config.put([:media_proxy, :whitelist], ["google.com", "feld.me"]) + clear_config([:media_proxy, :whitelist], ["google.com", "feld.me"]) url = "https://feld.me/foo.png" - unencoded = url(url) + unencoded = MediaProxy.url(url) assert unencoded == url end test "does not change whitelisted urls" do - Pleroma.Config.put([:media_proxy, :whitelist], ["mycdn.akamai.com"]) - Pleroma.Config.put([:media_proxy, :base_url], "https://cache.pleroma.social") + clear_config([:media_proxy, :whitelist], ["mycdn.akamai.com"]) + clear_config([:media_proxy, :base_url], "https://cache.pleroma.social") media_url = "https://mycdn.akamai.com" url = "#{media_url}/static/logo.png" - encoded = url(url) + encoded = MediaProxy.url(url) assert String.starts_with?(encoded, media_url) end test "ensure Pleroma.Upload base_url is always whitelisted" do media_url = "https://media.pleroma.social" - Pleroma.Config.put([Pleroma.Upload, :base_url], media_url) + clear_config([Pleroma.Upload, :base_url], media_url) url = "#{media_url}/static/logo.png" - encoded = url(url) + encoded = MediaProxy.url(url) assert String.starts_with?(encoded, media_url) end From 1b23acf164ebc4fde3fe1e4fdca6e11b7caa90ef Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Mon, 11 May 2020 23:21:53 +0300 Subject: [PATCH 002/182] [#2497] Media preview proxy for images: fixes, tweaks, refactoring, tests adjustments. --- config/config.exs | 8 ++- lib/pleroma/reverse_proxy/reverse_proxy.ex | 4 ++ lib/pleroma/web/media_proxy/media_proxy.ex | 33 +++++++--- .../web/media_proxy/media_proxy_controller.ex | 62 ++++++++++------- mix.exs | 1 + mix.lock | 2 + test/web/media_proxy/media_proxy_test.exs | 66 +++++++++++++------ 7 files changed, 119 insertions(+), 57 deletions(-) diff --git a/config/config.exs b/config/config.exs index 526901f83..0f92b1ef9 100644 --- a/config/config.exs +++ b/config/config.exs @@ -381,6 +381,8 @@ config :pleroma, :media_proxy, proxy_opts: [ redirect_on_failure: false, max_body_length: 25 * 1_048_576, + # Note: max_read_duration defaults to Pleroma.ReverseProxy.max_read_duration_default/1 + max_read_duration: 30_000, http: [ follow_redirect: true, pool: :media @@ -388,10 +390,14 @@ config :pleroma, :media_proxy, ], whitelist: [] +# Note: media preview proxy depends on media proxy to be enabled config :pleroma, :media_preview_proxy, enabled: false, limit_dimensions: "400x200", - max_body_length: 25 * 1_048_576 + proxy_opts: [ + head_request_max_read_duration: 5_000, + max_read_duration: 10_000 + ] config :pleroma, :chat, enabled: true diff --git a/lib/pleroma/reverse_proxy/reverse_proxy.ex b/lib/pleroma/reverse_proxy/reverse_proxy.ex index 4bbeb493c..aeaf9bd39 100644 --- a/lib/pleroma/reverse_proxy/reverse_proxy.ex +++ b/lib/pleroma/reverse_proxy/reverse_proxy.ex @@ -16,6 +16,8 @@ defmodule Pleroma.ReverseProxy do @failed_request_ttl :timer.seconds(60) @methods ~w(GET HEAD) + def max_read_duration_default, do: @max_read_duration + @moduledoc """ A reverse proxy. @@ -370,6 +372,8 @@ defmodule Pleroma.ReverseProxy do defp body_size_constraint(_, _), do: :ok + defp check_read_duration(nil = _duration, max), do: check_read_duration(@max_read_duration, max) + defp check_read_duration(duration, max) when is_integer(duration) and is_integer(max) and max > 0 do if duration > max do diff --git a/lib/pleroma/web/media_proxy/media_proxy.ex b/lib/pleroma/web/media_proxy/media_proxy.ex index f4791c758..4e01c14e4 100644 --- a/lib/pleroma/web/media_proxy/media_proxy.ex +++ b/lib/pleroma/web/media_proxy/media_proxy.ex @@ -13,26 +13,32 @@ defmodule Pleroma.Web.MediaProxy do def url("/" <> _ = url), do: url def url(url) do - if disabled?() or local?(url) or whitelisted?(url) do + if not enabled?() or local?(url) or whitelisted?(url) do url else encode_url(url) end end + # Note: routing all URLs to preview handler (even local and whitelisted). + # Preview handler will call url/1 on decoded URLs, and applicable ones will detour media proxy. def preview_url(url) do - if disabled?() or whitelisted?(url) do - url - else + if preview_enabled?() do encode_preview_url(url) + else + url end end - defp disabled?, do: !Config.get([:media_proxy, :enabled], false) + def enabled?, do: Config.get([:media_proxy, :enabled], false) - defp local?(url), do: String.starts_with?(url, Pleroma.Web.base_url()) + # Note: media proxy must be enabled for media preview proxy in order to load all + # non-local non-whitelisted URLs through it and be sure that body size constraint is preserved. + def preview_enabled?, do: enabled?() and Config.get([:media_preview_proxy, :enabled], false) - defp whitelisted?(url) do + def local?(url), do: String.starts_with?(url, Pleroma.Web.base_url()) + + def whitelisted?(url) do %{host: domain} = URI.parse(url) mediaproxy_whitelist = Config.get([:media_proxy, :whitelist]) @@ -111,17 +117,24 @@ defmodule Pleroma.Web.MediaProxy do proxy_url("proxy/preview", sig_base64, url_base64, filename) end - def filename_matches(%{"filename" => _} = _, path, url) do + def verify_request_path_and_url( + %Plug.Conn{params: %{"filename" => _}, request_path: request_path}, + url + ) do + verify_request_path_and_url(request_path, url) + end + + def verify_request_path_and_url(request_path, url) when is_binary(request_path) do filename = filename(url) - if filename && not basename_matches?(path, filename) do + if filename && not basename_matches?(request_path, filename) do {:wrong_filename, filename} else :ok end end - def filename_matches(_, _, _), do: :ok + def verify_request_path_and_url(_, _), do: :ok defp basename_matches?(path, filename) do basename = Path.basename(path) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index fe3f61c18..157365e08 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -10,14 +10,12 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do alias Pleroma.ReverseProxy alias Pleroma.Web.MediaProxy - @default_proxy_opts [max_body_length: 25 * 1_048_576, http: [follow_redirect: true]] - - def remote(conn, %{"sig" => sig64, "url" => url64} = params) do - with config <- Config.get([:media_proxy], []), - {_, true} <- {:enabled, Keyword.get(config, :enabled, false)}, + def remote(conn, %{"sig" => sig64, "url" => url64}) do + with {_, true} <- {:enabled, MediaProxy.enabled?()}, {:ok, url} <- MediaProxy.decode_url(sig64, url64), - :ok <- MediaProxy.filename_matches(params, conn.request_path, url) do - ReverseProxy.call(conn, url, Keyword.get(config, :proxy_opts, @default_proxy_opts)) + :ok <- MediaProxy.verify_request_path_and_url(conn, url) do + proxy_opts = Config.get([:media_proxy, :proxy_opts], []) + ReverseProxy.call(conn, url, proxy_opts) else {:enabled, false} -> send_resp(conn, 404, Plug.Conn.Status.reason_phrase(404)) @@ -30,10 +28,10 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end - def preview(conn, %{"sig" => sig64, "url" => url64} = params) do - with {_, true} <- {:enabled, Config.get([:media_preview_proxy, :enabled], false)}, + def preview(conn, %{"sig" => sig64, "url" => url64}) do + with {_, true} <- {:enabled, MediaProxy.preview_enabled?()}, {:ok, url} <- MediaProxy.decode_url(sig64, url64), - :ok <- MediaProxy.filename_matches(params, conn.request_path, url) do + :ok <- MediaProxy.verify_request_path_and_url(conn, url) do handle_preview(conn, url) else {:enabled, false} -> @@ -48,21 +46,27 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end defp handle_preview(conn, url) do - with {:ok, %{status: status} = head_response} when status in 200..299 <- Tesla.head(url), - {_, true} <- {:acceptable_content_length, acceptable_body_length?(head_response)} do + with {:ok, %{status: status} = head_response} when status in 200..299 <- + Tesla.head(url, opts: [adapter: [timeout: preview_head_request_timeout()]]) do content_type = Tesla.get_header(head_response, "content-type") handle_preview(content_type, conn, url) else {_, %{status: status}} -> send_resp(conn, :failed_dependency, "Can't fetch HTTP headers (HTTP #{status}).") - {:acceptable_content_length, false} -> - send_resp(conn, :unprocessable_entity, "Source file size exceeds limit.") + {:error, :recv_response_timeout} -> + send_resp(conn, :failed_dependency, "HEAD request timeout.") + + _ -> + send_resp(conn, :failed_dependency, "Can't fetch HTTP headers.") end end - defp handle_preview("image/" <> _, %{params: params} = conn, url) do - with {:ok, %{status: status, body: body}} when status in 200..299 <- Tesla.get(url), + defp handle_preview("image/" <> _ = content_type, %{params: params} = conn, url) do + with {:ok, %{status: status, body: body}} when status in 200..299 <- + url + |> MediaProxy.url() + |> Tesla.get(opts: [adapter: [timeout: preview_timeout()]]), {:ok, path} <- MogrifyHelper.store_as_temporary_file(url, body), resize_dimensions <- Map.get( @@ -70,12 +74,19 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do "limit_dimensions", Config.get([:media_preview_proxy, :limit_dimensions]) ), - %Mogrify.Image{} <- MogrifyHelper.in_place_resize_to_limit(path, resize_dimensions) do - send_file(conn, 200, path) + %Mogrify.Image{} <- MogrifyHelper.in_place_resize_to_limit(path, resize_dimensions), + {:ok, image_binary} <- File.read(path), + _ <- File.rm(path) do + conn + |> put_resp_header("content-type", content_type) + |> send_resp(200, image_binary) else {_, %{status: _}} -> send_resp(conn, :failed_dependency, "Can't fetch the image.") + {:error, :recv_response_timeout} -> + send_resp(conn, :failed_dependency, "Downstream timeout.") + _ -> send_resp(conn, :failed_dependency, "Can't handle image preview.") end @@ -85,13 +96,14 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do send_resp(conn, :unprocessable_entity, "Unsupported content type: #{content_type}.") end - defp acceptable_body_length?(head_response) do - max_body_length = Config.get([:media_preview_proxy, :max_body_length], nil) - content_length = Tesla.get_header(head_response, "content-length") - content_length = with {int, _} <- Integer.parse(content_length), do: int + defp preview_head_request_timeout do + Config.get([:media_preview_proxy, :proxy_opts, :head_request_max_read_duration]) || + preview_timeout() + end - content_length == :error or - max_body_length in [nil, :infinity] or - content_length <= max_body_length + defp preview_timeout do + Config.get([:media_preview_proxy, :proxy_opts, :max_read_duration]) || + Config.get([:media_proxy, :proxy_opts, :max_read_duration]) || + ReverseProxy.max_read_duration_default() end end diff --git a/mix.exs b/mix.exs index 6d65e18d4..a9c4ad2e3 100644 --- a/mix.exs +++ b/mix.exs @@ -139,6 +139,7 @@ defmodule Pleroma.Mixfile do github: "ninenines/gun", ref: "e1a69b36b180a574c0ac314ced9613fdd52312cc", override: true}, {:jason, "~> 1.0"}, {:mogrify, "~> 0.6.1"}, + {:eimp, ">= 0.0.0"}, {:ex_aws, "~> 2.1"}, {:ex_aws_s3, "~> 2.0"}, {:sweet_xml, "~> 0.6.6"}, diff --git a/mix.lock b/mix.lock index c400202b7..ede7b0ada 100644 --- a/mix.lock +++ b/mix.lock @@ -29,6 +29,7 @@ "ecto": {:hex, :ecto, "3.4.0", "a7a83ab8359bf816ce729e5e65981ce25b9fc5adfc89c2ea3980f4fed0bfd7c1", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "5eed18252f5b5bbadec56a24112b531343507dbe046273133176b12190ce19cc"}, "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_sql": {:hex, :ecto_sql, "3.3.4", "aa18af12eb875fbcda2f75e608b3bd534ebf020fc4f6448e4672fcdcbb081244", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.4 or ~> 3.3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5eccbdbf92e3c6f213007a82d5dbba4cd9bb659d1a21331f89f408e4c0efd7a8"}, + "eimp": {:hex, :eimp, "1.0.14", "fc297f0c7e2700457a95a60c7010a5f1dcb768a083b6d53f49cd94ab95a28f22", [:rebar3], [{:p1_utils, "1.0.18", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "501133f3112079b92d9e22da8b88bf4f0e13d4d67ae9c15c42c30bd25ceb83b6"}, "esshd": {:hex, :esshd, "0.1.1", "d4dd4c46698093a40a56afecce8a46e246eb35463c457c246dacba2e056f31b5", [:mix], [], "hexpm", "d73e341e3009d390aa36387dc8862860bf9f874c94d9fd92ade2926376f49981"}, "eternal": {:hex, :eternal, "1.2.1", "d5b6b2499ba876c57be2581b5b999ee9bdf861c647401066d3eeed111d096bc4", [:mix], [], "hexpm", "b14f1dc204321429479c569cfbe8fb287541184ed040956c8862cb7a677b8406"}, "ex2ms": {:hex, :ex2ms, "1.5.0", "19e27f9212be9a96093fed8cdfbef0a2b56c21237196d26760f11dfcfae58e97", [:mix], [], "hexpm"}, @@ -75,6 +76,7 @@ "nodex": {:git, "https://git.pleroma.social/pleroma/nodex", "cb6730f943cfc6aad674c92161be23a8411f15d1", [ref: "cb6730f943cfc6aad674c92161be23a8411f15d1"]}, "oban": {:hex, :oban, "1.2.0", "7cca94d341be43d220571e28f69131c4afc21095b25257397f50973d3fc59b07", [:mix], [{:ecto_sql, "~> 3.1", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ba5f8b3f7d76967b3e23cf8014f6a13e4ccb33431e4808f036709a7f822362ee"}, "open_api_spex": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/open_api_spex.git", "b862ebd78de0df95875cf46feb6e9607130dc2a8", [ref: "b862ebd78de0df95875cf46feb6e9607130dc2a8"]}, + "p1_utils": {:hex, :p1_utils, "1.0.18", "3fe224de5b2e190d730a3c5da9d6e8540c96484cf4b4692921d1e28f0c32b01c", [:rebar3], [], "hexpm", "1fc8773a71a15553b179c986b22fbeead19b28fe486c332d4929700ffeb71f88"}, "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"}, "pbkdf2_elixir": {:hex, :pbkdf2_elixir, "0.12.4", "8dd29ed783f2e12195d7e0a4640effc0a7c37e6537da491f1db01839eee6d053", [:mix], [], "hexpm", "595d09db74cb093b1903381c9de423276a931a2480a46a1a5dc7f932a2a6375b"}, "phoenix": {:hex, :phoenix, "1.4.13", "67271ad69b51f3719354604f4a3f968f83aa61c19199343656c9caee057ff3b8", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 1.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.8.1 or ~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ab765a0feddb81fc62e2116c827b5f068df85159c162bee760745276ad7ddc1b"}, diff --git a/test/web/media_proxy/media_proxy_test.exs b/test/web/media_proxy/media_proxy_test.exs index cad0acd30..ac5d8fd32 100644 --- a/test/web/media_proxy/media_proxy_test.exs +++ b/test/web/media_proxy/media_proxy_test.exs @@ -85,38 +85,62 @@ defmodule Pleroma.Web.MediaProxyTest do assert MediaProxy.decode_url(sig, base64) == {:error, :invalid_signature} end - test "`filename_matches/_` preserves the encoded or decoded path" do - assert MediaProxy.filename_matches( - %{"filename" => "/Hello world.jpg"}, - "/Hello world.jpg", - "http://pleroma.social/Hello world.jpg" + def test_verify_request_path_and_url(request_path, url, expected_result) do + assert MediaProxy.verify_request_path_and_url(request_path, url) == expected_result + + assert MediaProxy.verify_request_path_and_url( + %Plug.Conn{ + params: %{"filename" => Path.basename(request_path)}, + request_path: request_path + }, + url + ) == expected_result + end + + test "if first arg of `verify_request_path_and_url/2` is a Plug.Conn without \"filename\" " <> + "parameter, `verify_request_path_and_url/2` returns :ok " do + assert MediaProxy.verify_request_path_and_url( + %Plug.Conn{params: %{}, request_path: "/some/path"}, + "https://instance.com/file.jpg" ) == :ok - assert MediaProxy.filename_matches( - %{"filename" => "/Hello%20world.jpg"}, - "/Hello%20world.jpg", - "http://pleroma.social/Hello%20world.jpg" + assert MediaProxy.verify_request_path_and_url( + %Plug.Conn{params: %{}, request_path: "/path/to/file.jpg"}, + "https://instance.com/file.jpg" ) == :ok + end - assert MediaProxy.filename_matches( - %{"filename" => "/my%2Flong%2Furl%2F2019%2F07%2FS.jpg"}, - "/my%2Flong%2Furl%2F2019%2F07%2FS.jpg", - "http://pleroma.social/my%2Flong%2Furl%2F2019%2F07%2FS.jpg" - ) == :ok + test "`verify_request_path_and_url/2` preserves the encoded or decoded path" do + test_verify_request_path_and_url( + "/Hello world.jpg", + "http://pleroma.social/Hello world.jpg", + :ok + ) - assert MediaProxy.filename_matches( - %{"filename" => "/my%2Flong%2Furl%2F2019%2F07%2FS.jp"}, - "/my%2Flong%2Furl%2F2019%2F07%2FS.jp", - "http://pleroma.social/my%2Flong%2Furl%2F2019%2F07%2FS.jpg" - ) == {:wrong_filename, "my%2Flong%2Furl%2F2019%2F07%2FS.jpg"} + test_verify_request_path_and_url( + "/Hello%20world.jpg", + "http://pleroma.social/Hello%20world.jpg", + :ok + ) + + test_verify_request_path_and_url( + "/my%2Flong%2Furl%2F2019%2F07%2FS.jpg", + "http://pleroma.social/my%2Flong%2Furl%2F2019%2F07%2FS.jpg", + :ok + ) + + test_verify_request_path_and_url( + "/my%2Flong%2Furl%2F2019%2F07%2FS", + "http://pleroma.social/my%2Flong%2Furl%2F2019%2F07%2FS.jpg", + {:wrong_filename, "my%2Flong%2Furl%2F2019%2F07%2FS.jpg"} + ) end test "encoded url are tried to match for proxy as `conn.request_path` encodes the url" do # conn.request_path will return encoded url request_path = "/ANALYSE-DAI-_-LE-STABLECOIN-100-D%C3%89CENTRALIS%C3%89-BQ.jpg" - assert MediaProxy.filename_matches( - true, + assert MediaProxy.verify_request_path_and_url( request_path, "https://mydomain.com/uploads/2019/07/ANALYSE-DAI-_-LE-STABLECOIN-100-DÉCENTRALISÉ-BQ.jpg" ) == :ok From f1f588fd5271c0b3bf09df002a83dbb57c42bae0 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Thu, 14 May 2020 20:18:31 +0300 Subject: [PATCH 003/182] [#2497] Added support for :eimp for image resizing. --- config/config.exs | 4 +- .../web/media_proxy/media_proxy_controller.ex | 64 +++++++++++++++---- mix.exs | 2 +- 3 files changed, 56 insertions(+), 14 deletions(-) diff --git a/config/config.exs b/config/config.exs index 0f92b1ef9..e9403c7c8 100644 --- a/config/config.exs +++ b/config/config.exs @@ -393,7 +393,9 @@ config :pleroma, :media_proxy, # Note: media preview proxy depends on media proxy to be enabled config :pleroma, :media_preview_proxy, enabled: false, - limit_dimensions: "400x200", + enable_eimp: true, + thumbnail_max_width: 400, + thumbnail_max_height: 200, proxy_opts: [ head_request_max_read_duration: 5_000, max_read_duration: 10_000 diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 157365e08..8d8d073e9 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -62,24 +62,64 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end + defp thumbnail_max_dimensions(params) do + config = Config.get([:media_preview_proxy], []) + + thumbnail_max_width = + if w = params["thumbnail_max_width"] do + String.to_integer(w) + else + Keyword.fetch!(config, :thumbnail_max_width) + end + + thumbnail_max_height = + if h = params["thumbnail_max_height"] do + String.to_integer(h) + else + Keyword.fetch!(config, :thumbnail_max_height) + end + + {thumbnail_max_width, thumbnail_max_height} + end + + defp thumbnail_binary(url, body, params) do + {thumbnail_max_width, thumbnail_max_height} = thumbnail_max_dimensions(params) + + with true <- Config.get([:media_preview_proxy, :enable_eimp]), + {:ok, [type: image_type, width: source_width, height: source_height]} <- + :eimp.identify(body), + scale_factor <- + Enum.max([source_width / thumbnail_max_width, source_height / thumbnail_max_height]), + {:ok, thumbnail_binary} = + :eimp.convert(body, image_type, [ + {:scale, {round(source_width / scale_factor), round(source_height / scale_factor)}} + ]) do + {:ok, thumbnail_binary} + else + _ -> + mogrify_dimensions = "#{thumbnail_max_width}x#{thumbnail_max_height}" + + with {:ok, path} <- MogrifyHelper.store_as_temporary_file(url, body), + %Mogrify.Image{} <- + MogrifyHelper.in_place_resize_to_limit(path, mogrify_dimensions), + {:ok, thumbnail_binary} <- File.read(path), + _ <- File.rm(path) do + {:ok, thumbnail_binary} + else + _ -> :error + end + end + end + defp handle_preview("image/" <> _ = content_type, %{params: params} = conn, url) do - with {:ok, %{status: status, body: body}} when status in 200..299 <- + with {:ok, %{status: status, body: image_contents}} when status in 200..299 <- url |> MediaProxy.url() |> Tesla.get(opts: [adapter: [timeout: preview_timeout()]]), - {:ok, path} <- MogrifyHelper.store_as_temporary_file(url, body), - resize_dimensions <- - Map.get( - params, - "limit_dimensions", - Config.get([:media_preview_proxy, :limit_dimensions]) - ), - %Mogrify.Image{} <- MogrifyHelper.in_place_resize_to_limit(path, resize_dimensions), - {:ok, image_binary} <- File.read(path), - _ <- File.rm(path) do + {:ok, thumbnail_binary} <- thumbnail_binary(url, image_contents, params) do conn |> put_resp_header("content-type", content_type) - |> send_resp(200, image_binary) + |> send_resp(200, thumbnail_binary) else {_, %{status: _}} -> send_resp(conn, :failed_dependency, "Can't fetch the image.") diff --git a/mix.exs b/mix.exs index a9c4ad2e3..332febe48 100644 --- a/mix.exs +++ b/mix.exs @@ -139,7 +139,7 @@ defmodule Pleroma.Mixfile do github: "ninenines/gun", ref: "e1a69b36b180a574c0ac314ced9613fdd52312cc", override: true}, {:jason, "~> 1.0"}, {:mogrify, "~> 0.6.1"}, - {:eimp, ">= 0.0.0"}, + {:eimp, "~> 1.0.14"}, {:ex_aws, "~> 2.1"}, {:ex_aws_s3, "~> 2.0"}, {:sweet_xml, "~> 0.6.6"}, From 1871a5ddb4a803ebe4fae6943a9b9c94f1f9c1a8 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Wed, 20 May 2020 20:26:43 +0300 Subject: [PATCH 004/182] [#2497] Image preview proxy: implemented ffmpeg-based resizing, removed eimp & mogrify-based resizing. --- config/config.exs | 1 - lib/pleroma/helpers/media_helper.ex | 62 +++++++++++++++++++ lib/pleroma/helpers/mogrify_helper.ex | 25 -------- .../web/media_proxy/media_proxy_controller.ex | 50 +++------------ mix.exs | 2 +- mix.lock | 2 + 6 files changed, 74 insertions(+), 68 deletions(-) create mode 100644 lib/pleroma/helpers/media_helper.ex delete mode 100644 lib/pleroma/helpers/mogrify_helper.ex diff --git a/config/config.exs b/config/config.exs index e9403c7c8..7de93511d 100644 --- a/config/config.exs +++ b/config/config.exs @@ -393,7 +393,6 @@ config :pleroma, :media_proxy, # Note: media preview proxy depends on media proxy to be enabled config :pleroma, :media_preview_proxy, enabled: false, - enable_eimp: true, thumbnail_max_width: 400, thumbnail_max_height: 200, proxy_opts: [ diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex new file mode 100644 index 000000000..6d1f8ab22 --- /dev/null +++ b/lib/pleroma/helpers/media_helper.ex @@ -0,0 +1,62 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Helpers.MediaHelper do + @moduledoc """ + Handles common media-related operations. + """ + + @ffmpeg_opts [{:sync, true}, {:stdout, true}] + + def ffmpeg_resize_remote(uri, max_width, max_height) do + cmd = ~s""" + curl -L "#{uri}" | + ffmpeg -i pipe:0 -vf \ + "scale='min(#{max_width},iw)':min'(#{max_height},ih)':force_original_aspect_ratio=decrease" \ + -f image2 pipe:1 | \ + cat + """ + + with {:ok, [stdout: stdout_list]} <- Exexec.run(cmd, @ffmpeg_opts) do + {:ok, Enum.join(stdout_list)} + end + end + + @doc "Returns a temporary path for an URI" + def temporary_path_for(uri) do + name = Path.basename(uri) + random = rand_uniform(999_999) + Path.join(System.tmp_dir(), "#{random}-#{name}") + end + + @doc "Stores binary content fetched from specified URL as a temporary file." + @spec store_as_temporary_file(String.t(), binary()) :: {:ok, String.t()} | {:error, atom()} + def store_as_temporary_file(url, body) do + path = temporary_path_for(url) + with :ok <- File.write(path, body), do: {:ok, path} + end + + @doc "Modifies image file at specified path by resizing to specified limit dimensions." + @spec mogrify_resize_to_limit(String.t(), String.t()) :: :ok | any() + def mogrify_resize_to_limit(path, resize_dimensions) do + with %Mogrify.Image{} <- + path + |> Mogrify.open() + |> Mogrify.resize_to_limit(resize_dimensions) + |> Mogrify.save(in_place: true) do + :ok + end + end + + defp rand_uniform(high) do + Code.ensure_loaded(:rand) + + if function_exported?(:rand, :uniform, 1) do + :rand.uniform(high) + else + # Erlang/OTP < 19 + apply(:crypto, :rand_uniform, [1, high]) + end + end +end diff --git a/lib/pleroma/helpers/mogrify_helper.ex b/lib/pleroma/helpers/mogrify_helper.ex deleted file mode 100644 index 67edb35c3..000000000 --- a/lib/pleroma/helpers/mogrify_helper.ex +++ /dev/null @@ -1,25 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Helpers.MogrifyHelper do - @moduledoc """ - Handles common Mogrify operations. - """ - - @spec store_as_temporary_file(String.t(), binary()) :: {:ok, String.t()} | {:error, atom()} - @doc "Stores binary content fetched from specified URL as a temporary file." - def store_as_temporary_file(url, body) do - path = Mogrify.temporary_path_for(%{path: url}) - with :ok <- File.write(path, body), do: {:ok, path} - end - - @spec store_as_temporary_file(String.t(), String.t()) :: Mogrify.Image.t() | any() - @doc "Modifies file at specified path by resizing to specified limit dimensions." - def in_place_resize_to_limit(path, resize_dimensions) do - path - |> Mogrify.open() - |> Mogrify.resize_to_limit(resize_dimensions) - |> Mogrify.save(in_place: true) - end -end diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 8d8d073e9..fb4b80379 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -6,7 +6,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do use Pleroma.Web, :controller alias Pleroma.Config - alias Pleroma.Helpers.MogrifyHelper + alias Pleroma.Helpers.MediaHelper alias Pleroma.ReverseProxy alias Pleroma.Web.MediaProxy @@ -82,51 +82,19 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do {thumbnail_max_width, thumbnail_max_height} end - defp thumbnail_binary(url, body, params) do - {thumbnail_max_width, thumbnail_max_height} = thumbnail_max_dimensions(params) - - with true <- Config.get([:media_preview_proxy, :enable_eimp]), - {:ok, [type: image_type, width: source_width, height: source_height]} <- - :eimp.identify(body), - scale_factor <- - Enum.max([source_width / thumbnail_max_width, source_height / thumbnail_max_height]), - {:ok, thumbnail_binary} = - :eimp.convert(body, image_type, [ - {:scale, {round(source_width / scale_factor), round(source_height / scale_factor)}} - ]) do - {:ok, thumbnail_binary} - else - _ -> - mogrify_dimensions = "#{thumbnail_max_width}x#{thumbnail_max_height}" - - with {:ok, path} <- MogrifyHelper.store_as_temporary_file(url, body), - %Mogrify.Image{} <- - MogrifyHelper.in_place_resize_to_limit(path, mogrify_dimensions), - {:ok, thumbnail_binary} <- File.read(path), - _ <- File.rm(path) do - {:ok, thumbnail_binary} - else - _ -> :error - end - end - end - defp handle_preview("image/" <> _ = content_type, %{params: params} = conn, url) do - with {:ok, %{status: status, body: image_contents}} when status in 200..299 <- - url - |> MediaProxy.url() - |> Tesla.get(opts: [adapter: [timeout: preview_timeout()]]), - {:ok, thumbnail_binary} <- thumbnail_binary(url, image_contents, params) do + with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(params), + media_proxy_url <- MediaProxy.url(url), + {:ok, thumbnail_binary} <- + MediaHelper.ffmpeg_resize_remote( + media_proxy_url, + thumbnail_max_width, + thumbnail_max_height + ) do conn |> put_resp_header("content-type", content_type) |> send_resp(200, thumbnail_binary) else - {_, %{status: _}} -> - send_resp(conn, :failed_dependency, "Can't fetch the image.") - - {:error, :recv_response_timeout} -> - send_resp(conn, :failed_dependency, "Downstream timeout.") - _ -> send_resp(conn, :failed_dependency, "Can't handle image preview.") end diff --git a/mix.exs b/mix.exs index 9ace55eff..68de270f0 100644 --- a/mix.exs +++ b/mix.exs @@ -146,7 +146,6 @@ defmodule Pleroma.Mixfile do github: "ninenines/gun", ref: "e1a69b36b180a574c0ac314ced9613fdd52312cc", override: true}, {:jason, "~> 1.0"}, {:mogrify, "~> 0.6.1"}, - {:eimp, "~> 1.0.14"}, {:ex_aws, "~> 2.1"}, {:ex_aws_s3, "~> 2.0"}, {:sweet_xml, "~> 0.6.6"}, @@ -198,6 +197,7 @@ defmodule Pleroma.Mixfile do ref: "e0f16822d578866e186a0974d65ad58cddc1e2ab"}, {:mox, "~> 0.5", only: :test}, {:restarter, path: "./restarter"}, + {:exexec, "~> 0.2"}, {:open_api_spex, git: "https://git.pleroma.social/pleroma/elixir-libraries/open_api_spex.git", ref: "f296ac0924ba3cf79c7a588c4c252889df4c2edd"} diff --git a/mix.lock b/mix.lock index ebd0cbdf5..964b72127 100644 --- a/mix.lock +++ b/mix.lock @@ -32,6 +32,7 @@ "ecto_sql": {:hex, :ecto_sql, "3.3.4", "aa18af12eb875fbcda2f75e608b3bd534ebf020fc4f6448e4672fcdcbb081244", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.4 or ~> 3.3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5eccbdbf92e3c6f213007a82d5dbba4cd9bb659d1a21331f89f408e4c0efd7a8"}, "eimp": {:hex, :eimp, "1.0.14", "fc297f0c7e2700457a95a60c7010a5f1dcb768a083b6d53f49cd94ab95a28f22", [:rebar3], [{:p1_utils, "1.0.18", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "501133f3112079b92d9e22da8b88bf4f0e13d4d67ae9c15c42c30bd25ceb83b6"}, "elixir_make": {:hex, :elixir_make, "0.6.0", "38349f3e29aff4864352084fc736fa7fa0f2995a819a737554f7ebd28b85aaab", [:mix], [], "hexpm", "d522695b93b7f0b4c0fcb2dfe73a6b905b1c301226a5a55cb42e5b14d509e050"}, + "erlexec": {:hex, :erlexec, "1.10.9", "3cbb3476f942bfb8b68b85721c21c1835061cf6dd35f5285c2362e85b100ddc7", [:rebar3], [], "hexpm", "271e5b5f2d91cdb9887efe74d89026c199bfc69f074cade0d08dab60993fa14e"}, "esshd": {:hex, :esshd, "0.1.1", "d4dd4c46698093a40a56afecce8a46e246eb35463c457c246dacba2e056f31b5", [:mix], [], "hexpm", "d73e341e3009d390aa36387dc8862860bf9f874c94d9fd92ade2926376f49981"}, "eternal": {:hex, :eternal, "1.2.1", "d5b6b2499ba876c57be2581b5b999ee9bdf861c647401066d3eeed111d096bc4", [:mix], [], "hexpm", "b14f1dc204321429479c569cfbe8fb287541184ed040956c8862cb7a677b8406"}, "ex2ms": {:hex, :ex2ms, "1.5.0", "19e27f9212be9a96093fed8cdfbef0a2b56c21237196d26760f11dfcfae58e97", [:mix], [], "hexpm"}, @@ -42,6 +43,7 @@ "ex_machina": {:hex, :ex_machina, "2.3.0", "92a5ad0a8b10ea6314b876a99c8c9e3f25f4dde71a2a835845b136b9adaf199a", [: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", "b84f6af156264530b312a8ab98ac6088f6b77ae5fe2058305c81434aa01fbaf9"}, "ex_syslogger": {:hex, :ex_syslogger, "1.5.2", "72b6aa2d47a236e999171f2e1ec18698740f40af0bd02c8c650bf5f1fd1bac79", [:mix], [{:poison, ">= 1.5.0", [hex: :poison, repo: "hexpm", optional: true]}, {:syslog, "~> 1.1.0", [hex: :syslog, repo: "hexpm", optional: false]}], "hexpm", "ab9fab4136dbc62651ec6f16fa4842f10cf02ab4433fa3d0976c01be99398399"}, "excoveralls": {:hex, :excoveralls, "0.12.2", "a513defac45c59e310ac42fcf2b8ae96f1f85746410f30b1ff2b710a4b6cd44b", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "151c476331d49b45601ffc45f43cb3a8beb396b02a34e3777fea0ad34ae57d89"}, + "exexec": {:hex, :exexec, "0.2.0", "a6ffc48cba3ac9420891b847e4dc7120692fb8c08c9e82220ebddc0bb8d96103", [:mix], [{:erlexec, "~> 1.10", [hex: :erlexec, repo: "hexpm", optional: false]}], "hexpm", "312cd1c9befba9e078e57f3541e4f4257eabda6eb9c348154fe899d6ac633299"}, "fast_html": {:hex, :fast_html, "1.0.3", "2cc0d4b68496266a1530e0c852cafeaede0bd10cfdee26fda50dc696c203162f", [:make, :mix], [], "hexpm", "ab3d782b639d3c4655fbaec0f9d032c91f8cab8dd791ac7469c2381bc7c32f85"}, "fast_sanitize": {:hex, :fast_sanitize, "0.1.7", "2a7cd8734c88a2de6de55022104f8a3b87f1fdbe8bbf131d9049764b53d50d0d", [:mix], [{:fast_html, "~> 1.0", [hex: :fast_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "f39fe8ea08fbac17487c30bf09b7d9f3e12472e51fb07a88ffeb8fd17da8ab67"}, "flake_id": {:hex, :flake_id, "0.1.0", "7716b086d2e405d09b647121a166498a0d93d1a623bead243e1f74216079ccb3", [:mix], [{:base62, "~> 1.2", [hex: :base62, repo: "hexpm", optional: false]}, {:ecto, ">= 2.0.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm", "31fc8090fde1acd267c07c36ea7365b8604055f897d3a53dd967658c691bd827"}, From 610343edb318654126d9539775ba4b9ff30c8831 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Thu, 21 May 2020 17:35:42 +0300 Subject: [PATCH 005/182] [#2497] Image preview proxy: image resize & background color fix with ffmpeg -filter_complex. --- lib/pleroma/helpers/media_helper.ex | 47 +++---------------- .../web/media_proxy/media_proxy_controller.ex | 7 ++- 2 files changed, 9 insertions(+), 45 deletions(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 6d1f8ab22..ee6b76c41 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -9,12 +9,14 @@ defmodule Pleroma.Helpers.MediaHelper do @ffmpeg_opts [{:sync, true}, {:stdout, true}] - def ffmpeg_resize_remote(uri, max_width, max_height) do + def ffmpeg_resize_remote(uri, %{max_width: max_width, max_height: max_height}) do cmd = ~s""" curl -L "#{uri}" | - ffmpeg -i pipe:0 -vf \ - "scale='min(#{max_width},iw)':min'(#{max_height},ih)':force_original_aspect_ratio=decrease" \ - -f image2 pipe:1 | \ + ffmpeg -i pipe:0 -f lavfi -i color=c=white \ + -filter_complex "[0:v] scale='min(#{max_width},iw)':'min(#{max_height},ih)': \ + force_original_aspect_ratio=decrease [scaled]; \ + [1][scaled] scale2ref [bg][img]; [bg] setsar=1 [bg]; [bg][img] overlay=shortest=1" \ + -f image2 -vcodec mjpeg -frames:v 1 pipe:1 | \ cat """ @@ -22,41 +24,4 @@ defmodule Pleroma.Helpers.MediaHelper do {:ok, Enum.join(stdout_list)} end end - - @doc "Returns a temporary path for an URI" - def temporary_path_for(uri) do - name = Path.basename(uri) - random = rand_uniform(999_999) - Path.join(System.tmp_dir(), "#{random}-#{name}") - end - - @doc "Stores binary content fetched from specified URL as a temporary file." - @spec store_as_temporary_file(String.t(), binary()) :: {:ok, String.t()} | {:error, atom()} - def store_as_temporary_file(url, body) do - path = temporary_path_for(url) - with :ok <- File.write(path, body), do: {:ok, path} - end - - @doc "Modifies image file at specified path by resizing to specified limit dimensions." - @spec mogrify_resize_to_limit(String.t(), String.t()) :: :ok | any() - def mogrify_resize_to_limit(path, resize_dimensions) do - with %Mogrify.Image{} <- - path - |> Mogrify.open() - |> Mogrify.resize_to_limit(resize_dimensions) - |> Mogrify.save(in_place: true) do - :ok - end - end - - defp rand_uniform(high) do - Code.ensure_loaded(:rand) - - if function_exported?(:rand, :uniform, 1) do - :rand.uniform(high) - else - # Erlang/OTP < 19 - apply(:crypto, :rand_uniform, [1, high]) - end - end end diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index fb4b80379..12d4401fa 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -82,17 +82,16 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do {thumbnail_max_width, thumbnail_max_height} end - defp handle_preview("image/" <> _ = content_type, %{params: params} = conn, url) do + defp handle_preview("image/" <> _ = _content_type, %{params: params} = conn, url) do with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(params), media_proxy_url <- MediaProxy.url(url), {:ok, thumbnail_binary} <- MediaHelper.ffmpeg_resize_remote( media_proxy_url, - thumbnail_max_width, - thumbnail_max_height + %{max_width: thumbnail_max_width, max_height: thumbnail_max_height} ) do conn - |> put_resp_header("content-type", content_type) + |> put_resp_header("content-type", "image/jpeg") |> send_resp(200, thumbnail_binary) else _ -> From 3a1e810aaaea3e44c4dfc82a014485cf886d6b88 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Thu, 21 May 2020 21:47:32 +0300 Subject: [PATCH 006/182] [#2497] Customized `exexec` launch to support root operation (currently required by Gitlab CI). --- .gitlab-ci.yml | 1 + config/config.exs | 4 +++ lib/pleroma/exec.ex | 38 +++++++++++++++++++++++++++++ lib/pleroma/helpers/media_helper.ex | 4 +-- mix.exs | 3 ++- test/exec_test.exs | 13 ++++++++++ 6 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 lib/pleroma/exec.ex create mode 100644 test/exec_test.exs diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aad28a2d8..14300f3bf 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,6 +6,7 @@ variables: &global_variables POSTGRES_PASSWORD: postgres DB_HOST: postgres MIX_ENV: test + USER: root cache: &global_cache_policy key: ${CI_COMMIT_REF_SLUG} diff --git a/config/config.exs b/config/config.exs index 838508c1b..d1440b7bf 100644 --- a/config/config.exs +++ b/config/config.exs @@ -681,6 +681,10 @@ config :pleroma, :restrict_unauthenticated, config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: false +config :pleroma, :exexec, + root_mode: false, + options: %{} + # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. import_config "#{Mix.env()}.exs" diff --git a/lib/pleroma/exec.ex b/lib/pleroma/exec.ex new file mode 100644 index 000000000..1b088d322 --- /dev/null +++ b/lib/pleroma/exec.ex @@ -0,0 +1,38 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Exec do + @moduledoc "Pleroma wrapper around Exexec commands." + + alias Pleroma.Config + + def ensure_started(options_overrides \\ %{}) do + options = + if Config.get([:exexec, :root_mode]) || System.get_env("USER") == "root" do + # Note: running as `root` is discouraged (yet Gitlab CI does that by default) + %{root: true, user: "root", limit_users: ["root"]} + else + %{} + end + + options = + options + |> Map.merge(Config.get([:exexec, :options], %{})) + |> Map.merge(options_overrides) + + with {:error, {:already_started, pid}} <- Exexec.start(options) do + {:ok, pid} + end + end + + def run(cmd, options \\ %{}) do + ensure_started() + Exexec.run(cmd, options) + end + + def cmd(cmd, options \\ %{}) do + options = Map.merge(%{sync: true, stdout: true}, options) + run(cmd, options) + end +end diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index ee6b76c41..ecd234558 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -7,8 +7,6 @@ defmodule Pleroma.Helpers.MediaHelper do Handles common media-related operations. """ - @ffmpeg_opts [{:sync, true}, {:stdout, true}] - def ffmpeg_resize_remote(uri, %{max_width: max_width, max_height: max_height}) do cmd = ~s""" curl -L "#{uri}" | @@ -20,7 +18,7 @@ defmodule Pleroma.Helpers.MediaHelper do cat """ - with {:ok, [stdout: stdout_list]} <- Exexec.run(cmd, @ffmpeg_opts) do + with {:ok, [stdout: stdout_list]} <- Pleroma.Exec.cmd(cmd) do {:ok, Enum.join(stdout_list)} end end diff --git a/mix.exs b/mix.exs index 4c9bbc0ab..3215086ca 100644 --- a/mix.exs +++ b/mix.exs @@ -197,7 +197,8 @@ defmodule Pleroma.Mixfile do ref: "e0f16822d578866e186a0974d65ad58cddc1e2ab"}, {:mox, "~> 0.5", only: :test}, {:restarter, path: "./restarter"}, - {:exexec, "~> 0.2"}, + # Note: `runtime: true` for :exexec makes CI fail due to `root` user (see Pleroma.Exec) + {:exexec, "~> 0.2", runtime: false}, {:open_api_spex, git: "https://git.pleroma.social/pleroma/elixir-libraries/open_api_spex.git", ref: "f296ac0924ba3cf79c7a588c4c252889df4c2edd"} diff --git a/test/exec_test.exs b/test/exec_test.exs new file mode 100644 index 000000000..45d3f778f --- /dev/null +++ b/test/exec_test.exs @@ -0,0 +1,13 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.ExecTest do + alias Pleroma.Exec + + use Pleroma.DataCase + + test "it starts" do + assert {:ok, _} = Exec.ensure_started() + end +end From 0e23138b50f1fdd9ea78df31eec1b3caac905e2c Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Fri, 22 May 2020 10:35:48 +0300 Subject: [PATCH 007/182] [#2497] Specified SHELL in .gitlab-ci.yml as required for `exexec`. --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 14300f3bf..e596aa0ec 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,6 +6,7 @@ variables: &global_variables POSTGRES_PASSWORD: postgres DB_HOST: postgres MIX_ENV: test + SHELL: /bin/sh USER: root cache: &global_cache_policy From 9faa63203717e71d666afb6755ff0b781b491823 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Sun, 5 Jul 2020 19:02:43 +0300 Subject: [PATCH 008/182] [#2497] Fixed merge issue. --- lib/pleroma/web/media_proxy/media_proxy_controller.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 0f4575e2f..583c177f2 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -12,8 +12,8 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do def remote(conn, %{"sig" => sig64, "url" => url64}) do with {_, true} <- {:enabled, MediaProxy.enabled?()}, - {_, false} <- {:in_banned_urls, MediaProxy.in_banned_urls(url)}, {:ok, url} <- MediaProxy.decode_url(sig64, url64), + {_, false} <- {:in_banned_urls, MediaProxy.in_banned_urls(url)}, :ok <- MediaProxy.verify_request_path_and_url(conn, url) do proxy_opts = Config.get([:media_proxy, :proxy_opts], []) ReverseProxy.call(conn, url, proxy_opts) From b8021016ebef23903c59e5140d4efb456a84a347 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Tue, 21 Jul 2020 20:03:14 +0300 Subject: [PATCH 009/182] [#2497] Resolved merge conflicts. --- .../media_proxy_controller_test.exs | 39 ------------------- test/web/media_proxy/media_proxy_test.exs | 24 ++++-------- 2 files changed, 7 insertions(+), 56 deletions(-) diff --git a/test/web/media_proxy/media_proxy_controller_test.exs b/test/web/media_proxy/media_proxy_controller_test.exs index d4db44c63..0cda1e0b0 100644 --- a/test/web/media_proxy/media_proxy_controller_test.exs +++ b/test/web/media_proxy/media_proxy_controller_test.exs @@ -79,43 +79,4 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do end end end - - describe "filename_matches/3" do - test "preserves the encoded or decoded path" do - assert MediaProxyController.filename_matches( - %{"filename" => "/Hello world.jpg"}, - "/Hello world.jpg", - "http://pleroma.social/Hello world.jpg" - ) == :ok - - assert MediaProxyController.filename_matches( - %{"filename" => "/Hello%20world.jpg"}, - "/Hello%20world.jpg", - "http://pleroma.social/Hello%20world.jpg" - ) == :ok - - assert MediaProxyController.filename_matches( - %{"filename" => "/my%2Flong%2Furl%2F2019%2F07%2FS.jpg"}, - "/my%2Flong%2Furl%2F2019%2F07%2FS.jpg", - "http://pleroma.social/my%2Flong%2Furl%2F2019%2F07%2FS.jpg" - ) == :ok - - assert MediaProxyController.filename_matches( - %{"filename" => "/my%2Flong%2Furl%2F2019%2F07%2FS.jp"}, - "/my%2Flong%2Furl%2F2019%2F07%2FS.jp", - "http://pleroma.social/my%2Flong%2Furl%2F2019%2F07%2FS.jpg" - ) == {:wrong_filename, "my%2Flong%2Furl%2F2019%2F07%2FS.jpg"} - end - - test "encoded url are tried to match for proxy as `conn.request_path` encodes the url" do - # conn.request_path will return encoded url - request_path = "/ANALYSE-DAI-_-LE-STABLECOIN-100-D%C3%89CENTRALIS%C3%89-BQ.jpg" - - assert MediaProxyController.filename_matches( - true, - request_path, - "https://mydomain.com/uploads/2019/07/ANALYSE-DAI-_-LE-STABLECOIN-100-DÉCENTRALISÉ-BQ.jpg" - ) == :ok - end - end end diff --git a/test/web/media_proxy/media_proxy_test.exs b/test/web/media_proxy/media_proxy_test.exs index 06990464f..0e6df826c 100644 --- a/test/web/media_proxy/media_proxy_test.exs +++ b/test/web/media_proxy/media_proxy_test.exs @@ -126,6 +126,13 @@ defmodule Pleroma.Web.MediaProxyTest do :ok ) + test_verify_request_path_and_url( + # Note: `conn.request_path` returns encoded url + "/ANALYSE-DAI-_-LE-STABLECOIN-100-D%C3%89CENTRALIS%C3%89-BQ.jpg", + "https://mydomain.com/uploads/2019/07/ANALYSE-DAI-_-LE-STABLECOIN-100-DÉCENTRALISÉ-BQ.jpg", + :ok + ) + test_verify_request_path_and_url( "/my%2Flong%2Furl%2F2019%2F07%2FS", "http://pleroma.social/my%2Flong%2Furl%2F2019%2F07%2FS.jpg", @@ -133,17 +140,6 @@ defmodule Pleroma.Web.MediaProxyTest do ) end - test "encoded url are tried to match for proxy as `conn.request_path` encodes the url" do - # conn.request_path will return encoded url - request_path = "/ANALYSE-DAI-_-LE-STABLECOIN-100-D%C3%89CENTRALIS%C3%89-BQ.jpg" - - assert MediaProxy.verify_request_path_and_url( - request_path, - "https://mydomain.com/uploads/2019/07/ANALYSE-DAI-_-LE-STABLECOIN-100-DÉCENTRALISÉ-BQ.jpg" - ) == :ok - assert MediaProxy.decode_url(sig, base64) == {:error, :invalid_signature} - end - test "uses the configured base_url" do base_url = "https://cache.pleroma.social" clear_config([:media_proxy, :base_url], base_url) @@ -193,12 +189,6 @@ defmodule Pleroma.Web.MediaProxyTest do end end - defp decode_result(encoded) do - [_, "proxy", sig, base64 | _] = URI.parse(encoded).path |> String.split("/") - {:ok, decoded} = MediaProxy.decode_url(sig, base64) - decoded - end - describe "whitelist" do setup do: clear_config([:media_proxy, :enabled], true) From 56ddf20208657487bf0298409cf91b11dac346ff Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Fri, 7 Aug 2020 09:43:49 +0300 Subject: [PATCH 010/182] Removed unused alias. --- test/web/media_proxy/media_proxy_controller_test.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/web/media_proxy/media_proxy_controller_test.exs b/test/web/media_proxy/media_proxy_controller_test.exs index 0cda1e0b0..0dd2fd10c 100644 --- a/test/web/media_proxy/media_proxy_controller_test.exs +++ b/test/web/media_proxy/media_proxy_controller_test.exs @@ -8,7 +8,6 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do import Mock alias Pleroma.Web.MediaProxy - alias Pleroma.Web.MediaProxy.MediaProxyController alias Plug.Conn setup do From da116d81fb0028913c2a0f30ac35532fb500e8fc Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Tue, 18 Aug 2020 18:23:27 +0300 Subject: [PATCH 011/182] [#2497] Added video preview proxy. Switched from exexec to Port. --- .gitlab-ci.yml | 2 - config/config.exs | 4 -- lib/pleroma/exec.ex | 38 -------------- lib/pleroma/helpers/media_helper.ex | 19 ++++--- .../web/media_proxy/media_proxy_controller.ex | 50 +++++++++++-------- mix.exs | 2 - mix.lock | 2 - test/exec_test.exs | 13 ----- 8 files changed, 41 insertions(+), 89 deletions(-) delete mode 100644 lib/pleroma/exec.ex delete mode 100644 test/exec_test.exs diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3b6877039..9e9107ce3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,8 +6,6 @@ variables: &global_variables POSTGRES_PASSWORD: postgres DB_HOST: postgres MIX_ENV: test - SHELL: /bin/sh - USER: root cache: &global_cache_policy key: ${CI_COMMIT_REF_SLUG} diff --git a/config/config.exs b/config/config.exs index ab4508ccf..029f8ec20 100644 --- a/config/config.exs +++ b/config/config.exs @@ -761,10 +761,6 @@ config :floki, :html_parser, Floki.HTMLParser.FastHtml config :pleroma, Pleroma.Web.Auth.Authenticator, Pleroma.Web.Auth.PleromaAuthenticator -config :pleroma, :exexec, - root_mode: false, - options: %{} - # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. import_config "#{Mix.env()}.exs" diff --git a/lib/pleroma/exec.ex b/lib/pleroma/exec.ex deleted file mode 100644 index 1b088d322..000000000 --- a/lib/pleroma/exec.ex +++ /dev/null @@ -1,38 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Exec do - @moduledoc "Pleroma wrapper around Exexec commands." - - alias Pleroma.Config - - def ensure_started(options_overrides \\ %{}) do - options = - if Config.get([:exexec, :root_mode]) || System.get_env("USER") == "root" do - # Note: running as `root` is discouraged (yet Gitlab CI does that by default) - %{root: true, user: "root", limit_users: ["root"]} - else - %{} - end - - options = - options - |> Map.merge(Config.get([:exexec, :options], %{})) - |> Map.merge(options_overrides) - - with {:error, {:already_started, pid}} <- Exexec.start(options) do - {:ok, pid} - end - end - - def run(cmd, options \\ %{}) do - ensure_started() - Exexec.run(cmd, options) - end - - def cmd(cmd, options \\ %{}) do - options = Map.merge(%{sync: true, stdout: true}, options) - run(cmd, options) - end -end diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index ecd234558..ca46698cc 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -7,19 +7,24 @@ defmodule Pleroma.Helpers.MediaHelper do Handles common media-related operations. """ - def ffmpeg_resize_remote(uri, %{max_width: max_width, max_height: max_height}) do + def ffmpeg_resize(uri_or_path, %{max_width: max_width, max_height: max_height}) do cmd = ~s""" - curl -L "#{uri}" | - ffmpeg -i pipe:0 -f lavfi -i color=c=white \ + ffmpeg -i #{uri_or_path} -f lavfi -i color=c=white \ -filter_complex "[0:v] scale='min(#{max_width},iw)':'min(#{max_height},ih)': \ force_original_aspect_ratio=decrease [scaled]; \ [1][scaled] scale2ref [bg][img]; [bg] setsar=1 [bg]; [bg][img] overlay=shortest=1" \ - -f image2 -vcodec mjpeg -frames:v 1 pipe:1 | \ - cat + -loglevel quiet -f image2 -vcodec mjpeg -frames:v 1 pipe:1 """ - with {:ok, [stdout: stdout_list]} <- Pleroma.Exec.cmd(cmd) do - {:ok, Enum.join(stdout_list)} + pid = Port.open({:spawn, cmd}, [:use_stdio, :in, :stream, :exit_status, :binary]) + + receive do + {^pid, {:data, data}} -> + send(pid, {self(), :close}) + {:ok, data} + + {^pid, {:exit_status, status}} when status > 0 -> + {:error, status} end end end diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 583c177f2..8861398dd 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -66,6 +66,35 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end + defp handle_preview("image/" <> _ = _content_type, conn, url) do + handle_image_or_video_preview(conn, url) + end + + defp handle_preview("video/" <> _ = _content_type, conn, url) do + handle_image_or_video_preview(conn, url) + end + + defp handle_preview(content_type, conn, _url) do + send_resp(conn, :unprocessable_entity, "Unsupported content type: #{content_type}.") + end + + defp handle_image_or_video_preview(%{params: params} = conn, url) do + with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(params), + media_proxy_url <- MediaProxy.url(url), + {:ok, thumbnail_binary} <- + MediaHelper.ffmpeg_resize( + media_proxy_url, + %{max_width: thumbnail_max_width, max_height: thumbnail_max_height} + ) do + conn + |> put_resp_header("content-type", "image/jpeg") + |> send_resp(200, thumbnail_binary) + else + _ -> + send_resp(conn, :failed_dependency, "Can't handle preview.") + end + end + defp thumbnail_max_dimensions(params) do config = Config.get([:media_preview_proxy], []) @@ -86,27 +115,6 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do {thumbnail_max_width, thumbnail_max_height} end - defp handle_preview("image/" <> _ = _content_type, %{params: params} = conn, url) do - with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(params), - media_proxy_url <- MediaProxy.url(url), - {:ok, thumbnail_binary} <- - MediaHelper.ffmpeg_resize_remote( - media_proxy_url, - %{max_width: thumbnail_max_width, max_height: thumbnail_max_height} - ) do - conn - |> put_resp_header("content-type", "image/jpeg") - |> send_resp(200, thumbnail_binary) - else - _ -> - send_resp(conn, :failed_dependency, "Can't handle image preview.") - end - end - - defp handle_preview(content_type, conn, _url) do - send_resp(conn, :unprocessable_entity, "Unsupported content type: #{content_type}.") - end - defp preview_head_request_timeout do Config.get([:media_preview_proxy, :proxy_opts, :head_request_max_read_duration]) || preview_timeout() diff --git a/mix.exs b/mix.exs index 33c4411c4..11fdb1670 100644 --- a/mix.exs +++ b/mix.exs @@ -186,8 +186,6 @@ defmodule Pleroma.Mixfile do git: "https://git.pleroma.social/pleroma/elixir-libraries/elixir-captcha.git", ref: "e0f16822d578866e186a0974d65ad58cddc1e2ab"}, {:restarter, path: "./restarter"}, - # Note: `runtime: true` for :exexec makes CI fail due to `root` user (see Pleroma.Exec) - {:exexec, "~> 0.2", runtime: false}, {:open_api_spex, git: "https://git.pleroma.social/pleroma/elixir-libraries/open_api_spex.git", ref: "f296ac0924ba3cf79c7a588c4c252889df4c2edd"}, diff --git a/mix.lock b/mix.lock index f5acc89eb..553ac304a 100644 --- a/mix.lock +++ b/mix.lock @@ -33,7 +33,6 @@ "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"}, "eimp": {:hex, :eimp, "1.0.14", "fc297f0c7e2700457a95a60c7010a5f1dcb768a083b6d53f49cd94ab95a28f22", [:rebar3], [{:p1_utils, "1.0.18", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "501133f3112079b92d9e22da8b88bf4f0e13d4d67ae9c15c42c30bd25ceb83b6"}, "elixir_make": {:hex, :elixir_make, "0.6.0", "38349f3e29aff4864352084fc736fa7fa0f2995a819a737554f7ebd28b85aaab", [:mix], [], "hexpm", "d522695b93b7f0b4c0fcb2dfe73a6b905b1c301226a5a55cb42e5b14d509e050"}, - "erlexec": {:hex, :erlexec, "1.10.9", "3cbb3476f942bfb8b68b85721c21c1835061cf6dd35f5285c2362e85b100ddc7", [:rebar3], [], "hexpm", "271e5b5f2d91cdb9887efe74d89026c199bfc69f074cade0d08dab60993fa14e"}, "esshd": {:hex, :esshd, "0.1.1", "d4dd4c46698093a40a56afecce8a46e246eb35463c457c246dacba2e056f31b5", [:mix], [], "hexpm", "d73e341e3009d390aa36387dc8862860bf9f874c94d9fd92ade2926376f49981"}, "eternal": {:hex, :eternal, "1.2.1", "d5b6b2499ba876c57be2581b5b999ee9bdf861c647401066d3eeed111d096bc4", [:mix], [], "hexpm", "b14f1dc204321429479c569cfbe8fb287541184ed040956c8862cb7a677b8406"}, "ex2ms": {:hex, :ex2ms, "1.5.0", "19e27f9212be9a96093fed8cdfbef0a2b56c21237196d26760f11dfcfae58e97", [:mix], [], "hexpm"}, @@ -44,7 +43,6 @@ "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"}, "ex_syslogger": {:hex, :ex_syslogger, "1.5.2", "72b6aa2d47a236e999171f2e1ec18698740f40af0bd02c8c650bf5f1fd1bac79", [:mix], [{:poison, ">= 1.5.0", [hex: :poison, repo: "hexpm", optional: true]}, {:syslog, "~> 1.1.0", [hex: :syslog, repo: "hexpm", optional: false]}], "hexpm", "ab9fab4136dbc62651ec6f16fa4842f10cf02ab4433fa3d0976c01be99398399"}, "excoveralls": {:hex, :excoveralls, "0.13.1", "b9f1697f7c9e0cfe15d1a1d737fb169c398803ffcbc57e672aa007e9fd42864c", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b4bb550e045def1b4d531a37fb766cbbe1307f7628bf8f0414168b3f52021cce"}, - "exexec": {:hex, :exexec, "0.2.0", "a6ffc48cba3ac9420891b847e4dc7120692fb8c08c9e82220ebddc0bb8d96103", [:mix], [{:erlexec, "~> 1.10", [hex: :erlexec, repo: "hexpm", optional: false]}], "hexpm", "312cd1c9befba9e078e57f3541e4f4257eabda6eb9c348154fe899d6ac633299"}, "fast_html": {:hex, :fast_html, "2.0.1", "e126c74d287768ae78c48938da6711164517300d108a78f8a38993df8d588335", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}], "hexpm", "bdd6f8525c95ad391a4f10d9a1b3da4cea94078ec8638487aa8c24015ad9393a"}, "fast_sanitize": {:hex, :fast_sanitize, "0.2.0", "004b40d5bbecda182b6fdba762a51fffd3501e689e8eafe196e1a97eb0caf733", [:mix], [{:fast_html, "~> 2.0", [hex: :fast_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "11fcb37f26d272a3a2aff861872bf100be4eeacea69505908b8cdbcea5b0813a"}, "flake_id": {:hex, :flake_id, "0.1.0", "7716b086d2e405d09b647121a166498a0d93d1a623bead243e1f74216079ccb3", [:mix], [{:base62, "~> 1.2", [hex: :base62, repo: "hexpm", optional: false]}, {:ecto, ">= 2.0.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm", "31fc8090fde1acd267c07c36ea7365b8604055f897d3a53dd967658c691bd827"}, diff --git a/test/exec_test.exs b/test/exec_test.exs deleted file mode 100644 index 45d3f778f..000000000 --- a/test/exec_test.exs +++ /dev/null @@ -1,13 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.ExecTest do - alias Pleroma.Exec - - use Pleroma.DataCase - - test "it starts" do - assert {:ok, _} = Exec.ensure_started() - end -end From 4ee15e991efb5bd5bf69d84d27dbbee81443d1dc Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Wed, 19 Aug 2020 21:36:26 +0300 Subject: [PATCH 012/182] [#2497] Media preview proxy config refactoring & documentation. --- config/config.exs | 3 +- config/description.exs | 51 +++++++++++++++++++ .../web/media_proxy/media_proxy_controller.ex | 20 ++++---- 3 files changed, 63 insertions(+), 11 deletions(-) diff --git a/config/config.exs b/config/config.exs index 029f8ec20..6e6231cf8 100644 --- a/config/config.exs +++ b/config/config.exs @@ -444,8 +444,7 @@ config :pleroma, :media_preview_proxy, thumbnail_max_width: 400, thumbnail_max_height: 200, proxy_opts: [ - head_request_max_read_duration: 5_000, - max_read_duration: 10_000 + head_request_max_read_duration: 5_000 ] config :pleroma, :chat, enabled: true diff --git a/config/description.exs b/config/description.exs index e27abf40f..90d8eca65 100644 --- a/config/description.exs +++ b/config/description.exs @@ -1831,6 +1831,7 @@ config :pleroma, :config_description, [ suggestions: [ redirect_on_failure: false, max_body_length: 25 * 1_048_576, + max_read_duration: 30_000, http: [ follow_redirect: true, pool: :media @@ -1851,6 +1852,11 @@ config :pleroma, :config_description, [ "Limits the content length to be approximately the " <> "specified length. It is validated with the `content-length` header and also verified when proxying." }, + %{ + key: :max_read_duration, + type: :integer, + description: "Timeout (in milliseconds) of GET request to remote URI." + }, %{ key: :http, label: "HTTP", @@ -1897,6 +1903,51 @@ config :pleroma, :config_description, [ } ] }, + %{ + group: :pleroma, + key: :media_preview_proxy, + type: :group, + description: "Media preview proxy", + children: [ + %{ + key: :enabled, + type: :boolean, + description: + "Enables proxying of remote media preview to the instance's proxy. Requires enabled media proxy." + }, + %{ + key: :thumbnail_max_width, + type: :integer, + description: "Max width of preview thumbnail." + }, + %{ + key: :thumbnail_max_height, + type: :integer, + description: "Max height of preview thumbnail." + }, + %{ + key: :proxy_opts, + type: :keyword, + description: "Media proxy options", + suggestions: [ + head_request_max_read_duration: 5_000 + ], + children: [ + %{ + key: :head_request_max_read_duration, + type: :integer, + description: "Timeout (in milliseconds) of HEAD request to remote URI." + } + ] + }, + %{ + key: :whitelist, + type: {:list, :string}, + description: "List of hosts with scheme to bypass the mediaproxy", + suggestions: ["http://example.com"] + } + ] + }, %{ group: :pleroma, key: Pleroma.Web.MediaProxy.Invalidation.Http, diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 8861398dd..31d18c119 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -15,8 +15,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do {:ok, url} <- MediaProxy.decode_url(sig64, url64), {_, false} <- {:in_banned_urls, MediaProxy.in_banned_urls(url)}, :ok <- MediaProxy.verify_request_path_and_url(conn, url) do - proxy_opts = Config.get([:media_proxy, :proxy_opts], []) - ReverseProxy.call(conn, url, proxy_opts) + ReverseProxy.call(conn, url, media_proxy_opts()) else {:enabled, false} -> send_resp(conn, 404, Plug.Conn.Status.reason_phrase(404)) @@ -116,13 +115,16 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end defp preview_head_request_timeout do - Config.get([:media_preview_proxy, :proxy_opts, :head_request_max_read_duration]) || - preview_timeout() - end - - defp preview_timeout do - Config.get([:media_preview_proxy, :proxy_opts, :max_read_duration]) || - Config.get([:media_proxy, :proxy_opts, :max_read_duration]) || + Keyword.get(media_preview_proxy_opts(), :head_request_max_read_duration) || + Keyword.get(media_proxy_opts(), :max_read_duration) || ReverseProxy.max_read_duration_default() end + + defp media_proxy_opts do + Config.get([:media_proxy, :proxy_opts], []) + end + + defp media_preview_proxy_opts do + Config.get([:media_preview_proxy, :proxy_opts], []) + end end From 02ad1cd8e97c44824b92b53ea1879a965bbd8358 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Thu, 20 Aug 2020 09:58:50 +0300 Subject: [PATCH 013/182] [#2497] Media preview proxy: added Content-Disposition header with filename to response. --- lib/pleroma/web/media_proxy/media_proxy_controller.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 31d18c119..5513432f0 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -87,6 +87,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do ) do conn |> put_resp_header("content-type", "image/jpeg") + |> put_resp_header("content-disposition", "inline; filename=\"preview.jpg\"") |> send_resp(200, thumbnail_binary) else _ -> From aa0a5ffb4849880b5adbcc9188de01ef778381e3 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Fri, 21 Aug 2020 08:59:08 +0300 Subject: [PATCH 014/182] [#2497] Media preview proxy: added `quality` config setting, adjusted width/height defaults. --- config/config.exs | 5 +++-- config/description.exs | 5 +++++ lib/pleroma/helpers/media_helper.ex | 6 ++++-- lib/pleroma/web/media_proxy/media_proxy_controller.ex | 4 +++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/config/config.exs b/config/config.exs index 6e6231cf8..b399ce6d7 100644 --- a/config/config.exs +++ b/config/config.exs @@ -441,8 +441,9 @@ config :pleroma, Pleroma.Web.MediaProxy.Invalidation.Script, script_path: nil # Note: media preview proxy depends on media proxy to be enabled config :pleroma, :media_preview_proxy, enabled: false, - thumbnail_max_width: 400, - thumbnail_max_height: 200, + thumbnail_max_width: 600, + thumbnail_max_height: 600, + quality: 2, proxy_opts: [ head_request_max_read_duration: 5_000 ] diff --git a/config/description.exs b/config/description.exs index 90d8eca65..22da60900 100644 --- a/config/description.exs +++ b/config/description.exs @@ -1925,6 +1925,11 @@ config :pleroma, :config_description, [ type: :integer, description: "Max height of preview thumbnail." }, + %{ + key: :quality, + type: :integer, + description: "Quality of the output. Ranges from 1 (max quality) to 31 (lowest quality)." + }, %{ key: :proxy_opts, type: :keyword, diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index ca46698cc..e11038052 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -7,13 +7,15 @@ defmodule Pleroma.Helpers.MediaHelper do Handles common media-related operations. """ - def ffmpeg_resize(uri_or_path, %{max_width: max_width, max_height: max_height}) do + def ffmpeg_resize(uri_or_path, %{max_width: max_width, max_height: max_height} = options) do + quality = options[:quality] || 1 + cmd = ~s""" ffmpeg -i #{uri_or_path} -f lavfi -i color=c=white \ -filter_complex "[0:v] scale='min(#{max_width},iw)':'min(#{max_height},ih)': \ force_original_aspect_ratio=decrease [scaled]; \ [1][scaled] scale2ref [bg][img]; [bg] setsar=1 [bg]; [bg][img] overlay=shortest=1" \ - -loglevel quiet -f image2 -vcodec mjpeg -frames:v 1 pipe:1 + -loglevel quiet -f image2 -vcodec mjpeg -frames:v 1 -q:v #{quality} pipe:1 """ pid = Port.open({:spawn, cmd}, [:use_stdio, :in, :stream, :exit_status, :binary]) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 5513432f0..1c51aa5e3 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -78,12 +78,14 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end defp handle_image_or_video_preview(%{params: params} = conn, url) do + quality = Config.get!([:media_preview_proxy, :quality]) + with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(params), media_proxy_url <- MediaProxy.url(url), {:ok, thumbnail_binary} <- MediaHelper.ffmpeg_resize( media_proxy_url, - %{max_width: thumbnail_max_width, max_height: thumbnail_max_height} + %{max_width: thumbnail_max_width, max_height: thumbnail_max_height, quality: quality} ) do conn |> put_resp_header("content-type", "image/jpeg") From 967afa064bb0dc85c054495b795a57a13cdf3b3c Mon Sep 17 00:00:00 2001 From: href Date: Fri, 21 Aug 2020 17:02:57 +0000 Subject: [PATCH 015/182] Fix truncated images --- lib/pleroma/helpers/media_helper.ex | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index e11038052..f87be8874 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -19,14 +19,24 @@ defmodule Pleroma.Helpers.MediaHelper do """ pid = Port.open({:spawn, cmd}, [:use_stdio, :in, :stream, :exit_status, :binary]) + loop_recv(pid) + end + defp loop_recv(pid) do + loop_recv(pid, <<>>) + end + + defp loop_recv(pid, acc) do receive do {^pid, {:data, data}} -> - send(pid, {self(), :close}) - {:ok, data} + loop_recv(pid, acc <> data) - {^pid, {:exit_status, status}} when status > 0 -> + {^pid, {:exit_status, 0}} -> + {:ok, acc} + + {^pid, {:exit_status, status}} -> {:error, status} end end + end From 4e6eb22b4af70e611cc61f94ba3d81758036a392 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Fri, 21 Aug 2020 12:19:35 -0500 Subject: [PATCH 016/182] Try to warm the cache with the preview image if preview proxy enabled --- lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex b/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex index dfab105a3..5d8bb72aa 100644 --- a/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex @@ -27,7 +27,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy do end url - |> MediaProxy.url() + |> MediaProxy.preview_url() |> HTTP.get([], adapter: opts) end From edde0d9b54b45a366ecdec01e9826f1ee8d1dc3a Mon Sep 17 00:00:00 2001 From: href Date: Fri, 21 Aug 2020 17:40:49 +0000 Subject: [PATCH 017/182] Remove newline for linter --- lib/pleroma/helpers/media_helper.ex | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index f87be8874..89dd4204b 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -38,5 +38,4 @@ defmodule Pleroma.Helpers.MediaHelper do {:error, status} end end - end From 98f8851f29f940051656caa1715820bce70f8c29 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Sat, 22 Aug 2020 15:12:11 -0500 Subject: [PATCH 018/182] Use the image thumbnail for rich metadata (OGP/Twittercards) --- lib/pleroma/web/metadata/utils.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/metadata/utils.ex b/lib/pleroma/web/metadata/utils.ex index 2f0dfb474..8a206e019 100644 --- a/lib/pleroma/web/metadata/utils.ex +++ b/lib/pleroma/web/metadata/utils.ex @@ -38,7 +38,7 @@ defmodule Pleroma.Web.Metadata.Utils do def scrub_html(content), do: content def attachment_url(url) do - MediaProxy.url(url) + MediaProxy.preview_url(url) end def user_name_string(user) do From 899ea2da3e77ca64598e45eba986d5315b523120 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Tue, 25 Aug 2020 17:18:22 -0500 Subject: [PATCH 019/182] Switch to imagemagick, only support videos --- config/config.exs | 2 +- config/description.exs | 4 ++-- lib/pleroma/helpers/media_helper.ex | 13 ++++++------- .../web/media_proxy/media_proxy_controller.ex | 15 +++++---------- 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/config/config.exs b/config/config.exs index e1558e29e..972b96d2d 100644 --- a/config/config.exs +++ b/config/config.exs @@ -444,7 +444,7 @@ config :pleroma, :media_preview_proxy, enabled: false, thumbnail_max_width: 600, thumbnail_max_height: 600, - quality: 2, + image_quality: 85, proxy_opts: [ head_request_max_read_duration: 5_000 ] diff --git a/config/description.exs b/config/description.exs index 0082cc84f..60f76be45 100644 --- a/config/description.exs +++ b/config/description.exs @@ -1975,9 +1975,9 @@ config :pleroma, :config_description, [ description: "Max height of preview thumbnail." }, %{ - key: :quality, + key: :image_quality, type: :integer, - description: "Quality of the output. Ranges from 1 (max quality) to 31 (lowest quality)." + description: "Quality of the output. Ranges from 0 (min quality) to 100 (max quality)." }, %{ key: :proxy_opts, diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 89dd4204b..07e6dba5e 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -7,18 +7,17 @@ defmodule Pleroma.Helpers.MediaHelper do Handles common media-related operations. """ - def ffmpeg_resize(uri_or_path, %{max_width: max_width, max_height: max_height} = options) do - quality = options[:quality] || 1 + def image_resize(url, %{max_width: max_width, max_height: max_height} = options) do + quality = options[:quality] || 85 cmd = ~s""" - ffmpeg -i #{uri_or_path} -f lavfi -i color=c=white \ - -filter_complex "[0:v] scale='min(#{max_width},iw)':'min(#{max_height},ih)': \ - force_original_aspect_ratio=decrease [scaled]; \ - [1][scaled] scale2ref [bg][img]; [bg] setsar=1 [bg]; [bg][img] overlay=shortest=1" \ - -loglevel quiet -f image2 -vcodec mjpeg -frames:v 1 -q:v #{quality} pipe:1 + convert - -resize '#{max_width}x#{max_height}>' -quality #{quality} - """ pid = Port.open({:spawn, cmd}, [:use_stdio, :in, :stream, :exit_status, :binary]) + {:ok, env} = url |> Pleroma.Web.MediaProxy.url() |> Pleroma.HTTP.get() + image = env.body + Port.command(pid, image) loop_recv(pid) end diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 1c51aa5e3..b925973ba 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -66,25 +66,20 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end defp handle_preview("image/" <> _ = _content_type, conn, url) do - handle_image_or_video_preview(conn, url) - end - - defp handle_preview("video/" <> _ = _content_type, conn, url) do - handle_image_or_video_preview(conn, url) + handle_image_preview(conn, url) end defp handle_preview(content_type, conn, _url) do send_resp(conn, :unprocessable_entity, "Unsupported content type: #{content_type}.") end - defp handle_image_or_video_preview(%{params: params} = conn, url) do - quality = Config.get!([:media_preview_proxy, :quality]) + defp handle_image_preview(%{params: params} = conn, url) do + quality = Config.get!([:media_preview_proxy, :image_quality]) with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(params), - media_proxy_url <- MediaProxy.url(url), {:ok, thumbnail_binary} <- - MediaHelper.ffmpeg_resize( - media_proxy_url, + MediaHelper.image_resize( + url, %{max_width: thumbnail_max_width, max_height: thumbnail_max_height, quality: quality} ) do conn From ddbddc08fc9fe5458edc983c81a77671da34a71f Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Tue, 25 Aug 2020 17:31:55 -0500 Subject: [PATCH 020/182] Redirects for videos right now --- lib/pleroma/web/media_proxy/media_proxy_controller.ex | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index b925973ba..6abbf9e23 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -69,6 +69,12 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do handle_image_preview(conn, url) end + defp handle_preview("video/" <> _ = _content_type, conn, url) do + mediaproxy_url = url |> MediaProxy.url() + + redirect(conn, external: mediaproxy_url) + end + defp handle_preview(content_type, conn, _url) do send_resp(conn, :unprocessable_entity, "Unsupported content type: #{content_type}.") end From afa03ca8e2cffc85628beb5f9a70401d984ab216 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Tue, 25 Aug 2020 17:36:53 -0500 Subject: [PATCH 021/182] Allow both stdin and stdout --- lib/pleroma/helpers/media_helper.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 07e6dba5e..5fe135584 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -14,7 +14,7 @@ defmodule Pleroma.Helpers.MediaHelper do convert - -resize '#{max_width}x#{max_height}>' -quality #{quality} - """ - pid = Port.open({:spawn, cmd}, [:use_stdio, :in, :stream, :exit_status, :binary]) + pid = Port.open({:spawn, cmd}, [:use_stdio, :stream, :exit_status, :binary]) {:ok, env} = url |> Pleroma.Web.MediaProxy.url() |> Pleroma.HTTP.get() image = env.body Port.command(pid, image) From a136e7e9b590e3f23e472bf27c7c6a81d8d7792b Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Tue, 25 Aug 2020 18:10:27 -0500 Subject: [PATCH 022/182] Try specifying fd0, force jpg out --- lib/pleroma/helpers/media_helper.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 5fe135584..01f42d9b0 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -11,7 +11,7 @@ defmodule Pleroma.Helpers.MediaHelper do quality = options[:quality] || 85 cmd = ~s""" - convert - -resize '#{max_width}x#{max_height}>' -quality #{quality} - + convert fd:0 -resize '#{max_width}x#{max_height}>' -quality #{quality} jpg:- """ pid = Port.open({:spawn, cmd}, [:use_stdio, :stream, :exit_status, :binary]) From bc94f0c6da2405e2f1cdae89696970728b6e987f Mon Sep 17 00:00:00 2001 From: href Date: Wed, 26 Aug 2020 16:12:34 +0200 Subject: [PATCH 023/182] Use mkfifo to feed ImageMagick --- lib/pleroma/helpers/media_helper.ex | 70 ++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 10 deletions(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 01f42d9b0..a43352ae0 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -7,18 +7,66 @@ defmodule Pleroma.Helpers.MediaHelper do Handles common media-related operations. """ - def image_resize(url, %{max_width: max_width, max_height: max_height} = options) do + @tmp_base "/tmp/pleroma-media_preview-pipe" + + def image_resize(url, options) do + with executable when is_binary(executable) <- System.find_executable("convert"), + {:ok, args} <- prepare_resize_args(options), + url = Pleroma.Web.MediaProxy.url(url), + {:ok, env} <- Pleroma.HTTP.get(url), + {:ok, fifo_path} <- mkfifo() + do + run_fifo(fifo_path, env, executable, args) + else + nil -> {:error, {:convert, :command_not_found}} + {:error, _} = error -> error + end + end + + defp prepare_resize_args(%{max_width: max_width, max_height: max_height} = options) do quality = options[:quality] || 85 + resize = Enum.join([max_width, "x", max_height, ">"]) + args = [ + "-auto-orient", # Support for EXIF rotation + "-resize", resize, + "-quality", to_string(quality) + ] + {:ok, args} + end - cmd = ~s""" - convert fd:0 -resize '#{max_width}x#{max_height}>' -quality #{quality} jpg:- - """ + defp prepare_resize_args(_), do: {:error, :missing_options} - pid = Port.open({:spawn, cmd}, [:use_stdio, :stream, :exit_status, :binary]) - {:ok, env} = url |> Pleroma.Web.MediaProxy.url() |> Pleroma.HTTP.get() - image = env.body - Port.command(pid, image) + defp run_fifo(fifo_path, env, executable, args) do + args = List.flatten([fifo_path, args, "jpg:fd:1"]) + pid = Port.open({:spawn_executable, executable}, [:use_stdio, :stream, :exit_status, :binary, args: args]) + fifo = Port.open(to_charlist(fifo_path), [:eof, :binary, :stream, :out]) + true = Port.command(fifo, env.body) + :erlang.port_close(fifo) loop_recv(pid) + after + File.rm(fifo_path) + end + + defp mkfifo() do + path = "#{@tmp_base}#{to_charlist(:erlang.phash2(self()))}" + case System.cmd("mkfifo", [path]) do + {_, 0} -> + spawn(fifo_guard(path)) + {:ok, path} + {_, err} -> + {:error, {:fifo_failed, err}} + end + end + + defp fifo_guard(path) do + pid = self() + fn() -> + ref = Process.monitor(pid) + receive do + {:DOWN, ^ref, :process, ^pid, _} -> + File.rm(path) + end + end end defp loop_recv(pid) do @@ -29,12 +77,14 @@ defmodule Pleroma.Helpers.MediaHelper do receive do {^pid, {:data, data}} -> loop_recv(pid, acc <> data) - {^pid, {:exit_status, 0}} -> {:ok, acc} - {^pid, {:exit_status, status}} -> {:error, status} + after + 5000 -> + :erlang.port_close(pid) + {:error, :timeout} end end end From d4d1192341868d978e19777c17be85e331367264 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 26 Aug 2020 14:28:25 +0000 Subject: [PATCH 024/182] Remove auto-orient; don't use it on previews, only originals --- lib/pleroma/helpers/media_helper.ex | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index a43352ae0..db0c4b0cf 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -27,7 +27,6 @@ defmodule Pleroma.Helpers.MediaHelper do quality = options[:quality] || 85 resize = Enum.join([max_width, "x", max_height, ">"]) args = [ - "-auto-orient", # Support for EXIF rotation "-resize", resize, "-quality", to_string(quality) ] From 2c95533ead56217ec27e09e0ead0050e110dff22 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 26 Aug 2020 15:37:45 +0000 Subject: [PATCH 025/182] Change method of convert using stdout, make progressive jpegs --- lib/pleroma/helpers/media_helper.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index db0c4b0cf..3256802a0 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -27,6 +27,7 @@ defmodule Pleroma.Helpers.MediaHelper do quality = options[:quality] || 85 resize = Enum.join([max_width, "x", max_height, ">"]) args = [ + "-interlace", "Plane", "-resize", resize, "-quality", to_string(quality) ] @@ -36,7 +37,7 @@ defmodule Pleroma.Helpers.MediaHelper do defp prepare_resize_args(_), do: {:error, :missing_options} defp run_fifo(fifo_path, env, executable, args) do - args = List.flatten([fifo_path, args, "jpg:fd:1"]) + args = List.flatten([fifo_path, args, "jpg:-"]) pid = Port.open({:spawn_executable, executable}, [:use_stdio, :stream, :exit_status, :binary, args: args]) fifo = Port.open(to_charlist(fifo_path), [:eof, :binary, :stream, :out]) true = Port.command(fifo, env.body) From eead2276e79f29c4d0e10d23eb7524a9ee5f5045 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 26 Aug 2020 16:18:11 -0500 Subject: [PATCH 026/182] Ensure GIFs are redirected to the original or they become static. --- lib/pleroma/web/media_proxy/media_proxy_controller.ex | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 6abbf9e23..d465ce8d1 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -65,6 +65,12 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end + defp handle_preview("image/gif" = _content_type, conn, url) do + mediaproxy_url = url |> MediaProxy.url() + + redirect(conn, external: mediaproxy_url) + end + defp handle_preview("image/" <> _ = _content_type, conn, url) do handle_image_preview(conn, url) end From 9567b96c7927be433eac4f023051adc5cbd6610c Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 26 Aug 2020 16:40:13 -0500 Subject: [PATCH 027/182] Rename to make it obvious this is for images not videos --- lib/pleroma/helpers/media_helper.ex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 3256802a0..fe11dd460 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -11,7 +11,7 @@ defmodule Pleroma.Helpers.MediaHelper do def image_resize(url, options) do with executable when is_binary(executable) <- System.find_executable("convert"), - {:ok, args} <- prepare_resize_args(options), + {:ok, args} <- prepare_image_resize_args(options), url = Pleroma.Web.MediaProxy.url(url), {:ok, env} <- Pleroma.HTTP.get(url), {:ok, fifo_path} <- mkfifo() @@ -23,7 +23,7 @@ defmodule Pleroma.Helpers.MediaHelper do end end - defp prepare_resize_args(%{max_width: max_width, max_height: max_height} = options) do + defp prepare_image_resize_args(%{max_width: max_width, max_height: max_height} = options) do quality = options[:quality] || 85 resize = Enum.join([max_width, "x", max_height, ">"]) args = [ @@ -34,7 +34,7 @@ defmodule Pleroma.Helpers.MediaHelper do {:ok, args} end - defp prepare_resize_args(_), do: {:error, :missing_options} + defp prepare_image_resize_args(_), do: {:error, :missing_options} defp run_fifo(fifo_path, env, executable, args) do args = List.flatten([fifo_path, args, "jpg:-"]) From 697bea04731614bcd2e1e10f0564863dc49a49fa Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 26 Aug 2020 17:43:25 -0500 Subject: [PATCH 028/182] Move arg for images to the list so we can reuse these fifo functions for videos --- lib/pleroma/helpers/media_helper.ex | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index fe11dd460..0299b16ae 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -29,7 +29,8 @@ defmodule Pleroma.Helpers.MediaHelper do args = [ "-interlace", "Plane", "-resize", resize, - "-quality", to_string(quality) + "-quality", to_string(quality), + "jpg:-" ] {:ok, args} end @@ -37,7 +38,7 @@ defmodule Pleroma.Helpers.MediaHelper do defp prepare_image_resize_args(_), do: {:error, :missing_options} defp run_fifo(fifo_path, env, executable, args) do - args = List.flatten([fifo_path, args, "jpg:-"]) + args = List.flatten([fifo_path, args]) pid = Port.open({:spawn_executable, executable}, [:use_stdio, :stream, :exit_status, :binary, args: args]) fifo = Port.open(to_charlist(fifo_path), [:eof, :binary, :stream, :out]) true = Port.command(fifo, env.body) From 157ecf402230c0b786f5765dd8b709d45c45974a Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Thu, 27 Aug 2020 11:46:56 -0500 Subject: [PATCH 029/182] Follow redirects. I think we should be using some global adapter options here, though. --- lib/pleroma/web/media_proxy/media_proxy_controller.ex | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index d465ce8d1..736b7db56 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -50,7 +50,9 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do defp handle_preview(conn, url) do with {:ok, %{status: status} = head_response} when status in 200..299 <- - Tesla.head(url, opts: [adapter: [timeout: preview_head_request_timeout()]]) do + Tesla.head(url, + opts: [adapter: [timeout: preview_head_request_timeout(), follow_redirect: true]] + ) do content_type = Tesla.get_header(head_response, "content-type") handle_preview(content_type, conn, url) else From ef9d12fcc500d7429bee0d6ccffe3596434aee52 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Thu, 27 Aug 2020 12:31:55 -0500 Subject: [PATCH 030/182] Attempt at supporting video thumbnails via ffmpeg --- lib/pleroma/helpers/media_helper.ex | 19 +++++++++++++++++++ .../web/media_proxy/media_proxy_controller.ex | 17 ++++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 0299b16ae..7e1af8bac 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -37,6 +37,25 @@ defmodule Pleroma.Helpers.MediaHelper do defp prepare_image_resize_args(_), do: {:error, :missing_options} + def video_framegrab(url) do + with executable when is_binary(executable) <- System.find_executable("ffmpeg"), + args = [ + "-i", "-", + "-vframes", "1", + "-f", "mjpeg", + "-loglevel", "error", + "-" + ], + url = Pleroma.Web.MediaProxy.url(url), + {:ok, env} <- Pleroma.HTTP.get(url), + {:ok, fifo_path} <- mkfifo() do + run_fifo(fifo_path, env, executable, args) + else + nil -> {:error, {:ffmpeg, :command_not_found}} + {:error, _} = error -> error + end + end + defp run_fifo(fifo_path, env, executable, args) do args = List.flatten([fifo_path, args]) pid = Port.open({:spawn_executable, executable}, [:use_stdio, :stream, :exit_status, :binary, args: args]) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 736b7db56..7ac1a97e2 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -78,9 +78,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end defp handle_preview("video/" <> _ = _content_type, conn, url) do - mediaproxy_url = url |> MediaProxy.url() - - redirect(conn, external: mediaproxy_url) + handle_video_preview(conn, url) end defp handle_preview(content_type, conn, _url) do @@ -106,6 +104,19 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end + defp handle_video_preview(conn, url) do + with {:ok, thumbnail_binary} <- + MediaHelper.video_framegrab(url) do + conn + |> put_resp_header("content-type", "image/jpeg") + |> put_resp_header("content-disposition", "inline; filename=\"preview.jpg\"") + |> send_resp(200, thumbnail_binary) + else + _ -> + send_resp(conn, :failed_dependency, "Can't handle preview.") + end + end + defp thumbnail_max_dimensions(params) do config = Config.get([:media_preview_proxy], []) From f1218a2b4e16178c8c1285157f7cd995dc950e3e Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Thu, 27 Aug 2020 12:47:29 -0500 Subject: [PATCH 031/182] ffmpeg needs input from fifo path, not stdin --- lib/pleroma/helpers/media_helper.ex | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 7e1af8bac..7c2bfbc53 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -39,16 +39,16 @@ defmodule Pleroma.Helpers.MediaHelper do def video_framegrab(url) do with executable when is_binary(executable) <- System.find_executable("ffmpeg"), + url = Pleroma.Web.MediaProxy.url(url), + {:ok, env} <- Pleroma.HTTP.get(url), + {:ok, fifo_path} <- mkfifo(), args = [ - "-i", "-", + "-i", fifo_path, "-vframes", "1", "-f", "mjpeg", "-loglevel", "error", "-" - ], - url = Pleroma.Web.MediaProxy.url(url), - {:ok, env} <- Pleroma.HTTP.get(url), - {:ok, fifo_path} <- mkfifo() do + ] do run_fifo(fifo_path, env, executable, args) else nil -> {:error, {:ffmpeg, :command_not_found}} @@ -57,7 +57,12 @@ defmodule Pleroma.Helpers.MediaHelper do end defp run_fifo(fifo_path, env, executable, args) do - args = List.flatten([fifo_path, args]) + args = + if _executable = System.find_executable("convert") do + List.flatten([fifo_path, args]) + else + args + end pid = Port.open({:spawn_executable, executable}, [:use_stdio, :stream, :exit_status, :binary, args: args]) fifo = Port.open(to_charlist(fifo_path), [:eof, :binary, :stream, :out]) true = Port.command(fifo, env.body) From dd1de994d57e3d9c99bb4e4c7019c696b5153f50 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Thu, 27 Aug 2020 13:10:40 -0500 Subject: [PATCH 032/182] Try to trick ffmpeg into working with this named pipe --- lib/pleroma/helpers/media_helper.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 7c2bfbc53..385a4df81 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -43,11 +43,12 @@ defmodule Pleroma.Helpers.MediaHelper do {:ok, env} <- Pleroma.HTTP.get(url), {:ok, fifo_path} <- mkfifo(), args = [ + "-y", "-i", fifo_path, "-vframes", "1", "-f", "mjpeg", "-loglevel", "error", - "-" + "pipe:" ] do run_fifo(fifo_path, env, executable, args) else From 3a5231ec8fd0583d7f4bf05378d8bb81096c4f40 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Thu, 27 Aug 2020 16:33:37 -0500 Subject: [PATCH 033/182] Keep args construction within video/image scopes instead of mangling down in fifo town --- lib/pleroma/helpers/media_helper.ex | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 385a4df81..b42612ccb 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -16,6 +16,7 @@ defmodule Pleroma.Helpers.MediaHelper do {:ok, env} <- Pleroma.HTTP.get(url), {:ok, fifo_path} <- mkfifo() do + args = List.flatten([fifo_path, args]) run_fifo(fifo_path, env, executable, args) else nil -> {:error, {:convert, :command_not_found}} @@ -58,12 +59,6 @@ defmodule Pleroma.Helpers.MediaHelper do end defp run_fifo(fifo_path, env, executable, args) do - args = - if _executable = System.find_executable("convert") do - List.flatten([fifo_path, args]) - else - args - end pid = Port.open({:spawn_executable, executable}, [:use_stdio, :stream, :exit_status, :binary, args: args]) fifo = Port.open(to_charlist(fifo_path), [:eof, :binary, :stream, :out]) true = Port.command(fifo, env.body) From 67c79394e81cf9f5404afad29a397acf32dece33 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Thu, 27 Aug 2020 17:15:23 -0500 Subject: [PATCH 034/182] Support static avatars and header images with Mediaproxy Preview --- lib/pleroma/web/mastodon_api/views/account_view.ex | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 864c0417f..eef45b35d 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -181,8 +181,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do user = User.sanitize_html(user, User.html_filter_policy(opts[:for])) display_name = user.name || user.nickname - image = User.avatar_url(user) |> MediaProxy.url() + avatar = User.avatar_url(user) |> MediaProxy.url() + avatar_static = User.avatar_url(user) |> MediaProxy.preview_url() header = User.banner_url(user) |> MediaProxy.url() + header_static = User.banner_url(user) |> MediaProxy.preview_url() following_count = if !user.hide_follows_count or !user.hide_follows or opts[:for] == user do @@ -247,10 +249,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do statuses_count: user.note_count, note: user.bio || "", url: user.uri || user.ap_id, - avatar: image, - avatar_static: image, + avatar: avatar, + avatar_static: avatar_static, header: header, - header_static: header, + header_static: header_static, emojis: emojis, fields: user.fields, bot: bot, From 5b4d483f522f470b9d2cdb7f43d98dde427a1241 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Thu, 27 Aug 2020 17:28:21 -0500 Subject: [PATCH 035/182] Add a note about the avatars and banners situation --- lib/pleroma/web/media_proxy/media_proxy_controller.ex | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 7ac1a97e2..411dc95d0 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -67,6 +67,9 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end + # TODO: find a workaround so avatar_static and banner_static can work. + # Those only permit GIFs for animation, so we have to permit a way to + # allow those to get real static variants. defp handle_preview("image/gif" = _content_type, conn, url) do mediaproxy_url = url |> MediaProxy.url() From dfceb03cf47374fdeab60784476b2e266208a4bb Mon Sep 17 00:00:00 2001 From: href Date: Fri, 28 Aug 2020 21:14:28 +0200 Subject: [PATCH 036/182] Rewrite MP4/MOV binaries to be faststart In some cases, MP4/MOV files can have the data _before_ the meta-data. Thus, ffmpeg (and all similar tools) cannot really process the input if it's given over stdin/streaming/pipes. BUT I REALLY DON'T WANT TO MAKE TEMPORARY FILES so here we go, an implementation of qtfaststart in elixir. --- lib/pleroma/helpers/media_helper.ex | 59 ++++++++---- lib/pleroma/helpers/qt_fast_start.ex | 131 +++++++++++++++++++++++++++ 2 files changed, 172 insertions(+), 18 deletions(-) create mode 100644 lib/pleroma/helpers/qt_fast_start.ex diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index b42612ccb..5ac75b326 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -14,8 +14,7 @@ defmodule Pleroma.Helpers.MediaHelper do {:ok, args} <- prepare_image_resize_args(options), url = Pleroma.Web.MediaProxy.url(url), {:ok, env} <- Pleroma.HTTP.get(url), - {:ok, fifo_path} <- mkfifo() - do + {:ok, fifo_path} <- mkfifo() do args = List.flatten([fifo_path, args]) run_fifo(fifo_path, env, executable, args) else @@ -27,12 +26,17 @@ defmodule Pleroma.Helpers.MediaHelper do defp prepare_image_resize_args(%{max_width: max_width, max_height: max_height} = options) do quality = options[:quality] || 85 resize = Enum.join([max_width, "x", max_height, ">"]) + args = [ - "-interlace", "Plane", - "-resize", resize, - "-quality", to_string(quality), - "jpg:-" + "-interlace", + "Plane", + "-resize", + resize, + "-quality", + to_string(quality), + "jpg:-" ] + {:ok, args} end @@ -45,11 +49,15 @@ defmodule Pleroma.Helpers.MediaHelper do {:ok, fifo_path} <- mkfifo(), args = [ "-y", - "-i", fifo_path, - "-vframes", "1", - "-f", "mjpeg", - "-loglevel", "error", - "pipe:" + "-i", + fifo_path, + "-vframes", + "1", + "-f", + "mjpeg", + "-loglevel", + "error", + "-" ] do run_fifo(fifo_path, env, executable, args) else @@ -59,9 +67,18 @@ defmodule Pleroma.Helpers.MediaHelper do end defp run_fifo(fifo_path, env, executable, args) do - pid = Port.open({:spawn_executable, executable}, [:use_stdio, :stream, :exit_status, :binary, args: args]) + pid = + Port.open({:spawn_executable, executable}, [ + :use_stdio, + :stream, + :exit_status, + :binary, + args: args + ]) + fifo = Port.open(to_charlist(fifo_path), [:eof, :binary, :stream, :out]) - true = Port.command(fifo, env.body) + fix = Pleroma.Helpers.QtFastStart.fix(env.body) + true = Port.command(fifo, fix) :erlang.port_close(fifo) loop_recv(pid) after @@ -70,10 +87,12 @@ defmodule Pleroma.Helpers.MediaHelper do defp mkfifo() do path = "#{@tmp_base}#{to_charlist(:erlang.phash2(self()))}" + case System.cmd("mkfifo", [path]) do {_, 0} -> spawn(fifo_guard(path)) {:ok, path} + {_, err} -> {:error, {:fifo_failed, err}} end @@ -81,8 +100,10 @@ defmodule Pleroma.Helpers.MediaHelper do defp fifo_guard(path) do pid = self() - fn() -> + + fn -> ref = Process.monitor(pid) + receive do {:DOWN, ^ref, :process, ^pid, _} -> File.rm(path) @@ -98,14 +119,16 @@ defmodule Pleroma.Helpers.MediaHelper do receive do {^pid, {:data, data}} -> loop_recv(pid, acc <> data) + {^pid, {:exit_status, 0}} -> {:ok, acc} + {^pid, {:exit_status, status}} -> {:error, status} - after - 5000 -> - :erlang.port_close(pid) - {:error, :timeout} + after + 5000 -> + :erlang.port_close(pid) + {:error, :timeout} end end end diff --git a/lib/pleroma/helpers/qt_fast_start.ex b/lib/pleroma/helpers/qt_fast_start.ex new file mode 100644 index 000000000..694b583b9 --- /dev/null +++ b/lib/pleroma/helpers/qt_fast_start.ex @@ -0,0 +1,131 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Helpers.QtFastStart do + @moduledoc """ + (WIP) Converts a "slow start" (data before metadatas) mov/mp4 file to a "fast start" one (metadatas before data). + """ + + # TODO: Cleanup and optimizations + # Inspirations: https://www.ffmpeg.org/doxygen/3.4/qt-faststart_8c_source.html + # https://github.com/danielgtaylor/qtfaststart/blob/master/qtfaststart/processor.py + # ISO/IEC 14496-12:2015, ISO/IEC 15444-12:2015 + # Paracetamol + + def fix(binary = <<0x00, 0x00, 0x00, _, 0x66, 0x74, 0x79, 0x70, _::binary>>) do + index = fix(binary, binary, 0, []) + + case index do + [{"ftyp", _, _, _, _}, {"mdat", _, _, _, _} | _] -> faststart(index) + [{"ftyp", _, _, _, _}, {"free", _, _, _, _}, {"mdat", _, _, _, _} | _] -> faststart(index) + _ -> binary + end + end + + def fix(binary) do + binary + end + + defp fix(<<>>, _bin, _pos, acc) do + :lists.reverse(acc) + end + + defp fix( + <>, + bin, + pos, + acc + ) do + if fourcc == "mdat" && size == 0 do + # mdat with 0 size means "seek to the end" -- also, in that case the file is probably OK. + acc = [ + {fourcc, pos, byte_size(bin) - pos, byte_size(bin) - pos, + <>} + | acc + ] + + fix(<<>>, bin, byte_size(bin), acc) + else + full_size = size - 8 + <> = rest + + acc = [ + {fourcc, pos, pos + size, size, + <>} + | acc + ] + + fix(rest, bin, pos + size, acc) + end + end + + defp faststart(index) do + {{_ftyp, _, _, _, ftyp}, index} = List.keytake(index, "ftyp", 0) + + # Skip re-writing the free fourcc as it's kind of useless. Why stream useless bytes when you can do without? + {free_size, index} = + case List.keytake(index, "free", 0) do + {{_, _, _, size, _}, index} -> {size, index} + _ -> {0, index} + end + + {{_moov, _, _, moov_size, moov}, index} = List.keytake(index, "moov", 0) + offset = -free_size + moov_size + rest = for {_, _, _, _, data} <- index, do: data, into: <<>> + <> = moov + new_moov = fix_moov(moov_data, offset) + <> + end + + defp fix_moov(moov, offset) do + fix_moov(moov, offset, <<>>) + end + + defp fix_moov(<<>>, _, acc), do: acc + + defp fix_moov( + <>, + offset, + acc + ) do + full_size = size - 8 + <> = rest + + data = + cond do + fourcc in ["trak", "mdia", "minf", "stbl"] -> + # Theses contains sto or co64 part + <>)::binary>> + + fourcc in ["stco", "co64"] -> + # fix the damn thing + <> = data + + entry_size = + case fourcc do + "stco" -> 4 + "co64" -> 8 + end + + {_, result} = + Enum.reduce(1..count, {rest, <<>>}, fn _, + {<>, acc} -> + {rest, <>} + end) + + <> + + true -> + <> + end + + acc = <> + fix_moov(rest, offset, acc) + end +end From 24d522c3b366b54b23bebaf07371145d50820d4a Mon Sep 17 00:00:00 2001 From: href Date: Sat, 29 Aug 2020 13:05:23 +0200 Subject: [PATCH 037/182] QtFastStart: optimize ~4-6x faster ~3~4x memory usage reduction (now mostly adds what we are rewriting in the metadatas) --- lib/pleroma/helpers/qt_fast_start.ex | 109 +++++++++++++-------------- 1 file changed, 54 insertions(+), 55 deletions(-) diff --git a/lib/pleroma/helpers/qt_fast_start.ex b/lib/pleroma/helpers/qt_fast_start.ex index 694b583b9..8cba06e54 100644 --- a/lib/pleroma/helpers/qt_fast_start.ex +++ b/lib/pleroma/helpers/qt_fast_start.ex @@ -13,10 +13,11 @@ defmodule Pleroma.Helpers.QtFastStart do # ISO/IEC 14496-12:2015, ISO/IEC 15444-12:2015 # Paracetamol - def fix(binary = <<0x00, 0x00, 0x00, _, 0x66, 0x74, 0x79, 0x70, _::binary>>) do - index = fix(binary, binary, 0, []) + def fix(binary = <<0x00, 0x00, 0x00, _, 0x66, 0x74, 0x79, 0x70, _::bits>>) do + index = fix(binary, 0, nil, nil, []) case index do + :abort -> binary [{"ftyp", _, _, _, _}, {"mdat", _, _, _, _} | _] -> faststart(index) [{"ftyp", _, _, _, _}, {"free", _, _, _, _}, {"mdat", _, _, _, _} | _] -> faststart(index) _ -> binary @@ -27,37 +28,32 @@ defmodule Pleroma.Helpers.QtFastStart do binary end - defp fix(<<>>, _bin, _pos, acc) do - :lists.reverse(acc) + # MOOV have been seen before MDAT- abort + defp fix(<<_::bits>>, _, true, false, _) do + :abort end defp fix( - <>, - bin, + <>, pos, + got_moov, + got_mdat, acc ) do - if fourcc == "mdat" && size == 0 do - # mdat with 0 size means "seek to the end" -- also, in that case the file is probably OK. - acc = [ - {fourcc, pos, byte_size(bin) - pos, byte_size(bin) - pos, - <>} - | acc - ] + full_size = (size - 8) * 8 + <> = rest - fix(<<>>, bin, byte_size(bin), acc) - else - full_size = size - 8 - <> = rest + acc = [ + {fourcc, pos, pos + size, size, + <>} + | acc + ] - acc = [ - {fourcc, pos, pos + size, size, - <>} - | acc - ] + fix(rest, pos + size, got_moov || fourcc == "moov", got_mdat || fourcc == "mdat", acc) + end - fix(rest, bin, pos + size, acc) - end + defp fix(<<>>, _pos, _, _, acc) do + :lists.reverse(acc) end defp faststart(index) do @@ -72,60 +68,63 @@ defmodule Pleroma.Helpers.QtFastStart do {{_moov, _, _, moov_size, moov}, index} = List.keytake(index, "moov", 0) offset = -free_size + moov_size - rest = for {_, _, _, _, data} <- index, do: data, into: <<>> - <> = moov - new_moov = fix_moov(moov_data, offset) - <> + rest = for {_, _, _, _, data} <- index, do: data, into: [] + <> = moov + [ftyp, moov_head, fix_moov(moov_data, offset, []), rest] end - defp fix_moov(moov, offset) do - fix_moov(moov, offset, <<>>) - end - - defp fix_moov(<<>>, _, acc), do: acc - defp fix_moov( - <>, + <>, offset, acc ) do - full_size = size - 8 - <> = rest + full_size = (size - 8) * 8 + <> = rest data = cond do fourcc in ["trak", "mdia", "minf", "stbl"] -> # Theses contains sto or co64 part - <>)::binary>> + [<>, fix_moov(data, offset, [])] fourcc in ["stco", "co64"] -> # fix the damn thing - <> = data + <> = data entry_size = case fourcc do - "stco" -> 4 - "co64" -> 8 + "stco" -> 32 + "co64" -> 64 end - {_, result} = - Enum.reduce(1..count, {rest, <<>>}, fn _, - {<>, acc} -> - {rest, <>} - end) - - <> + [ + <>, + rewrite_entries(entry_size, offset, rest, []) + ] true -> - <> + [<>, data] end - acc = <> + acc = [acc | data] fix_moov(rest, offset, acc) end + + defp fix_moov(<<>>, _, acc), do: acc + + for size <- [32, 64] do + defp rewrite_entries( + unquote(size), + offset, + <>, + acc + ) do + rewrite_entries(unquote(size), offset, rest, [ + acc | <> + ]) + end + end + + defp rewrite_entries(_, _, <<>>, acc), do: acc end From 2d2af75777ae468fb08a2b09dc5af4636106a04b Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Sun, 30 Aug 2020 09:17:24 -0500 Subject: [PATCH 038/182] Support PNG previews to preserve alpha channels --- lib/pleroma/helpers/media_helper.ex | 17 ++++++++++ .../web/media_proxy/media_proxy_controller.ex | 32 +++++++++++++++++-- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 5ac75b326..d8a6db4e1 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -23,6 +23,23 @@ defmodule Pleroma.Helpers.MediaHelper do end end + defp prepare_image_resize_args( + %{max_width: max_width, max_height: max_height, format: "png"} = options + ) do + quality = options[:quality] || 85 + resize = Enum.join([max_width, "x", max_height, ">"]) + + args = [ + "-resize", + resize, + "-quality", + to_string(quality), + "png:-" + ] + + {:ok, args} + end + defp prepare_image_resize_args(%{max_width: max_width, max_height: max_height} = options) do quality = options[:quality] || 85 resize = Enum.join([max_width, "x", max_height, ">"]) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 411dc95d0..94fae6cac 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -76,8 +76,12 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do redirect(conn, external: mediaproxy_url) end + defp handle_preview("image/png" <> _ = _content_type, conn, url) do + handle_png_preview(conn, url) + end + defp handle_preview("image/" <> _ = _content_type, conn, url) do - handle_image_preview(conn, url) + handle_jpeg_preview(conn, url) end defp handle_preview("video/" <> _ = _content_type, conn, url) do @@ -88,7 +92,31 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do send_resp(conn, :unprocessable_entity, "Unsupported content type: #{content_type}.") end - defp handle_image_preview(%{params: params} = conn, url) do + defp handle_png_preview(%{params: params} = conn, url) do + quality = Config.get!([:media_preview_proxy, :image_quality]) + + with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(params), + {:ok, thumbnail_binary} <- + MediaHelper.image_resize( + url, + %{ + max_width: thumbnail_max_width, + max_height: thumbnail_max_height, + quality: quality, + format: "png" + } + ) do + conn + |> put_resp_header("content-type", "image/png") + |> put_resp_header("content-disposition", "inline; filename=\"preview.png\"") + |> send_resp(200, thumbnail_binary) + else + _ -> + send_resp(conn, :failed_dependency, "Can't handle preview.") + end + end + + defp handle_jpeg_preview(%{params: params} = conn, url) do quality = Config.get!([:media_preview_proxy, :image_quality]) with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(params), From 4ef210a587113313cd6887b7499832d0c0798f7f Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Sun, 30 Aug 2020 09:32:22 -0500 Subject: [PATCH 039/182] Credo --- lib/pleroma/helpers/media_helper.ex | 2 +- lib/pleroma/helpers/qt_fast_start.ex | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index d8a6db4e1..9bd815c26 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -102,7 +102,7 @@ defmodule Pleroma.Helpers.MediaHelper do File.rm(fifo_path) end - defp mkfifo() do + defp mkfifo do path = "#{@tmp_base}#{to_charlist(:erlang.phash2(self()))}" case System.cmd("mkfifo", [path]) do diff --git a/lib/pleroma/helpers/qt_fast_start.ex b/lib/pleroma/helpers/qt_fast_start.ex index 8cba06e54..bb93224b5 100644 --- a/lib/pleroma/helpers/qt_fast_start.ex +++ b/lib/pleroma/helpers/qt_fast_start.ex @@ -13,7 +13,7 @@ defmodule Pleroma.Helpers.QtFastStart do # ISO/IEC 14496-12:2015, ISO/IEC 15444-12:2015 # Paracetamol - def fix(binary = <<0x00, 0x00, 0x00, _, 0x66, 0x74, 0x79, 0x70, _::bits>>) do + def fix(<<0x00, 0x00, 0x00, _, 0x66, 0x74, 0x79, 0x70, _::bits>> = binary) do index = fix(binary, 0, nil, nil, []) case index do @@ -59,7 +59,8 @@ defmodule Pleroma.Helpers.QtFastStart do defp faststart(index) do {{_ftyp, _, _, _, ftyp}, index} = List.keytake(index, "ftyp", 0) - # Skip re-writing the free fourcc as it's kind of useless. Why stream useless bytes when you can do without? + # Skip re-writing the free fourcc as it's kind of useless. + # Why stream useless bytes when you can do without? {free_size, index} = case List.keytake(index, "free", 0) do {{_, _, _, size, _}, index} -> {size, index} From 0a839d51a7adb034d6514ea647d90546c829813d Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Mon, 31 Aug 2020 13:08:50 +0300 Subject: [PATCH 040/182] [#2497] Added Cache-Control response header for media proxy preview endpoint. --- .../web/media_proxy/media_proxy_controller.ex | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 94fae6cac..2afcd861a 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -107,8 +107,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do } ) do conn - |> put_resp_header("content-type", "image/png") - |> put_resp_header("content-disposition", "inline; filename=\"preview.png\"") + |> put_preview_response_headers() |> send_resp(200, thumbnail_binary) else _ -> @@ -126,8 +125,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do %{max_width: thumbnail_max_width, max_height: thumbnail_max_height, quality: quality} ) do conn - |> put_resp_header("content-type", "image/jpeg") - |> put_resp_header("content-disposition", "inline; filename=\"preview.jpg\"") + |> put_preview_response_headers() |> send_resp(200, thumbnail_binary) else _ -> @@ -139,8 +137,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do with {:ok, thumbnail_binary} <- MediaHelper.video_framegrab(url) do conn - |> put_resp_header("content-type", "image/jpeg") - |> put_resp_header("content-disposition", "inline; filename=\"preview.jpg\"") + |> put_preview_response_headers() |> send_resp(200, thumbnail_binary) else _ -> @@ -148,6 +145,13 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end + defp put_preview_response_headers(conn) do + conn + |> put_resp_header("content-type", "image/jpeg") + |> put_resp_header("content-disposition", "inline; filename=\"preview.jpg\"") + |> put_resp_header("cache-control", "max-age=0, private, must-revalidate") + end + defp thumbnail_max_dimensions(params) do config = Config.get([:media_preview_proxy], []) From 6ce28c409137972ee9b105b9d7ab4a0fd2a0d08b Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Tue, 1 Sep 2020 21:21:58 +0300 Subject: [PATCH 041/182] [#2497] Fix for png media proxy preview response headers (content-type & content-disposition). --- lib/pleroma/web/media_proxy/media_proxy_controller.ex | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 2afcd861a..961c73666 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -67,7 +67,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end - # TODO: find a workaround so avatar_static and banner_static can work. + # TODO: find a workaround so avatar_static and header_static can work. # Those only permit GIFs for animation, so we have to permit a way to # allow those to get real static variants. defp handle_preview("image/gif" = _content_type, conn, url) do @@ -107,7 +107,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do } ) do conn - |> put_preview_response_headers() + |> put_preview_response_headers("image/png", "preview.png") |> send_resp(200, thumbnail_binary) else _ -> @@ -145,10 +145,10 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end - defp put_preview_response_headers(conn) do + defp put_preview_response_headers(conn, content_type \\ "image/jpeg", filename \\ "preview.jpg") do conn - |> put_resp_header("content-type", "image/jpeg") - |> put_resp_header("content-disposition", "inline; filename=\"preview.jpg\"") + |> put_resp_header("content-type", content_type) + |> put_resp_header("content-disposition", "inline; filename=\"#{filename}\"") |> put_resp_header("cache-control", "max-age=0, private, must-revalidate") end From 60c925380da644866836fa4a275f4d57eaaada04 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Thu, 3 Sep 2020 20:13:29 +0300 Subject: [PATCH 042/182] [#2497] Added support for enforcing output format for media proxy preview, used for avatar_static & header_static (AccountView). --- lib/pleroma/helpers/uri_helper.ex | 1 + .../web/mastodon_api/views/account_view.ex | 4 ++-- lib/pleroma/web/media_proxy/media_proxy.ex | 15 +++++++++------ .../web/media_proxy/media_proxy_controller.ex | 11 ++++++++--- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/lib/pleroma/helpers/uri_helper.ex b/lib/pleroma/helpers/uri_helper.ex index 6d205a636..9c9e53447 100644 --- a/lib/pleroma/helpers/uri_helper.ex +++ b/lib/pleroma/helpers/uri_helper.ex @@ -15,6 +15,7 @@ defmodule Pleroma.Helpers.UriHelper do uri |> Map.put(:query, URI.encode_query(updated_params)) |> URI.to_string() + |> String.replace_suffix("?", "") end def maybe_add_base("/" <> uri, base), do: Path.join([base, uri]) diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 7eb4e86fe..a811f81c2 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -182,9 +182,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do display_name = user.name || user.nickname avatar = User.avatar_url(user) |> MediaProxy.url() - avatar_static = User.avatar_url(user) |> MediaProxy.preview_url() + avatar_static = User.avatar_url(user) |> MediaProxy.preview_url(output_format: "jpeg") header = User.banner_url(user) |> MediaProxy.url() - header_static = User.banner_url(user) |> MediaProxy.preview_url() + header_static = User.banner_url(user) |> MediaProxy.preview_url(output_format: "jpeg") following_count = if !user.hide_follows_count or !user.hide_follows or opts[:for] == user do diff --git a/lib/pleroma/web/media_proxy/media_proxy.ex b/lib/pleroma/web/media_proxy/media_proxy.ex index 6695d49ce..4cbe1cf89 100644 --- a/lib/pleroma/web/media_proxy/media_proxy.ex +++ b/lib/pleroma/web/media_proxy/media_proxy.ex @@ -4,6 +4,7 @@ defmodule Pleroma.Web.MediaProxy do alias Pleroma.Config + alias Pleroma.Helpers.UriHelper alias Pleroma.Upload alias Pleroma.Web alias Pleroma.Web.MediaProxy.Invalidation @@ -58,9 +59,9 @@ defmodule Pleroma.Web.MediaProxy do # Note: routing all URLs to preview handler (even local and whitelisted). # Preview handler will call url/1 on decoded URLs, and applicable ones will detour media proxy. - def preview_url(url) do + def preview_url(url, preview_params \\ []) do if preview_enabled?() do - encode_preview_url(url) + encode_preview_url(url, preview_params) else url end @@ -116,10 +117,10 @@ defmodule Pleroma.Web.MediaProxy do build_url(sig64, base64, filename(url)) end - def encode_preview_url(url) do + def encode_preview_url(url, preview_params \\ []) do {base64, sig64} = base64_sig64(url) - build_preview_url(sig64, base64, filename(url)) + build_preview_url(sig64, base64, filename(url), preview_params) end def decode_url(sig, url) do @@ -155,8 +156,10 @@ defmodule Pleroma.Web.MediaProxy do proxy_url("proxy", sig_base64, url_base64, filename) end - def build_preview_url(sig_base64, url_base64, filename \\ nil) do - proxy_url("proxy/preview", sig_base64, url_base64, filename) + def build_preview_url(sig_base64, url_base64, filename \\ nil, preview_params \\ []) do + uri = proxy_url("proxy/preview", sig_base64, url_base64, filename) + + UriHelper.append_uri_params(uri, preview_params) end def verify_request_path_and_url( diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 961c73666..9dc76e928 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -67,9 +67,14 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end - # TODO: find a workaround so avatar_static and header_static can work. - # Those only permit GIFs for animation, so we have to permit a way to - # allow those to get real static variants. + defp handle_preview( + "image/" <> _ = _content_type, + %{params: %{"output_format" => "jpeg"}} = conn, + url + ) do + handle_jpeg_preview(conn, url) + end + defp handle_preview("image/gif" = _content_type, conn, url) do mediaproxy_url = url |> MediaProxy.url() From 6141eb94ab034b5141a5c60b2814fb45b829c1ac Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Thu, 3 Sep 2020 12:40:42 -0500 Subject: [PATCH 043/182] Fetch preview requests through the MediaProxy. Separate connection options are not needed. Use a separate pool for preview requests --- config/config.exs | 10 +++++---- config/description.exs | 21 ------------------- .../web/media_proxy/media_proxy_controller.ex | 17 ++------------- 3 files changed, 8 insertions(+), 40 deletions(-) diff --git a/config/config.exs b/config/config.exs index 317ef84a9..d691753bd 100644 --- a/config/config.exs +++ b/config/config.exs @@ -445,10 +445,7 @@ config :pleroma, :media_preview_proxy, enabled: false, thumbnail_max_width: 600, thumbnail_max_height: 600, - image_quality: 85, - proxy_opts: [ - head_request_max_read_duration: 5_000 - ] + image_quality: 85 config :pleroma, :chat, enabled: true @@ -761,6 +758,11 @@ config :pleroma, :pools, max_waiting: 10, timeout: 10_000 ], + preview: [ + size: 50, + max_waiting: 10, + timeout: 10_000 + ], upload: [ size: 25, max_waiting: 5, diff --git a/config/description.exs b/config/description.exs index 868b89d29..73333d6e6 100644 --- a/config/description.exs +++ b/config/description.exs @@ -1978,27 +1978,6 @@ config :pleroma, :config_description, [ key: :image_quality, type: :integer, description: "Quality of the output. Ranges from 0 (min quality) to 100 (max quality)." - }, - %{ - key: :proxy_opts, - type: :keyword, - description: "Media proxy options", - suggestions: [ - head_request_max_read_duration: 5_000 - ], - children: [ - %{ - key: :head_request_max_read_duration, - type: :integer, - description: "Timeout (in milliseconds) of HEAD request to remote URI." - } - ] - }, - %{ - key: :whitelist, - type: {:list, :string}, - description: "List of hosts with scheme to bypass the mediaproxy", - suggestions: ["http://example.com"] } ] }, diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 961c73666..b1f00fa0c 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -33,8 +33,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do def preview(conn, %{"sig" => sig64, "url" => url64}) do with {_, true} <- {:enabled, MediaProxy.preview_enabled?()}, - {:ok, url} <- MediaProxy.decode_url(sig64, url64), - :ok <- MediaProxy.verify_request_path_and_url(conn, url) do + {:ok, url} <- MediaProxy.decode_url(sig64, url64) do handle_preview(conn, url) else {:enabled, false} -> @@ -50,9 +49,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do defp handle_preview(conn, url) do with {:ok, %{status: status} = head_response} when status in 200..299 <- - Tesla.head(url, - opts: [adapter: [timeout: preview_head_request_timeout(), follow_redirect: true]] - ) do + Pleroma.HTTP.request("head", MediaProxy.url(url), [], [], [adapter: [pool: :preview]]) do content_type = Tesla.get_header(head_response, "content-type") handle_preview(content_type, conn, url) else @@ -172,17 +169,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do {thumbnail_max_width, thumbnail_max_height} end - defp preview_head_request_timeout do - Keyword.get(media_preview_proxy_opts(), :head_request_max_read_duration) || - Keyword.get(media_proxy_opts(), :max_read_duration) || - ReverseProxy.max_read_duration_default() - end - defp media_proxy_opts do Config.get([:media_proxy, :proxy_opts], []) end - - defp media_preview_proxy_opts do - Config.get([:media_preview_proxy, :proxy_opts], []) - end end From b529616e110b3d487f1f2c462791ceabe8f1baf3 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Thu, 3 Sep 2020 15:08:12 -0500 Subject: [PATCH 044/182] Increase pool and timeout for preview so it catches slow media pool responses --- config/config.exs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.exs b/config/config.exs index d691753bd..b92d3ccbb 100644 --- a/config/config.exs +++ b/config/config.exs @@ -760,8 +760,8 @@ config :pleroma, :pools, ], preview: [ size: 50, - max_waiting: 10, - timeout: 10_000 + max_waiting: 20, + timeout: 15_000 ], upload: [ size: 25, From f25b0e87f3dd73e02c954c5baab3c52becdd9c9e Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Thu, 3 Sep 2020 15:28:57 -0500 Subject: [PATCH 045/182] URL passed to helper is already MediaProxy Set :preview pool on the request --- lib/pleroma/helpers/media_helper.ex | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 9bd815c26..cfb091f82 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -12,8 +12,7 @@ defmodule Pleroma.Helpers.MediaHelper do def image_resize(url, options) do with executable when is_binary(executable) <- System.find_executable("convert"), {:ok, args} <- prepare_image_resize_args(options), - url = Pleroma.Web.MediaProxy.url(url), - {:ok, env} <- Pleroma.HTTP.get(url), + {:ok, env} <- Pleroma.HTTP.get(url, [], [adapter: [pool: :preview]]), {:ok, fifo_path} <- mkfifo() do args = List.flatten([fifo_path, args]) run_fifo(fifo_path, env, executable, args) @@ -61,8 +60,7 @@ defmodule Pleroma.Helpers.MediaHelper do def video_framegrab(url) do with executable when is_binary(executable) <- System.find_executable("ffmpeg"), - url = Pleroma.Web.MediaProxy.url(url), - {:ok, env} <- Pleroma.HTTP.get(url), + {:ok, env} <- Pleroma.HTTP.get(url, [], [adapter: [pool: :preview]]), {:ok, fifo_path} <- mkfifo(), args = [ "-y", From c3b02341bf4ab610e9425d6811dca057e9f811a4 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Sat, 5 Sep 2020 16:16:35 +0300 Subject: [PATCH 046/182] [#2497] Made media preview proxy fall back to media proxy instead of to source url. Adjusted tests. Refactoring. --- lib/pleroma/helpers/media_helper.ex | 6 ++- lib/pleroma/web/media_proxy/media_proxy.ex | 4 +- .../web/media_proxy/media_proxy_controller.ex | 50 ++++++++++--------- .../mastodon_api/views/account_view_test.exs | 33 ++++++------ 4 files changed, 51 insertions(+), 42 deletions(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index cfb091f82..bb93d4915 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -7,12 +7,14 @@ defmodule Pleroma.Helpers.MediaHelper do Handles common media-related operations. """ + alias Pleroma.HTTP + @tmp_base "/tmp/pleroma-media_preview-pipe" def image_resize(url, options) do with executable when is_binary(executable) <- System.find_executable("convert"), {:ok, args} <- prepare_image_resize_args(options), - {:ok, env} <- Pleroma.HTTP.get(url, [], [adapter: [pool: :preview]]), + {:ok, env} <- HTTP.get(url, [], adapter: [pool: :preview]), {:ok, fifo_path} <- mkfifo() do args = List.flatten([fifo_path, args]) run_fifo(fifo_path, env, executable, args) @@ -60,7 +62,7 @@ defmodule Pleroma.Helpers.MediaHelper do def video_framegrab(url) do with executable when is_binary(executable) <- System.find_executable("ffmpeg"), - {:ok, env} <- Pleroma.HTTP.get(url, [], [adapter: [pool: :preview]]), + {:ok, env} <- HTTP.get(url, [], adapter: [pool: :preview]), {:ok, fifo_path} <- mkfifo(), args = [ "-y", diff --git a/lib/pleroma/web/media_proxy/media_proxy.ex b/lib/pleroma/web/media_proxy/media_proxy.ex index 4cbe1cf89..80017cde1 100644 --- a/lib/pleroma/web/media_proxy/media_proxy.ex +++ b/lib/pleroma/web/media_proxy/media_proxy.ex @@ -57,13 +57,11 @@ defmodule Pleroma.Web.MediaProxy do end end - # Note: routing all URLs to preview handler (even local and whitelisted). - # Preview handler will call url/1 on decoded URLs, and applicable ones will detour media proxy. def preview_url(url, preview_params \\ []) do if preview_enabled?() do encode_preview_url(url, preview_params) else - url + url(url) end end diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 33daa1e05..469fbae59 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -48,10 +48,12 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end defp handle_preview(conn, url) do + media_proxy_url = MediaProxy.url(url) + with {:ok, %{status: status} = head_response} when status in 200..299 <- - Pleroma.HTTP.request("head", MediaProxy.url(url), [], [], [adapter: [pool: :preview]]) do + Pleroma.HTTP.request("head", media_proxy_url, [], [], adapter: [pool: :preview]) do content_type = Tesla.get_header(head_response, "content-type") - handle_preview(content_type, conn, url) + handle_preview(content_type, conn, media_proxy_url) else {_, %{status: status}} -> send_resp(conn, :failed_dependency, "Can't fetch HTTP headers (HTTP #{status}).") @@ -67,40 +69,38 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do defp handle_preview( "image/" <> _ = _content_type, %{params: %{"output_format" => "jpeg"}} = conn, - url + media_proxy_url ) do - handle_jpeg_preview(conn, url) + handle_jpeg_preview(conn, media_proxy_url) end - defp handle_preview("image/gif" = _content_type, conn, url) do - mediaproxy_url = url |> MediaProxy.url() - - redirect(conn, external: mediaproxy_url) + defp handle_preview("image/gif" = _content_type, conn, media_proxy_url) do + redirect(conn, external: media_proxy_url) end - defp handle_preview("image/png" <> _ = _content_type, conn, url) do - handle_png_preview(conn, url) + defp handle_preview("image/png" <> _ = _content_type, conn, media_proxy_url) do + handle_png_preview(conn, media_proxy_url) end - defp handle_preview("image/" <> _ = _content_type, conn, url) do - handle_jpeg_preview(conn, url) + defp handle_preview("image/" <> _ = _content_type, conn, media_proxy_url) do + handle_jpeg_preview(conn, media_proxy_url) end - defp handle_preview("video/" <> _ = _content_type, conn, url) do - handle_video_preview(conn, url) + defp handle_preview("video/" <> _ = _content_type, conn, media_proxy_url) do + handle_video_preview(conn, media_proxy_url) end - defp handle_preview(content_type, conn, _url) do + defp handle_preview(content_type, conn, _media_proxy_url) do send_resp(conn, :unprocessable_entity, "Unsupported content type: #{content_type}.") end - defp handle_png_preview(%{params: params} = conn, url) do + defp handle_png_preview(%{params: params} = conn, media_proxy_url) do quality = Config.get!([:media_preview_proxy, :image_quality]) with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(params), {:ok, thumbnail_binary} <- MediaHelper.image_resize( - url, + media_proxy_url, %{ max_width: thumbnail_max_width, max_height: thumbnail_max_height, @@ -109,7 +109,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do } ) do conn - |> put_preview_response_headers("image/png", "preview.png") + |> put_preview_response_headers(["image/png", "preview.png"]) |> send_resp(200, thumbnail_binary) else _ -> @@ -117,13 +117,13 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end - defp handle_jpeg_preview(%{params: params} = conn, url) do + defp handle_jpeg_preview(%{params: params} = conn, media_proxy_url) do quality = Config.get!([:media_preview_proxy, :image_quality]) with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(params), {:ok, thumbnail_binary} <- MediaHelper.image_resize( - url, + media_proxy_url, %{max_width: thumbnail_max_width, max_height: thumbnail_max_height, quality: quality} ) do conn @@ -135,9 +135,9 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end - defp handle_video_preview(conn, url) do + defp handle_video_preview(conn, media_proxy_url) do with {:ok, thumbnail_binary} <- - MediaHelper.video_framegrab(url) do + MediaHelper.video_framegrab(media_proxy_url) do conn |> put_preview_response_headers() |> send_resp(200, thumbnail_binary) @@ -147,10 +147,14 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end - defp put_preview_response_headers(conn, content_type \\ "image/jpeg", filename \\ "preview.jpg") do + defp put_preview_response_headers( + conn, + [content_type, filename] = _content_info \\ ["image/jpeg", "preview.jpg"] + ) do conn |> put_resp_header("content-type", content_type) |> put_resp_header("content-disposition", "inline; filename=\"#{filename}\"") + # TODO: enable caching |> put_resp_header("cache-control", "max-age=0, private, must-revalidate") end diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index 8f37efa3c..2f56d9c8f 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -541,8 +541,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do end end - test "uses mediaproxy urls when it's enabled" do + test "uses mediaproxy urls when it's enabled (regardless of media preview proxy state)" do clear_config([:media_proxy, :enabled], true) + clear_config([:media_preview_proxy, :enabled]) user = insert(:user, @@ -551,20 +552,24 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do emoji: %{"joker_smile" => "https://evil.website/society.png"} ) - AccountView.render("show.json", %{user: user, skip_visibility_check: true}) - |> Enum.all?(fn - {key, url} when key in [:avatar, :avatar_static, :header, :header_static] -> - String.starts_with?(url, Pleroma.Web.base_url()) + with media_preview_enabled <- [false, true] do + Config.put([:media_preview_proxy, :enabled], media_preview_enabled) - {:emojis, emojis} -> - Enum.all?(emojis, fn %{url: url, static_url: static_url} -> - String.starts_with?(url, Pleroma.Web.base_url()) && - String.starts_with?(static_url, Pleroma.Web.base_url()) - end) + AccountView.render("show.json", %{user: user, skip_visibility_check: true}) + |> Enum.all?(fn + {key, url} when key in [:avatar, :avatar_static, :header, :header_static] -> + String.starts_with?(url, Pleroma.Web.base_url()) - _ -> - true - end) - |> assert() + {:emojis, emojis} -> + Enum.all?(emojis, fn %{url: url, static_url: static_url} -> + String.starts_with?(url, Pleroma.Web.base_url()) && + String.starts_with?(static_url, Pleroma.Web.base_url()) + end) + + _ -> + true + end) + |> assert() + end end end From f170d471307ba0082b98351190b3d6b808bdfe1a Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Sat, 5 Sep 2020 20:19:09 +0300 Subject: [PATCH 047/182] [#2497] Adjusted media proxy preview invalidation. Allowed client-side caching for media preview. Adjusted prewarmer to fetch only proxiable URIs. Removed :preview pool in favor of existing :media one. Misc. refactoring. --- config/config.exs | 5 ---- lib/pleroma/helpers/media_helper.ex | 4 +-- lib/pleroma/reverse_proxy/reverse_proxy.ex | 1 + .../mrf/media_proxy_warming_policy.ex | 27 +++++++++++-------- lib/pleroma/web/media_proxy/invalidation.ex | 4 ++- lib/pleroma/web/media_proxy/media_proxy.ex | 20 +++++++------- .../web/media_proxy/media_proxy_controller.ex | 5 ++-- 7 files changed, 34 insertions(+), 32 deletions(-) diff --git a/config/config.exs b/config/config.exs index b92d3ccbb..e5b7e18df 100644 --- a/config/config.exs +++ b/config/config.exs @@ -754,11 +754,6 @@ config :pleroma, :pools, timeout: 10_000 ], media: [ - size: 50, - max_waiting: 10, - timeout: 10_000 - ], - preview: [ size: 50, max_waiting: 20, timeout: 15_000 diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index bb93d4915..a1205e10d 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -14,7 +14,7 @@ defmodule Pleroma.Helpers.MediaHelper do def image_resize(url, options) do with executable when is_binary(executable) <- System.find_executable("convert"), {:ok, args} <- prepare_image_resize_args(options), - {:ok, env} <- HTTP.get(url, [], adapter: [pool: :preview]), + {:ok, env} <- HTTP.get(url, [], adapter: [pool: :media]), {:ok, fifo_path} <- mkfifo() do args = List.flatten([fifo_path, args]) run_fifo(fifo_path, env, executable, args) @@ -62,7 +62,7 @@ defmodule Pleroma.Helpers.MediaHelper do def video_framegrab(url) do with executable when is_binary(executable) <- System.find_executable("ffmpeg"), - {:ok, env} <- HTTP.get(url, [], adapter: [pool: :preview]), + {:ok, env} <- HTTP.get(url, [], adapter: [pool: :media]), {:ok, fifo_path} <- mkfifo(), args = [ "-y", diff --git a/lib/pleroma/reverse_proxy/reverse_proxy.ex b/lib/pleroma/reverse_proxy/reverse_proxy.ex index 35637e934..8ae1157df 100644 --- a/lib/pleroma/reverse_proxy/reverse_proxy.ex +++ b/lib/pleroma/reverse_proxy/reverse_proxy.ex @@ -18,6 +18,7 @@ defmodule Pleroma.ReverseProxy do @methods ~w(GET HEAD) def max_read_duration_default, do: @max_read_duration + def default_cache_control_header, do: @default_cache_control_header @moduledoc """ A reverse proxy. diff --git a/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex b/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex index 5d8bb72aa..1050b74ba 100644 --- a/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex @@ -12,23 +12,28 @@ defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy do require Logger - @options [ + @adapter_options [ pool: :media ] def perform(:prefetch, url) do - Logger.debug("Prefetching #{inspect(url)}") + # Fetching only proxiable resources + if MediaProxy.enabled?() and MediaProxy.url_proxiable?(url) do + # If preview proxy is enabled, it'll also hit media proxy (so we're caching both requests) + prefetch_url = MediaProxy.preview_url(url) - opts = - if Application.get_env(:tesla, :adapter) == Tesla.Adapter.Hackney do - Keyword.put(@options, :recv_timeout, 10_000) - else - @options - end + Logger.debug("Prefetching #{inspect(url)} as #{inspect(prefetch_url)}") - url - |> MediaProxy.preview_url() - |> HTTP.get([], adapter: opts) + HTTP.get(prefetch_url, [], adapter: adapter_options()) + end + end + + defp adapter_options do + if Application.get_env(:tesla, :adapter) == Tesla.Adapter.Hackney do + Keyword.put(@adapter_options, :recv_timeout, 10_000) + else + @adapter_options + end end def perform(:preload, %{"object" => %{"attachment" => attachments}} = _message) do diff --git a/lib/pleroma/web/media_proxy/invalidation.ex b/lib/pleroma/web/media_proxy/invalidation.ex index 5808861e6..4f4340478 100644 --- a/lib/pleroma/web/media_proxy/invalidation.ex +++ b/lib/pleroma/web/media_proxy/invalidation.ex @@ -33,6 +33,8 @@ defmodule Pleroma.Web.MediaProxy.Invalidation do def prepare_urls(urls) do urls |> List.wrap() - |> Enum.map(&MediaProxy.url/1) + |> Enum.map(fn url -> [MediaProxy.url(url), MediaProxy.preview_url(url)] end) + |> List.flatten() + |> Enum.uniq() end end diff --git a/lib/pleroma/web/media_proxy/media_proxy.ex b/lib/pleroma/web/media_proxy/media_proxy.ex index 80017cde1..ba553998b 100644 --- a/lib/pleroma/web/media_proxy/media_proxy.ex +++ b/lib/pleroma/web/media_proxy/media_proxy.ex @@ -41,20 +41,16 @@ defmodule Pleroma.Web.MediaProxy do def url("/" <> _ = url), do: url def url(url) do - if not enabled?() or not url_proxiable?(url) do - url - else + if enabled?() and url_proxiable?(url) do encode_url(url) + else + url end end @spec url_proxiable?(String.t()) :: boolean() def url_proxiable?(url) do - if local?(url) or whitelisted?(url) do - false - else - true - end + not local?(url) and not whitelisted?(url) end def preview_url(url, preview_params \\ []) do @@ -69,7 +65,7 @@ defmodule Pleroma.Web.MediaProxy do # Note: media proxy must be enabled for media preview proxy in order to load all # non-local non-whitelisted URLs through it and be sure that body size constraint is preserved. - def preview_enabled?, do: enabled?() and Config.get([:media_preview_proxy, :enabled], false) + def preview_enabled?, do: enabled?() and !!Config.get([:media_preview_proxy, :enabled]) def local?(url), do: String.starts_with?(url, Pleroma.Web.base_url()) @@ -138,9 +134,13 @@ defmodule Pleroma.Web.MediaProxy do if path = URI.parse(url_or_path).path, do: Path.basename(path) end + def base_url do + Config.get([:media_proxy, :base_url], Web.base_url()) + end + defp proxy_url(path, sig_base64, url_base64, filename) do [ - Config.get([:media_proxy, :base_url], Web.base_url()), + base_url(), path, sig_base64, url_base64, diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 469fbae59..89f4a23bd 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -51,7 +51,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do media_proxy_url = MediaProxy.url(url) with {:ok, %{status: status} = head_response} when status in 200..299 <- - Pleroma.HTTP.request("head", media_proxy_url, [], [], adapter: [pool: :preview]) do + Pleroma.HTTP.request("head", media_proxy_url, [], [], adapter: [pool: :media]) do content_type = Tesla.get_header(head_response, "content-type") handle_preview(content_type, conn, media_proxy_url) else @@ -154,8 +154,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do conn |> put_resp_header("content-type", content_type) |> put_resp_header("content-disposition", "inline; filename=\"#{filename}\"") - # TODO: enable caching - |> put_resp_header("cache-control", "max-age=0, private, must-revalidate") + |> put_resp_header("cache-control", ReverseProxy.default_cache_control_header()) end defp thumbnail_max_dimensions(params) do From 88a6ee4a5989036de5c1e82c6111291887597d98 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Sat, 5 Sep 2020 20:23:18 +0300 Subject: [PATCH 048/182] [#2497] Func defs grouping fix. --- .../mrf/media_proxy_warming_policy.ex | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex b/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex index 1050b74ba..6c63fe15c 100644 --- a/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex @@ -16,6 +16,14 @@ defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy do pool: :media ] + defp adapter_options do + if Application.get_env(:tesla, :adapter) == Tesla.Adapter.Hackney do + Keyword.put(@adapter_options, :recv_timeout, 10_000) + else + @adapter_options + end + end + def perform(:prefetch, url) do # Fetching only proxiable resources if MediaProxy.enabled?() and MediaProxy.url_proxiable?(url) do @@ -28,14 +36,6 @@ defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy do end end - defp adapter_options do - if Application.get_env(:tesla, :adapter) == Tesla.Adapter.Hackney do - Keyword.put(@adapter_options, :recv_timeout, 10_000) - else - @adapter_options - end - end - def perform(:preload, %{"object" => %{"attachment" => attachments}} = _message) do Enum.each(attachments, fn %{"url" => url} when is_list(url) -> From 759f8bc3ae49580319a4ecb12770e8581826c6d9 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Sun, 6 Sep 2020 15:30:11 +0300 Subject: [PATCH 049/182] [#2497] Fixed MediaProxyWarmingPolicyTest. --- test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs b/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs index 313d59a66..1710c4d2a 100644 --- a/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs +++ b/test/web/activity_pub/mrf/mediaproxy_warming_policy_test.exs @@ -22,6 +22,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicyTest do } } + setup do: clear_config([:media_proxy, :enabled], true) + test "it prefetches media proxy URIs" do with_mock HTTP, get: fn _, _, _ -> {:ok, []} end do MediaProxyWarmingPolicy.filter(@message) From 5ae56aafb2edc737f7e9fb36e00377815f028ce6 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Sun, 6 Sep 2020 21:42:51 +0300 Subject: [PATCH 050/182] added import mutes --- docs/API/pleroma_api.md | 17 ++ lib/pleroma/user.ex | 51 ----- lib/pleroma/user/import.ex | 91 ++++++++ .../controllers/user_import_controller.ex | 57 +++++ lib/pleroma/web/router.ex | 7 +- .../controllers/util_controller.ex | 35 --- lib/pleroma/workers/background_worker.ex | 11 +- test/user/import_test.exs | 78 +++++++ test/user_test.exs | 34 --- .../user_import_controller_test.exs | 205 ++++++++++++++++++ test/web/twitter_api/util_controller_test.exs | 164 -------------- 11 files changed, 461 insertions(+), 289 deletions(-) create mode 100644 lib/pleroma/user/import.ex create mode 100644 lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex create mode 100644 test/user/import_test.exs create mode 100644 test/web/pleroma_api/controllers/user_import_controller_test.exs diff --git a/docs/API/pleroma_api.md b/docs/API/pleroma_api.md index 4e97d26c0..22f3ad7d6 100644 --- a/docs/API/pleroma_api.md +++ b/docs/API/pleroma_api.md @@ -44,6 +44,23 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi * Response: HTTP 200 on success, 500 on error * Note: Users that can't be followed are silently skipped. +## `/api/pleroma/blocks_import` +### Imports your blocks. +* Method: `POST` +* Authentication: required +* Params: + * `list`: STRING or FILE containing a whitespace-separated list of accounts to follow +* Response: HTTP 200 on success, 500 on error + +## `/api/pleroma/mutes_import` +### Imports your mutes. +* Method: `POST` +* Authentication: required +* Params: + * `list`: STRING or FILE containing a whitespace-separated list of accounts to follow +* Response: HTTP 200 on success, 500 on error + + ## `/api/pleroma/captcha` ### Get a new captcha * Method: `GET` diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 94c96de8d..be2ef0d1b 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1686,42 +1686,6 @@ defmodule Pleroma.User do def perform(:deactivate_async, user, status), do: deactivate(user, status) - @spec perform(atom(), User.t(), list()) :: list() | {:error, any()} - def perform(:blocks_import, %User{} = blocker, blocked_identifiers) - when is_list(blocked_identifiers) do - Enum.map( - blocked_identifiers, - fn blocked_identifier -> - with {:ok, %User{} = blocked} <- get_or_fetch(blocked_identifier), - {:ok, _block} <- CommonAPI.block(blocker, blocked) do - blocked - else - err -> - Logger.debug("blocks_import failed for #{blocked_identifier} with: #{inspect(err)}") - err - end - end - ) - end - - def perform(:follow_import, %User{} = follower, followed_identifiers) - when is_list(followed_identifiers) do - Enum.map( - followed_identifiers, - fn followed_identifier -> - with {:ok, %User{} = followed} <- get_or_fetch(followed_identifier), - {:ok, follower} <- maybe_direct_follow(follower, followed), - {:ok, _, _, _} <- CommonAPI.follow(follower, followed) do - followed - else - err -> - Logger.debug("follow_import failed for #{followed_identifier} with: #{inspect(err)}") - err - end - end - ) - end - @spec external_users_query() :: Ecto.Query.t() def external_users_query do User.Query.build(%{ @@ -1750,21 +1714,6 @@ defmodule Pleroma.User do Repo.all(query) end - def blocks_import(%User{} = blocker, blocked_identifiers) when is_list(blocked_identifiers) do - BackgroundWorker.enqueue("blocks_import", %{ - "blocker_id" => blocker.id, - "blocked_identifiers" => blocked_identifiers - }) - end - - def follow_import(%User{} = follower, followed_identifiers) - when is_list(followed_identifiers) do - BackgroundWorker.enqueue("follow_import", %{ - "follower_id" => follower.id, - "followed_identifiers" => followed_identifiers - }) - end - def delete_notifications_from_user_activities(%User{ap_id: ap_id}) do Notification |> join(:inner, [n], activity in assoc(n, :activity)) diff --git a/lib/pleroma/user/import.ex b/lib/pleroma/user/import.ex new file mode 100644 index 000000000..de27bdc4c --- /dev/null +++ b/lib/pleroma/user/import.ex @@ -0,0 +1,91 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.User.Import do + use Ecto.Schema + + alias Pleroma.User + alias Pleroma.Web.CommonAPI + alias Pleroma.Workers.BackgroundWorker + + require Logger + + @spec perform(atom(), User.t(), list()) :: :ok | list() | {:error, any()} + def perform(:mutes_import, %User{} = user, [_ | _] = identifiers) do + Enum.map( + identifiers, + fn identifier -> + with {:ok, %User{} = muted_user} <- User.get_or_fetch(identifier), + {:ok, _} <- User.mute(user, muted_user) do + muted_user + else + error -> handle_error(:mutes_import, identifier, error) + end + end + ) + end + + def perform(:blocks_import, %User{} = blocker, [_ | _] = identifiers) do + Enum.map( + identifiers, + fn identifier -> + with {:ok, %User{} = blocked} <- User.get_or_fetch(identifier), + {:ok, _block} <- CommonAPI.block(blocker, blocked) do + blocked + else + error -> handle_error(:blocks_import, identifier, error) + end + end + ) + end + + def perform(:follow_import, %User{} = follower, [_ | _] = identifiers) do + Enum.map( + identifiers, + fn identifier -> + with {:ok, %User{} = followed} <- User.get_or_fetch(identifier), + {:ok, follower} <- User.maybe_direct_follow(follower, followed), + {:ok, _, _, _} <- CommonAPI.follow(follower, followed) do + followed + else + error -> handle_error(:follow_import, identifier, error) + end + end + ) + end + + def perform(_, _, _), do: :ok + + defp handle_error(op, user_id, error) do + Logger.debug("#{op} failed for #{user_id} with: #{inspect(error)}") + error + end + + def blocks_import(%User{} = blocker, [_ | _] = identifiers) do + BackgroundWorker.enqueue( + "blocks_import", + %{ + "blocker_id" => blocker.id, + "blocked_identifiers" => identifiers + } + ) + end + + def follow_import(%User{} = follower, [_ | _] = identifiers) do + BackgroundWorker.enqueue( + "follow_import", + %{ + "follower_id" => follower.id, + "followed_identifiers" => identifiers + } + ) + end + + def mutes_import(%User{} = user, [_ | _] = identifiers) do + BackgroundWorker.enqueue( + "mutes_import", + %{"user_id" => user.id, "identifiers" => identifiers} + ) + end +end diff --git a/lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex b/lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex new file mode 100644 index 000000000..df6a0f131 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex @@ -0,0 +1,57 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.UserImportController do + use Pleroma.Web, :controller + + require Logger + + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.User + + plug(OAuthScopesPlug, %{scopes: ["follow", "write:follows"]} when action == :follow) + plug(OAuthScopesPlug, %{scopes: ["follow", "write:blocks"]} when action == :blocks) + plug(OAuthScopesPlug, %{scopes: ["follow", "write:mutes"]} when action == :mutes) + + def follow(conn, %{"list" => %Plug.Upload{path: path}}) do + follow(conn, %{"list" => File.read!(path)}) + end + + def follow(%{assigns: %{user: follower}} = conn, %{"list" => list}) do + identifiers = + list + |> String.split("\n") + |> Enum.map(&(&1 |> String.split(",") |> List.first())) + |> List.delete("Account address") + |> Enum.map(&(&1 |> String.trim() |> String.trim_leading("@"))) + |> Enum.reject(&(&1 == "")) + + User.Import.follow_import(follower, identifiers) + json(conn, "job started") + end + + def blocks(conn, %{"list" => %Plug.Upload{path: path}}) do + blocks(conn, %{"list" => File.read!(path)}) + end + + def blocks(%{assigns: %{user: blocker}} = conn, %{"list" => list}) do + User.Import.blocks_import(blocker, prepare_user_identifiers(list)) + json(conn, "job started") + end + + def mutes(conn, %{"list" => %Plug.Upload{path: path}}) do + mutes(conn, %{"list" => File.read!(path)}) + end + + def mutes(%{assigns: %{user: user}} = conn, %{"list" => list}) do + User.Import.mutes_import(user, prepare_user_identifiers(list)) + json(conn, "job started") + end + + defp prepare_user_identifiers(list) do + list + |> String.split() + |> Enum.map(&String.trim_leading(&1, "@")) + end +end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index c6433cc53..f69b1545f 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -260,14 +260,15 @@ defmodule Pleroma.Web.Router do post("/delete_account", UtilController, :delete_account) put("/notification_settings", UtilController, :update_notificaton_settings) post("/disable_account", UtilController, :disable_account) - - post("/blocks_import", UtilController, :blocks_import) - post("/follow_import", UtilController, :follow_import) end scope "/api/pleroma", Pleroma.Web.PleromaAPI do pipe_through(:authenticated_api) + post("/mutes_import", UserImportController, :mutes) + post("/blocks_import", UserImportController, :blocks) + post("/follow_import", UserImportController, :follow) + get("/accounts/mfa", TwoFactorAuthenticationController, :settings) get("/accounts/mfa/backup_codes", TwoFactorAuthenticationController, :backup_codes) get("/accounts/mfa/setup/:method", TwoFactorAuthenticationController, :setup) diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index f02c4075c..70b0fbd54 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -18,14 +18,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do plug(Pleroma.Web.FederatingPlug when action == :remote_subscribe) - plug( - OAuthScopesPlug, - %{scopes: ["follow", "write:follows"]} - when action == :follow_import - ) - - plug(OAuthScopesPlug, %{scopes: ["follow", "write:blocks"]} when action == :blocks_import) - plug( OAuthScopesPlug, %{scopes: ["write:accounts"]} @@ -104,33 +96,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do end end - def follow_import(conn, %{"list" => %Plug.Upload{} = listfile}) do - follow_import(conn, %{"list" => File.read!(listfile.path)}) - end - - def follow_import(%{assigns: %{user: follower}} = conn, %{"list" => list}) do - followed_identifiers = - list - |> String.split("\n") - |> Enum.map(&(&1 |> String.split(",") |> List.first())) - |> List.delete("Account address") - |> Enum.map(&(&1 |> String.trim() |> String.trim_leading("@"))) - |> Enum.reject(&(&1 == "")) - - User.follow_import(follower, followed_identifiers) - json(conn, "job started") - end - - def blocks_import(conn, %{"list" => %Plug.Upload{} = listfile}) do - blocks_import(conn, %{"list" => File.read!(listfile.path)}) - end - - def blocks_import(%{assigns: %{user: blocker}} = conn, %{"list" => list}) do - blocked_identifiers = list |> String.split() |> Enum.map(&String.trim_leading(&1, "@")) - User.blocks_import(blocker, blocked_identifiers) - json(conn, "job started") - end - def change_password(%{assigns: %{user: user}} = conn, params) do case CommonAPI.Utils.confirm_current_password(user, params["password"]) do {:ok, user} -> diff --git a/lib/pleroma/workers/background_worker.ex b/lib/pleroma/workers/background_worker.ex index cec5a7462..f9c767ee0 100644 --- a/lib/pleroma/workers/background_worker.ex +++ b/lib/pleroma/workers/background_worker.ex @@ -34,7 +34,7 @@ defmodule Pleroma.Workers.BackgroundWorker do } }) do blocker = User.get_cached_by_id(blocker_id) - {:ok, User.perform(:blocks_import, blocker, blocked_identifiers)} + {:ok, User.Import.perform(:blocks_import, blocker, blocked_identifiers)} end def perform(%Job{ @@ -45,7 +45,14 @@ defmodule Pleroma.Workers.BackgroundWorker do } }) do follower = User.get_cached_by_id(follower_id) - {:ok, User.perform(:follow_import, follower, followed_identifiers)} + {:ok, User.Import.perform(:follow_import, follower, followed_identifiers)} + end + + def perform(%Job{ + args: %{"op" => "mutes_import", "user_id" => user_id, "identifiers" => identifiers} + }) do + user = User.get_cached_by_id(user_id) + {:ok, User.Import.perform(:mutes_import, user, identifiers)} end def perform(%Job{args: %{"op" => "media_proxy_preload", "message" => message}}) do diff --git a/test/user/import_test.exs b/test/user/import_test.exs new file mode 100644 index 000000000..476b22678 --- /dev/null +++ b/test/user/import_test.exs @@ -0,0 +1,78 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.User.ImportTest do + + alias Pleroma.Repo + alias Pleroma.Tests.ObanHelpers + alias Pleroma.User + + use Pleroma.DataCase + use Oban.Testing, repo: Pleroma.Repo + + import Pleroma.Factory + + setup_all do + Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) + :ok + end + + describe "follow_import" do + test "it imports user followings from list" do + [user1, user2, user3] = insert_list(3, :user) + + identifiers = [ + user2.ap_id, + user3.nickname + ] + + {:ok, job} = User.Import.follow_import(user1, identifiers) + + assert {:ok, result} = ObanHelpers.perform(job) + assert is_list(result) + assert result == [user2, user3] + assert User.following?(user1, user2) + assert User.following?(user1, user3) + end + end + + + describe "blocks_import" do + test "it imports user blocks from list" do + [user1, user2, user3] = insert_list(3, :user) + + identifiers = [ + user2.ap_id, + user3.nickname + ] + + {:ok, job} = User.Import.blocks_import(user1, identifiers) + + assert {:ok, result} = ObanHelpers.perform(job) + assert is_list(result) + assert result == [user2, user3] + assert User.blocks?(user1, user2) + assert User.blocks?(user1, user3) + end + end + + describe "mutes_import" do + test "it imports user mutes from list" do + [user1, user2, user3] = insert_list(3, :user) + + identifiers = [ + user2.ap_id, + user3.nickname + ] + + {:ok, job} = User.Import.mutes_import(user1, identifiers) + + assert {:ok, result} = ObanHelpers.perform(job) + assert is_list(result) + assert result == [user2, user3] + assert User.mutes?(user1, user2) + assert User.mutes?(user1, user3) + end + end +end diff --git a/test/user_test.exs b/test/user_test.exs index 50f72549e..13ac633b8 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -932,23 +932,6 @@ defmodule Pleroma.UserTest do end end - describe "follow_import" do - test "it imports user followings from list" do - [user1, user2, user3] = insert_list(3, :user) - - identifiers = [ - user2.ap_id, - user3.nickname - ] - - {:ok, job} = User.follow_import(user1, identifiers) - - assert {:ok, result} = ObanHelpers.perform(job) - assert is_list(result) - assert result == [user2, user3] - end - end - describe "mutes" do test "it mutes people" do user = insert(:user) @@ -1155,23 +1138,6 @@ defmodule Pleroma.UserTest do end end - describe "blocks_import" do - test "it imports user blocks from list" do - [user1, user2, user3] = insert_list(3, :user) - - identifiers = [ - user2.ap_id, - user3.nickname - ] - - {:ok, job} = User.blocks_import(user1, identifiers) - - assert {:ok, result} = ObanHelpers.perform(job) - assert is_list(result) - assert result == [user2, user3] - end - end - describe "get_recipients_from_activity" do test "works for announces" do actor = insert(:user) diff --git a/test/web/pleroma_api/controllers/user_import_controller_test.exs b/test/web/pleroma_api/controllers/user_import_controller_test.exs new file mode 100644 index 000000000..d1a8a46fc --- /dev/null +++ b/test/web/pleroma_api/controllers/user_import_controller_test.exs @@ -0,0 +1,205 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.UserImportControllerTest do + use Pleroma.Web.ConnCase + use Oban.Testing, repo: Pleroma.Repo + + alias Pleroma.Config + alias Pleroma.Tests.ObanHelpers + + import Pleroma.Factory + import Mock + + setup do + Tesla.Mock.mock(fn env -> apply(HttpRequestMock, :request, [env]) end) + :ok + end + + describe "POST /api/pleroma/follow_import" do + setup do: oauth_access(["follow"]) + + test "it returns HTTP 200", %{conn: conn} do + user2 = insert(:user) + + assert "job started" == conn + |> post("/api/pleroma/follow_import", %{"list" => "#{user2.ap_id}"}) + |> json_response(:ok) + end + + test "it imports follow lists from file", %{conn: conn} do + user2 = insert(:user) + + with_mocks([ + {File, [], + read!: fn "follow_list.txt" -> + "Account address,Show boosts\n#{user2.ap_id},true" + end} + ]) do + assert "job started" == conn + |> post("/api/pleroma/follow_import", %{"list" => %Plug.Upload{path: "follow_list.txt"}}) + |> json_response(:ok) + + assert [{:ok, job_result}] = ObanHelpers.perform_all() + assert job_result == [user2] + end + end + + test "it imports new-style mastodon follow lists", %{conn: conn} do + user2 = insert(:user) + + response = conn + |> post("/api/pleroma/follow_import", %{ + "list" => "Account address,Show boosts\n#{user2.ap_id},true"} + ) + |> json_response(:ok) + + assert response == "job started" + end + + test "requires 'follow' or 'write:follows' permissions" do + token1 = insert(:oauth_token, scopes: ["read", "write"]) + token2 = insert(:oauth_token, scopes: ["follow"]) + token3 = insert(:oauth_token, scopes: ["something"]) + another_user = insert(:user) + + for token <- [token1, token2, token3] do + conn = + build_conn() + |> put_req_header("authorization", "Bearer #{token.token}") + |> post("/api/pleroma/follow_import", %{"list" => "#{another_user.ap_id}"}) + + if token == token3 do + assert %{"error" => "Insufficient permissions: follow | write:follows."} == + json_response(conn, 403) + else + assert json_response(conn, 200) + end + end + end + + test "it imports follows with different nickname variations", %{conn: conn} do + users = [user2, user3, user4, user5, user6] = insert_list(5, :user) + + identifiers = + [ + user2.ap_id, + user3.nickname, + " ", + "@" <> user4.nickname, + user5.nickname <> "@localhost", + "@" <> user6.nickname <> "@localhost" + ] + |> Enum.join("\n") + + assert "job started" == conn + |> post("/api/pleroma/follow_import", %{"list" => identifiers}) + |> json_response(:ok) + + assert [{:ok, job_result}] = ObanHelpers.perform_all() + assert job_result == users + end + end + + describe "POST /api/pleroma/blocks_import" do + # Note: "follow" or "write:blocks" permission is required + setup do: oauth_access(["write:blocks"]) + + test "it returns HTTP 200", %{conn: conn} do + user2 = insert(:user) + + assert "job started" == conn + |> post("/api/pleroma/blocks_import", %{"list" => "#{user2.ap_id}"}) + |> json_response(:ok) + end + + test "it imports blocks users from file", %{conn: conn} do + users = [user2, user3] = insert_list(2, :user) + + with_mocks([ + {File, [], read!: fn "blocks_list.txt" -> "#{user2.ap_id} #{user3.ap_id}" end} + ]) do + + assert "job started" == conn + |> post("/api/pleroma/blocks_import", %{"list" => %Plug.Upload{path: "blocks_list.txt"}}) + |> json_response(:ok) + + assert [{:ok, job_result}] = ObanHelpers.perform_all() + assert job_result == users + end + end + + test "it imports blocks with different nickname variations", %{conn: conn} do + users = [user2, user3, user4, user5, user6] = insert_list(5, :user) + + identifiers = + [ + user2.ap_id, + user3.nickname, + "@" <> user4.nickname, + user5.nickname <> "@localhost", + "@" <> user6.nickname <> "@localhost" + ] + |> Enum.join(" ") + + assert "job started" == conn + |> post("/api/pleroma/blocks_import", %{"list" => identifiers}) + |> json_response(:ok) + + assert [{:ok, job_result}] = ObanHelpers.perform_all() + assert job_result == users + end + end + + describe "POST /api/pleroma/mutes_import" do + # Note: "follow" or "write:mutes" permission is required + setup do: oauth_access(["write:mutes"]) + + test "it returns HTTP 200", %{user: user, conn: conn} do + user2 = insert(:user) + + assert "job started" == conn + |> post("/api/pleroma/mutes_import", %{"list" => "#{user2.ap_id}"}) + |> json_response(:ok) + + assert [{:ok, job_result}] = ObanHelpers.perform_all() + assert job_result == [user2] + assert Pleroma.User.mutes?(user, user2) + end + + + test "it imports mutes users from file", %{user: user, conn: conn} do + users = [user2, user3] = insert_list(2, :user) + + with_mocks([ + {File, [], read!: fn "mutes_list.txt" -> "#{user2.ap_id} #{user3.ap_id}" end} + ]) do + assert "job started" == conn + |> post("/api/pleroma/mutes_import", %{"list" => %Plug.Upload{path: "mutes_list.txt"}}) + |> json_response(:ok) + + assert [{:ok, job_result}] = ObanHelpers.perform_all() + assert job_result == users + assert Enum.all?(users, &Pleroma.User.mutes?(user, &1)) + end + end + + test "it imports mutes with different nickname variations", %{user: user, conn: conn} do + users = [user2, user3, user4, user5, user6] = insert_list(5, :user) + + identifiers = [ + user2.ap_id, user3.nickname, "@" <> user4.nickname, + user5.nickname <> "@localhost", "@" <> user6.nickname <> "@localhost" + ] + |> Enum.join(" ") + + assert "job started" == conn + |> post("/api/pleroma/mutes_import", %{"list" => identifiers}) + |> json_response(:ok) + assert [{:ok, job_result}] = ObanHelpers.perform_all() + assert job_result == users + assert Enum.all?(users, &Pleroma.User.mutes?(user, &1)) + end + end +end diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index d164127ee..60f2fb052 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -21,170 +21,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do setup do: clear_config([:instance]) setup do: clear_config([:frontend_configurations, :pleroma_fe]) - describe "POST /api/pleroma/follow_import" do - setup do: oauth_access(["follow"]) - - test "it returns HTTP 200", %{conn: conn} do - user2 = insert(:user) - - response = - conn - |> post("/api/pleroma/follow_import", %{"list" => "#{user2.ap_id}"}) - |> json_response(:ok) - - assert response == "job started" - end - - test "it imports follow lists from file", %{user: user1, conn: conn} do - user2 = insert(:user) - - with_mocks([ - {File, [], - read!: fn "follow_list.txt" -> - "Account address,Show boosts\n#{user2.ap_id},true" - end} - ]) do - response = - conn - |> post("/api/pleroma/follow_import", %{"list" => %Plug.Upload{path: "follow_list.txt"}}) - |> json_response(:ok) - - assert response == "job started" - - assert ObanHelpers.member?( - %{ - "op" => "follow_import", - "follower_id" => user1.id, - "followed_identifiers" => [user2.ap_id] - }, - all_enqueued(worker: Pleroma.Workers.BackgroundWorker) - ) - end - end - - test "it imports new-style mastodon follow lists", %{conn: conn} do - user2 = insert(:user) - - response = - conn - |> post("/api/pleroma/follow_import", %{ - "list" => "Account address,Show boosts\n#{user2.ap_id},true" - }) - |> json_response(:ok) - - assert response == "job started" - end - - test "requires 'follow' or 'write:follows' permissions" do - token1 = insert(:oauth_token, scopes: ["read", "write"]) - token2 = insert(:oauth_token, scopes: ["follow"]) - token3 = insert(:oauth_token, scopes: ["something"]) - another_user = insert(:user) - - for token <- [token1, token2, token3] do - conn = - build_conn() - |> put_req_header("authorization", "Bearer #{token.token}") - |> post("/api/pleroma/follow_import", %{"list" => "#{another_user.ap_id}"}) - - if token == token3 do - assert %{"error" => "Insufficient permissions: follow | write:follows."} == - json_response(conn, 403) - else - assert json_response(conn, 200) - end - end - end - - test "it imports follows with different nickname variations", %{conn: conn} do - [user2, user3, user4, user5, user6] = insert_list(5, :user) - - identifiers = - [ - user2.ap_id, - user3.nickname, - " ", - "@" <> user4.nickname, - user5.nickname <> "@localhost", - "@" <> user6.nickname <> "@localhost" - ] - |> Enum.join("\n") - - response = - conn - |> post("/api/pleroma/follow_import", %{"list" => identifiers}) - |> json_response(:ok) - - assert response == "job started" - assert [{:ok, job_result}] = ObanHelpers.perform_all() - assert job_result == [user2, user3, user4, user5, user6] - end - end - - describe "POST /api/pleroma/blocks_import" do - # Note: "follow" or "write:blocks" permission is required - setup do: oauth_access(["write:blocks"]) - - test "it returns HTTP 200", %{conn: conn} do - user2 = insert(:user) - - response = - conn - |> post("/api/pleroma/blocks_import", %{"list" => "#{user2.ap_id}"}) - |> json_response(:ok) - - assert response == "job started" - end - - test "it imports blocks users from file", %{user: user1, conn: conn} do - user2 = insert(:user) - user3 = insert(:user) - - with_mocks([ - {File, [], read!: fn "blocks_list.txt" -> "#{user2.ap_id} #{user3.ap_id}" end} - ]) do - response = - conn - |> post("/api/pleroma/blocks_import", %{"list" => %Plug.Upload{path: "blocks_list.txt"}}) - |> json_response(:ok) - - assert response == "job started" - - assert ObanHelpers.member?( - %{ - "op" => "blocks_import", - "blocker_id" => user1.id, - "blocked_identifiers" => [user2.ap_id, user3.ap_id] - }, - all_enqueued(worker: Pleroma.Workers.BackgroundWorker) - ) - end - end - - test "it imports blocks with different nickname variations", %{conn: conn} do - [user2, user3, user4, user5, user6] = insert_list(5, :user) - - identifiers = - [ - user2.ap_id, - user3.nickname, - "@" <> user4.nickname, - user5.nickname <> "@localhost", - "@" <> user6.nickname <> "@localhost" - ] - |> Enum.join(" ") - - response = - conn - |> post("/api/pleroma/blocks_import", %{"list" => identifiers}) - |> json_response(:ok) - - assert response == "job started" - assert [{:ok, job_result}] = ObanHelpers.perform_all() - assert job_result == [user2, user3, user4, user5, user6] - end - end - describe "PUT /api/pleroma/notification_settings" do setup do: oauth_access(["write:accounts"]) From 917d325972e3aeb367583c61aaa109d62fcba837 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Mon, 7 Sep 2020 07:17:30 +0300 Subject: [PATCH 051/182] added api spec --- docs/API/pleroma_api.md | 4 +- .../operations/user_import_operation.ex | 80 +++++++++++++ .../controllers/user_import_controller.ex | 22 ++-- test/user/import_test.exs | 2 - .../user_import_controller_test.exs | 108 +++++++++++------- 5 files changed, 164 insertions(+), 52 deletions(-) create mode 100644 lib/pleroma/web/api_spec/operations/user_import_operation.ex diff --git a/docs/API/pleroma_api.md b/docs/API/pleroma_api.md index 22f3ad7d6..567ad5732 100644 --- a/docs/API/pleroma_api.md +++ b/docs/API/pleroma_api.md @@ -49,7 +49,7 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi * Method: `POST` * Authentication: required * Params: - * `list`: STRING or FILE containing a whitespace-separated list of accounts to follow + * `list`: STRING or FILE containing a whitespace-separated list of accounts to block * Response: HTTP 200 on success, 500 on error ## `/api/pleroma/mutes_import` @@ -57,7 +57,7 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi * Method: `POST` * Authentication: required * Params: - * `list`: STRING or FILE containing a whitespace-separated list of accounts to follow + * `list`: STRING or FILE containing a whitespace-separated list of accounts to mute * Response: HTTP 200 on success, 500 on error diff --git a/lib/pleroma/web/api_spec/operations/user_import_operation.ex b/lib/pleroma/web/api_spec/operations/user_import_operation.ex new file mode 100644 index 000000000..a50314fb7 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/user_import_operation.ex @@ -0,0 +1,80 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.UserImportOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ApiError + + import Pleroma.Web.ApiSpec.Helpers + + @spec open_api_operation(atom) :: Operation.t() + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def follow_operation do + %Operation{ + tags: ["follow_import"], + summary: "Imports your follows.", + operationId: "UserImportController.follow", + requestBody: request_body("Parameters", import_request(), required: true), + responses: %{ + 200 => ok_response(), + 500 => Operation.response("Error", "application/json", ApiError) + }, + security: [%{"oAuth" => ["write:follow"]}] + } + end + + def blocks_operation do + %Operation{ + tags: ["blocks_import"], + summary: "Imports your blocks.", + operationId: "UserImportController.blocks", + requestBody: request_body("Parameters", import_request(), required: true), + responses: %{ + 200 => ok_response(), + 500 => Operation.response("Error", "application/json", ApiError) + }, + security: [%{"oAuth" => ["write:blocks"]}] + } + end + + def mutes_operation do + %Operation{ + tags: ["mutes_import"], + summary: "Imports your mutes.", + operationId: "UserImportController.mutes", + requestBody: request_body("Parameters", import_request(), required: true), + responses: %{ + 200 => ok_response(), + 500 => Operation.response("Error", "application/json", ApiError) + }, + security: [%{"oAuth" => ["write:mutes"]}] + } + end + + defp import_request do + %Schema{ + type: :object, + required: [:list], + properties: %{ + list: %Schema{ + description: + "STRING or FILE containing a whitespace-separated list of accounts to import.", + anyOf: [ + %Schema{type: :string, format: :binary}, + %Schema{type: :string} + ] + } + } + } + end + + defp ok_response do + Operation.response("Ok", "application/json", %Schema{type: :string, example: "ok"}) + end +end diff --git a/lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex b/lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex index df6a0f131..f10c45750 100644 --- a/lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex @@ -9,16 +9,20 @@ defmodule Pleroma.Web.PleromaAPI.UserImportController do alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.User + alias Pleroma.Web.ApiSpec plug(OAuthScopesPlug, %{scopes: ["follow", "write:follows"]} when action == :follow) plug(OAuthScopesPlug, %{scopes: ["follow", "write:blocks"]} when action == :blocks) plug(OAuthScopesPlug, %{scopes: ["follow", "write:mutes"]} when action == :mutes) - def follow(conn, %{"list" => %Plug.Upload{path: path}}) do - follow(conn, %{"list" => File.read!(path)}) + plug(OpenApiSpex.Plug.CastAndValidate) + defdelegate open_api_operation(action), to: ApiSpec.UserImportOperation + + def follow(%{body_params: %{list: %Plug.Upload{path: path}}} = conn, _) do + follow(%Plug.Conn{conn | body_params: %{list: File.read!(path)}}, %{}) end - def follow(%{assigns: %{user: follower}} = conn, %{"list" => list}) do + def follow(%{assigns: %{user: follower}, body_params: %{list: list}} = conn, _) do identifiers = list |> String.split("\n") @@ -31,20 +35,20 @@ defmodule Pleroma.Web.PleromaAPI.UserImportController do json(conn, "job started") end - def blocks(conn, %{"list" => %Plug.Upload{path: path}}) do - blocks(conn, %{"list" => File.read!(path)}) + def blocks(%{body_params: %{list: %Plug.Upload{path: path}}} = conn, _) do + blocks(%Plug.Conn{conn | body_params: %{list: File.read!(path)}}, %{}) end - def blocks(%{assigns: %{user: blocker}} = conn, %{"list" => list}) do + def blocks(%{assigns: %{user: blocker}, body_params: %{list: list}} = conn, _) do User.Import.blocks_import(blocker, prepare_user_identifiers(list)) json(conn, "job started") end - def mutes(conn, %{"list" => %Plug.Upload{path: path}}) do - mutes(conn, %{"list" => File.read!(path)}) + def mutes(%{body_params: %{list: %Plug.Upload{path: path}}} = conn, _) do + mutes(%Plug.Conn{conn | body_params: %{list: File.read!(path)}}, %{}) end - def mutes(%{assigns: %{user: user}} = conn, %{"list" => list}) do + def mutes(%{assigns: %{user: user}, body_params: %{list: list}} = conn, _) do User.Import.mutes_import(user, prepare_user_identifiers(list)) json(conn, "job started") end diff --git a/test/user/import_test.exs b/test/user/import_test.exs index 476b22678..e404deeb5 100644 --- a/test/user/import_test.exs +++ b/test/user/import_test.exs @@ -3,7 +3,6 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.User.ImportTest do - alias Pleroma.Repo alias Pleroma.Tests.ObanHelpers alias Pleroma.User @@ -37,7 +36,6 @@ defmodule Pleroma.User.ImportTest do end end - describe "blocks_import" do test "it imports user blocks from list" do [user1, user2, user3] = insert_list(3, :user) diff --git a/test/web/pleroma_api/controllers/user_import_controller_test.exs b/test/web/pleroma_api/controllers/user_import_controller_test.exs index d1a8a46fc..433c97e81 100644 --- a/test/web/pleroma_api/controllers/user_import_controller_test.exs +++ b/test/web/pleroma_api/controllers/user_import_controller_test.exs @@ -23,9 +23,11 @@ defmodule Pleroma.Web.PleromaAPI.UserImportControllerTest do test "it returns HTTP 200", %{conn: conn} do user2 = insert(:user) - assert "job started" == conn - |> post("/api/pleroma/follow_import", %{"list" => "#{user2.ap_id}"}) - |> json_response(:ok) + assert "job started" == + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/follow_import", %{"list" => "#{user2.ap_id}"}) + |> json_response_and_validate_schema(200) end test "it imports follow lists from file", %{conn: conn} do @@ -37,9 +39,13 @@ defmodule Pleroma.Web.PleromaAPI.UserImportControllerTest do "Account address,Show boosts\n#{user2.ap_id},true" end} ]) do - assert "job started" == conn - |> post("/api/pleroma/follow_import", %{"list" => %Plug.Upload{path: "follow_list.txt"}}) - |> json_response(:ok) + assert "job started" == + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/follow_import", %{ + "list" => %Plug.Upload{path: "follow_list.txt"} + }) + |> json_response_and_validate_schema(200) assert [{:ok, job_result}] = ObanHelpers.perform_all() assert job_result == [user2] @@ -49,11 +55,13 @@ defmodule Pleroma.Web.PleromaAPI.UserImportControllerTest do test "it imports new-style mastodon follow lists", %{conn: conn} do user2 = insert(:user) - response = conn - |> post("/api/pleroma/follow_import", %{ - "list" => "Account address,Show boosts\n#{user2.ap_id},true"} - ) - |> json_response(:ok) + response = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/follow_import", %{ + "list" => "Account address,Show boosts\n#{user2.ap_id},true" + }) + |> json_response_and_validate_schema(200) assert response == "job started" end @@ -68,6 +76,7 @@ defmodule Pleroma.Web.PleromaAPI.UserImportControllerTest do conn = build_conn() |> put_req_header("authorization", "Bearer #{token.token}") + |> put_req_header("content-type", "application/json") |> post("/api/pleroma/follow_import", %{"list" => "#{another_user.ap_id}"}) if token == token3 do @@ -93,9 +102,11 @@ defmodule Pleroma.Web.PleromaAPI.UserImportControllerTest do ] |> Enum.join("\n") - assert "job started" == conn - |> post("/api/pleroma/follow_import", %{"list" => identifiers}) - |> json_response(:ok) + assert "job started" == + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/follow_import", %{"list" => identifiers}) + |> json_response_and_validate_schema(200) assert [{:ok, job_result}] = ObanHelpers.perform_all() assert job_result == users @@ -109,9 +120,11 @@ defmodule Pleroma.Web.PleromaAPI.UserImportControllerTest do test "it returns HTTP 200", %{conn: conn} do user2 = insert(:user) - assert "job started" == conn - |> post("/api/pleroma/blocks_import", %{"list" => "#{user2.ap_id}"}) - |> json_response(:ok) + assert "job started" == + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/blocks_import", %{"list" => "#{user2.ap_id}"}) + |> json_response_and_validate_schema(200) end test "it imports blocks users from file", %{conn: conn} do @@ -120,10 +133,13 @@ defmodule Pleroma.Web.PleromaAPI.UserImportControllerTest do with_mocks([ {File, [], read!: fn "blocks_list.txt" -> "#{user2.ap_id} #{user3.ap_id}" end} ]) do - - assert "job started" == conn - |> post("/api/pleroma/blocks_import", %{"list" => %Plug.Upload{path: "blocks_list.txt"}}) - |> json_response(:ok) + assert "job started" == + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/blocks_import", %{ + "list" => %Plug.Upload{path: "blocks_list.txt"} + }) + |> json_response_and_validate_schema(200) assert [{:ok, job_result}] = ObanHelpers.perform_all() assert job_result == users @@ -143,9 +159,11 @@ defmodule Pleroma.Web.PleromaAPI.UserImportControllerTest do ] |> Enum.join(" ") - assert "job started" == conn - |> post("/api/pleroma/blocks_import", %{"list" => identifiers}) - |> json_response(:ok) + assert "job started" == + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/blocks_import", %{"list" => identifiers}) + |> json_response_and_validate_schema(200) assert [{:ok, job_result}] = ObanHelpers.perform_all() assert job_result == users @@ -159,25 +177,30 @@ defmodule Pleroma.Web.PleromaAPI.UserImportControllerTest do test "it returns HTTP 200", %{user: user, conn: conn} do user2 = insert(:user) - assert "job started" == conn - |> post("/api/pleroma/mutes_import", %{"list" => "#{user2.ap_id}"}) - |> json_response(:ok) + assert "job started" == + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/mutes_import", %{"list" => "#{user2.ap_id}"}) + |> json_response_and_validate_schema(200) assert [{:ok, job_result}] = ObanHelpers.perform_all() assert job_result == [user2] assert Pleroma.User.mutes?(user, user2) end - test "it imports mutes users from file", %{user: user, conn: conn} do users = [user2, user3] = insert_list(2, :user) with_mocks([ {File, [], read!: fn "mutes_list.txt" -> "#{user2.ap_id} #{user3.ap_id}" end} ]) do - assert "job started" == conn - |> post("/api/pleroma/mutes_import", %{"list" => %Plug.Upload{path: "mutes_list.txt"}}) - |> json_response(:ok) + assert "job started" == + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/mutes_import", %{ + "list" => %Plug.Upload{path: "mutes_list.txt"} + }) + |> json_response_and_validate_schema(200) assert [{:ok, job_result}] = ObanHelpers.perform_all() assert job_result == users @@ -188,15 +211,22 @@ defmodule Pleroma.Web.PleromaAPI.UserImportControllerTest do test "it imports mutes with different nickname variations", %{user: user, conn: conn} do users = [user2, user3, user4, user5, user6] = insert_list(5, :user) - identifiers = [ - user2.ap_id, user3.nickname, "@" <> user4.nickname, - user5.nickname <> "@localhost", "@" <> user6.nickname <> "@localhost" - ] - |> Enum.join(" ") + identifiers = + [ + user2.ap_id, + user3.nickname, + "@" <> user4.nickname, + user5.nickname <> "@localhost", + "@" <> user6.nickname <> "@localhost" + ] + |> Enum.join(" ") + + assert "job started" == + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/mutes_import", %{"list" => identifiers}) + |> json_response_and_validate_schema(200) - assert "job started" == conn - |> post("/api/pleroma/mutes_import", %{"list" => identifiers}) - |> json_response(:ok) assert [{:ok, job_result}] = ObanHelpers.perform_all() assert job_result == users assert Enum.all?(users, &Pleroma.User.mutes?(user, &1)) From ee0e05f9301e149c769f36bfd0fc8527ec7b6326 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 8 Sep 2020 10:43:57 +0200 Subject: [PATCH 052/182] Drop unused "inReplyToAtomUri" in objects --- lib/pleroma/web/activity_pub/transmogrifier.ex | 4 +--- test/web/activity_pub/transmogrifier_test.exs | 14 ++++---------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 0831efadc..af4384213 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -168,7 +168,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do def fix_in_reply_to(%{"inReplyTo" => in_reply_to} = object, options) when not is_nil(in_reply_to) do in_reply_to_id = prepare_in_reply_to(in_reply_to) - object = Map.put(object, "inReplyToAtomUri", in_reply_to_id) depth = (options[:depth] || 0) + 1 if Federator.allowed_thread_distance?(depth) do @@ -176,9 +175,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do %Activity{} <- Activity.get_create_by_object_ap_id(replied_object.data["id"]) do object |> Map.put("inReplyTo", replied_object.data["id"]) - |> Map.put("inReplyToAtomUri", object["inReplyToAtomUri"] || in_reply_to_id) |> Map.put("context", replied_object.data["context"] || object["conversation"]) - |> Map.drop(["conversation"]) + |> Map.drop(["conversation", "inReplyToAtomUri"]) else e -> Logger.warn("Couldn't fetch #{inspect(in_reply_to_id)}, error: #{inspect(e)}") diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 3fa41b0c7..6e096e9ec 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -116,7 +116,8 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" ) - assert returned_object.data["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873" + assert returned_object.data["inReplyTo"] == + "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" end test "it does not fetch reply-to activities beyond max replies depth limit" do @@ -140,8 +141,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" ) - assert returned_object.data["inReplyToAtomUri"] == - "https://shitposter.club/notice/2827873" + assert returned_object.data["inReplyTo"] == "https://shitposter.club/notice/2827873" end end @@ -1072,7 +1072,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do assert Transmogrifier.fix_in_reply_to(data) == data end - test "returns object with inReplyToAtomUri when denied incoming reply", %{data: data} do + test "returns object with inReplyTo when denied incoming reply", %{data: data} do Pleroma.Config.put([:instance, :federation_incoming_replies_max_depth], 0) object_with_reply = @@ -1080,26 +1080,22 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do modified_object = Transmogrifier.fix_in_reply_to(object_with_reply) assert modified_object["inReplyTo"] == "https://shitposter.club/notice/2827873" - assert modified_object["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873" object_with_reply = Map.put(data["object"], "inReplyTo", %{"id" => "https://shitposter.club/notice/2827873"}) modified_object = Transmogrifier.fix_in_reply_to(object_with_reply) assert modified_object["inReplyTo"] == %{"id" => "https://shitposter.club/notice/2827873"} - assert modified_object["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873" object_with_reply = Map.put(data["object"], "inReplyTo", ["https://shitposter.club/notice/2827873"]) modified_object = Transmogrifier.fix_in_reply_to(object_with_reply) assert modified_object["inReplyTo"] == ["https://shitposter.club/notice/2827873"] - assert modified_object["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873" object_with_reply = Map.put(data["object"], "inReplyTo", []) modified_object = Transmogrifier.fix_in_reply_to(object_with_reply) assert modified_object["inReplyTo"] == [] - assert modified_object["inReplyToAtomUri"] == "" end @tag capture_log: true @@ -1117,8 +1113,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do assert modified_object["inReplyTo"] == "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" - assert modified_object["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873" - assert modified_object["context"] == "tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26" end From 921f926e96fd07131d4b79f5a29caed17ae2cc56 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 8 Sep 2020 09:13:11 +0200 Subject: [PATCH 053/182] Remove OStatus in testsuite --- lib/pleroma/object/containment.ex | 7 - test/fixtures/23211.atom | 508 ------------- test/fixtures/cw_retweet.xml | 68 -- test/fixtures/delete.xml | 39 - test/fixtures/dm.xml | 27 - test/fixtures/favorite.xml | 65 -- test/fixtures/favorite_with_local_note.xml | 64 -- test/fixtures/follow.xml | 68 -- test/fixtures/incoming_note_activity.xml | 42 - .../incoming_note_activity_answer.xml | 42 - test/fixtures/incoming_reply_mastodon.xml | 29 - .../incoming_websub_gnusocial_attachments.xml | 59 -- test/fixtures/lambadalambda.atom | 479 ------------ test/fixtures/mastodon-note-cw.xml | 39 - test/fixtures/mastodon-note-unlisted.xml | 38 - test/fixtures/mastodon-problematic.xml | 72 -- test/fixtures/mastodon_conversation.xml | 30 - test/fixtures/nil_mention_entry.xml | 52 -- test/fixtures/ostatus_incoming_post.xml | 57 -- test/fixtures/ostatus_incoming_post_tag.xml | 59 -- test/fixtures/ostatus_incoming_reply.xml | 60 -- test/fixtures/share-gs-local.xml | 99 --- test/fixtures/share-gs.xml | 99 --- test/fixtures/share.xml | 54 -- test/fixtures/tesla_mock/7369654.atom | 44 -- test/fixtures/tesla_mock/atarifrosch_feed.xml | 473 ------------ test/fixtures/tesla_mock/emelie.atom | 306 -------- ....php_api_statuses_user_timeline_1.atom.xml | 460 ----------- .../https___mamot.fr_users_Skruyb.atom | 342 --------- ...__mastodon.social_users_lambadalambda.atom | 464 ----------- .../https___pawoo.net_users_pekorino.atom | 231 ------ ...leroma.soykaf.com_users_lain_feed.atom.xml | 1 - ...er.club_api_statuses_show_2827873.atom.xml | 54 -- ...club_api_statuses_user_timeline_1.atom.xml | 454 ----------- ...ttps___shitposter.club_notice_2827873.json | 1 - ..._api_statuses_user_timeline_23211.atom.xml | 591 -------------- ..._api_statuses_user_timeline_29191.atom.xml | 719 ------------------ test/fixtures/tesla_mock/sakamoto.atom | 1 - .../tesla_mock/sakamoto_eal_feed.atom | 1 - .../tesla_mock/shp@pleroma.soykaf.com.feed | 1 - test/fixtures/tesla_mock/spc_5381.atom | 438 ----------- test/fixtures/unfollow.xml | 68 -- test/support/http_request_mock.ex | 174 ----- test/web/activity_pub/transmogrifier_test.exs | 16 +- .../controllers/search_controller_test.exs | 12 +- 45 files changed, 15 insertions(+), 6992 deletions(-) delete mode 100644 test/fixtures/23211.atom delete mode 100644 test/fixtures/cw_retweet.xml delete mode 100644 test/fixtures/delete.xml delete mode 100644 test/fixtures/dm.xml delete mode 100644 test/fixtures/favorite.xml delete mode 100644 test/fixtures/favorite_with_local_note.xml delete mode 100644 test/fixtures/follow.xml delete mode 100644 test/fixtures/incoming_note_activity.xml delete mode 100644 test/fixtures/incoming_note_activity_answer.xml delete mode 100644 test/fixtures/incoming_reply_mastodon.xml delete mode 100644 test/fixtures/incoming_websub_gnusocial_attachments.xml delete mode 100644 test/fixtures/lambadalambda.atom delete mode 100644 test/fixtures/mastodon-note-cw.xml delete mode 100644 test/fixtures/mastodon-note-unlisted.xml delete mode 100644 test/fixtures/mastodon-problematic.xml delete mode 100644 test/fixtures/mastodon_conversation.xml delete mode 100644 test/fixtures/nil_mention_entry.xml delete mode 100644 test/fixtures/ostatus_incoming_post.xml delete mode 100644 test/fixtures/ostatus_incoming_post_tag.xml delete mode 100644 test/fixtures/ostatus_incoming_reply.xml delete mode 100644 test/fixtures/share-gs-local.xml delete mode 100644 test/fixtures/share-gs.xml delete mode 100644 test/fixtures/share.xml delete mode 100644 test/fixtures/tesla_mock/7369654.atom delete mode 100644 test/fixtures/tesla_mock/atarifrosch_feed.xml delete mode 100644 test/fixtures/tesla_mock/emelie.atom delete mode 100644 test/fixtures/tesla_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml delete mode 100644 test/fixtures/tesla_mock/https___mamot.fr_users_Skruyb.atom delete mode 100644 test/fixtures/tesla_mock/https___mastodon.social_users_lambadalambda.atom delete mode 100644 test/fixtures/tesla_mock/https___pawoo.net_users_pekorino.atom delete mode 100644 test/fixtures/tesla_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml delete mode 100644 test/fixtures/tesla_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml delete mode 100644 test/fixtures/tesla_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml delete mode 100644 test/fixtures/tesla_mock/https___shitposter.club_notice_2827873.json delete mode 100644 test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml delete mode 100644 test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml delete mode 100644 test/fixtures/tesla_mock/sakamoto.atom delete mode 100644 test/fixtures/tesla_mock/sakamoto_eal_feed.atom delete mode 100644 test/fixtures/tesla_mock/shp@pleroma.soykaf.com.feed delete mode 100644 test/fixtures/tesla_mock/spc_5381.atom delete mode 100644 test/fixtures/unfollow.xml diff --git a/lib/pleroma/object/containment.ex b/lib/pleroma/object/containment.ex index bc88e8a0c..29cb3d672 100644 --- a/lib/pleroma/object/containment.ex +++ b/lib/pleroma/object/containment.ex @@ -44,13 +44,6 @@ defmodule Pleroma.Object.Containment do nil end - # TODO: We explicitly allow 'tag' URIs through, due to references to legacy OStatus - # objects being present in the test suite environment. Once these objects are - # removed, please also remove this. - if Mix.env() == :test do - defp compare_uris(_, %URI{scheme: "tag"}), do: :ok - end - defp compare_uris(%URI{host: host} = _id_uri, %URI{host: host} = _other_uri), do: :ok defp compare_uris(_id_uri, _other_uri), do: :error diff --git a/test/fixtures/23211.atom b/test/fixtures/23211.atom deleted file mode 100644 index d5d111baa..000000000 --- a/test/fixtures/23211.atom +++ /dev/null @@ -1,508 +0,0 @@ - - - GNU social - https://social.heldscal.la/api/statuses/user_timeline/23211.atom - lambadalambda timeline - Updates from lambadalambda on social.heldscal.la! - https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg - 2017-05-02T14:59:30+00:00 - - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - Call me Deacon Blues. - - - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - - Berlin - - - homepage - https://heldscal.la - true - - - - - - - - - - - - - - tag:social.heldscal.la,2017-05-02:fave:23211:comment:2015260:2017-05-02T14:45:47+00:00 - Favorite - lambadalambda favorited something by godemperorofdune: <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> It's because your instance decided to be trap! lol.</p> - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-02T14:45:47+00:00 - 2017-05-02T14:45:47+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:pawoo.net,2017-05-02:objectId=7397439:objectType=Status - New comment by godemperorofdune - <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> It's because your instance decided to be trap! lol.</p> - - - - - - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=136e244b26cdf1e9 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.heldscal.la,2017-05-02:noticeId=2015221:objectType=note - New note by lambadalambda - Some script thinks I'm a mastodon server.<br /> <br /> [info] GET /api/v1/timelines/public<br /> [debug] Processing with Fallback.RedirectController.redirector/2<br /> Parameters: %{&quot;limit&quot; =&gt; &quot;40&quot;, &quot;path&quot; =&gt; [&quot;api&quot;, &quot;v1&quot;, &quot;timelines&quot;, &quot;public&quot;]}<br /> Pipelines: [] - - - http://activitystrea.ms/schema/1.0/post - 2017-05-02T14:40:50+00:00 - 2017-05-02T14:40:50+00:00 - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=136e244b26cdf1e9 - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:social.heldscal.la,2017-05-02:noticeId=2014759:objectType=comment - New comment by lambadalambda - @<a href="https://mstdn.io/users/mattskala" class="h-card u-url p-nickname mention" title="Matthew Skala">mattskala</a> You and @<a href="https://mastodon.social/users/kevinmarks" class="h-card u-url p-nickname mention" title="Kevin Marks">kevinmarks</a> are not wrong, but my comment was a suggestion to users and admins: Don't use big instances, don't run big instances. Also, it's a secondary advice to devs: Don't add features that encourage big instances. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-02T14:11:54+00:00 - 2017-05-02T14:11:54+00:00 - - - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d - - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:social.heldscal.la,2017-05-02:noticeId=2014684:objectType=comment - New comment by lambadalambda - @<a href="https://mastodon.social/users/Ronkjeffries" class="h-card u-url p-nickname mention" title="Ron K Jeffries social">ronkjeffries</a> @<a href="https://xoxo.zone/users/KevinMarks" class="h-card u-url p-nickname mention" title="Kevin Marks ">kevinmarks</a> Usually people who run their own private instance just look at the timelines of other servers, follow a seed population and then go from there. This is of course hard on Mastodon, because it doesn't have a publicly visible timeline. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-02T14:07:00+00:00 - 2017-05-02T14:07:00+00:00 - - - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d - - - - - - - - - tag:social.heldscal.la,2017-05-02:fave:23211:comment:2014584:2017-05-02T14:05:32+00:00 - Favorite - lambadalambda favorited something by mattskala: <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> It's reasonable to expect that instance sizes will obey a power-law distribution because that's what such things in nature nearly always do. If so, there'll necessarily be a few instances much larger than the others; even if most are small, the network both socially and technically has to be able to deal with the existence of the few large ones.</p> - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-02T14:05:32+00:00 - 2017-05-02T14:05:32+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:mstdn.io,2017-05-02:objectId=1316931:objectType=Status - New comment by mattskala - <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> It's reasonable to expect that instance sizes will obey a power-law distribution because that's what such things in nature nearly always do. If so, there'll necessarily be a few instances much larger than the others; even if most are small, the network both socially and technically has to be able to deal with the existence of the few large ones.</p> - - - - - - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d - - - - - - - tag:social.heldscal.la,2017-05-02:fave:23211:comment:2013568:2017-05-02T14:05:29+00:00 - Favorite - lambadalambda favorited something by kevinmarks: <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> except instance populations will be power law distributed, and the problems for the tummlers are worse at scale</p> - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-02T14:05:29+00:00 - 2017-05-02T14:05:29+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:xoxo.zone,2017-05-02:objectId=89478:objectType=Status - New comment by kevinmarks - <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> except instance populations will be power law distributed, and the problems for the tummlers are worse at scale</p> - - - - - - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d - - - - - - - tag:social.heldscal.la,2017-05-02:fave:23211:comment:2014060:2017-05-02T13:34:32+00:00 - Favorite - lambadalambda favorited something by gcarregues: <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> Oh purée ! Ma vie en images !</p> - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-02T13:34:32+00:00 - 2017-05-02T13:34:32+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:mastodon.etalab.gouv.fr,2017-05-02:objectId=55287:objectType=Status - New comment by gcarregues - <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> Oh purée ! Ma vie en images !</p> - - - - - - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc - - - - - - - tag:social.heldscal.la,2017-05-02:fave:23211:note:2013573:2017-05-02T13:03:33+00:00 - Favorite - lambadalambda favorited something by phildobangnz: also @<a href="https://sealion.club/user/579" class="h-card mention" title="Sim Bot">sim</a> reminder you are awesome; don't even trip- u kewler than Tutankhamen's cucumber, fam. Okay, good night. - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-02T13:03:33+00:00 - 2017-05-02T13:03:33+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:sealion.club,2017-05-02:noticeId=3060818:objectType=note - New note by phildobangnz - also @<a href="https://sealion.club/user/579" class="h-card mention" title="Sim Bot">sim</a> reminder you are awesome; don't even trip- u kewler than Tutankhamen's cucumber, fam. Okay, good night. - - - - - - - https://sealion.club/conversation/1633267 - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:social.heldscal.la,2017-05-02:noticeId=2013586:objectType=comment - New comment by lambadalambda - @<a href="https://xoxo.zone/users/KevinMarks" class="h-card u-url p-nickname mention" title="Kevin Marks ">kevinmarks</a> People can stay in their giant unmoderatable instances with meaningless public and federated timelines and experience constant federation drama if they want. I'll stay here with my 5 friends. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-02T12:54:59+00:00 - 2017-05-02T12:54:59+00:00 - - - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=58e32e013ab6487d - - - - - - - - tag:social.heldscal.la,2017-05-02:fave:23211:note:2013486:2017-05-02T12:46:48+00:00 - Favorite - lambadalambda favorited something by fortune: There once was a dentist named Stone<br /> Who saw all his patients alone.<br /> In a fit of depravity<br /> He filled the wrong cavity,<br /> And my, how his practice has grown! - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-02T12:46:48+00:00 - 2017-05-02T12:46:48+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:gs.kawa-kun.com,2017-05-02:noticeId=1655658:objectType=note - New note by fortune - There once was a dentist named Stone<br /> Who saw all his patients alone.<br /> In a fit of depravity<br /> He filled the wrong cavity,<br /> And my, how his practice has grown! - - - - - - - https://gs.kawa-kun.com/conversation/714072 - - - - - - - tag:social.heldscal.la,2017-05-02:fave:23211:note:2013365:2017-05-02T12:37:55+00:00 - Favorite - lambadalambda favorited something by xj9: <p>&gt; rollerblading to work</p> - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-02T12:37:55+00:00 - 2017-05-02T12:37:55+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:sunshinegardens.org,2017-05-02:objectId=61020:objectType=Status - New note by xj9 - <p>&gt; rollerblading to work</p> - - - - - - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=5a0e98612f634218 - - - - - - - tag:social.heldscal.la,2017-05-02:fave:23211:comment:2013259:2017-05-02T12:29:03+00:00 - Favorite - lambadalambda favorited something by cereal: @<a href="https://gs.smuglo.li/user/28250" class="h-card mention" title="Bricky">thatbrickster</a> @<a href="https://social.heldscal.la/user/23211" class="h-card mention" title="Constance Variable">lambadalambda</a> But why? - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-02T12:29:03+00:00 - 2017-05-02T12:29:03+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:sealion.club,2017-05-02:noticeId=3059985:objectType=comment - New comment by cereal - @<a href="https://gs.smuglo.li/user/28250" class="h-card mention" title="Bricky">thatbrickster</a> @<a href="https://social.heldscal.la/user/23211" class="h-card mention" title="Constance Variable">lambadalambda</a> But why? - - - - - - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc - - - - - - - tag:social.heldscal.la,2017-05-02:fave:23211:comment:2013227:2017-05-02T12:24:27+00:00 - Favorite - lambadalambda favorited something by thatbrickster: @<a href="https://social.heldscal.la/user/23211" class="h-card u-url p-nickname mention" title="Constance Variable">lambadalambda</a> install gentoo - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-02T12:24:27+00:00 - 2017-05-02T12:24:27+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:gs.smuglo.li,2017-05-02:noticeId=2144296:objectType=comment - New comment by thatbrickster - @<a href="https://social.heldscal.la/user/23211" class="h-card u-url p-nickname mention" title="Constance Variable">lambadalambda</a> install gentoo - - - - - - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc - - - - - - - tag:social.heldscal.la,2017-05-02:fave:23211:comment:2013213:2017-05-02T12:22:53+00:00 - Favorite - lambadalambda favorited something by dwmatiz: @<a href="https://social.heldscal.la/user/23211" class="h-card mention">lambadalambda</a> *unzips dick* - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-02T12:22:53+00:00 - 2017-05-02T12:22:53+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:sealion.club,2017-05-02:noticeId=3059800:objectType=comment - New comment by dwmatiz - @<a href="https://social.heldscal.la/user/23211" class="h-card mention">lambadalambda</a> *unzips dick* - - - - - - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc - - - - - - - tag:social.heldscal.la,2017-05-02:fave:23211:comment:2013199:2017-05-02T12:22:03+00:00 - Favorite - lambadalambda favorited something by shpuld: @<a href="https://social.heldscal.la/user/23211" class="h-card mention" title="Constance Variable">lambadalambda</a> get #<span class="tag"><a href="https://shitposter.club/tag/cofe" rel="tag">cofe</a></span> - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-02T12:22:03+00:00 - 2017-05-02T12:22:03+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-02:noticeId=2783524:objectType=comment - New comment by shpuld - @<a href="https://social.heldscal.la/user/23211" class="h-card mention" title="Constance Variable">lambadalambda</a> get #<span class="tag"><a href="https://shitposter.club/tag/cofe" rel="tag">cofe</a></span> - - - - - - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.heldscal.la,2017-05-02:noticeId=2013185:objectType=note - New note by lambadalambda - What now? <a href="https://social.heldscal.la/file/e4822d95de677757ff50d49672a4046c83218b76c04a0ad5e5f1f0a9a9eb1a74.gif" title="https://social.heldscal.la/file/e4822d95de677757ff50d49672a4046c83218b76c04a0ad5e5f1f0a9a9eb1a74.gif" rel="nofollow external noreferrer" class="attachment" id="attachment-422572">https://social.heldscal.la/attachment/422572</a> - - - http://activitystrea.ms/schema/1.0/post - 2017-05-02T12:21:04+00:00 - 2017-05-02T12:21:04+00:00 - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2c27c27df8ec4dcc - - - - - - - - tag:social.heldscal.la,2017-05-02:fave:23211:note:2012929:2017-05-02T12:01:25+00:00 - Favorite - lambadalambda favorited something by drkmttr: <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> I checked out No Agenda because I saw you mention it several time. Sadly, I wasn't impressed. I'm all about varying perspectives but Adam and John basically just sound like resentful curmudgeons. It seems like their shtick is basically playing devil's advocate to everything to arouse some discontent. Just my two cents. 😉</p> - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-02T12:01:25+00:00 - 2017-05-02T12:01:25+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:mstdn.io,2017-05-02:objectId=1310093:objectType=Status - New note by drkmttr - <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> I checked out No Agenda because I saw you mention it several time. Sadly, I wasn't impressed. I'm all about varying perspectives but Adam and John basically just sound like resentful curmudgeons. It seems like their shtick is basically playing devil's advocate to everything to arouse some discontent. Just my two cents. 😉</p> - - - - - - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=2f329b4eb20e83e2 - - - - - - - tag:social.heldscal.la,2017-05-02:fave:23211:comment:2012336:2017-05-02T11:06:42+00:00 - Favorite - lambadalambda favorited something by clacke: @<a href="https://mastodon.org.uk/users/dick_turpin" class="h-card u-url p-nickname mention" title="dick_turpin">dickturpin</a> @<a href="http://quitter.se/user/113503" class="h-card u-url p-nickname mention" title="Luke">luke</a> Oh no, I miss being irritated by you, it helps me understand myself and others. Also it builds character. :-)<br /> <br /> So if this is not federation because you can't follow all of online mankind, what should we call it? Proto-federated? Pre-federated?<br /> <br /> The term has been used decades ago for just one Microsoft Active Directory domain cross-certifying the root of another, by mutual agreement. I don't see how it's any less relevant to opportunistic federation between open servers on an open internet.<br /> <br /> I'm not saying we should be satisfied, I'm just saying that "federate" is a useful word and to build a big system we need to start with a small one. And focus on the things we *can* change, like helping the OStatus network grow and making the tools more useful.<br /> <br /> Saying that the network's ideals have failed because other networks aren't joining is doing neither of that. - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-02T11:06:42+00:00 - 2017-05-02T11:06:42+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:social.heldscal.la,2017-05-02:noticeId=2012336:objectType=comment - New comment by clacke - @<a href="https://mastodon.org.uk/users/dick_turpin" class="h-card u-url p-nickname mention" title="dick_turpin">dickturpin</a> @<a href="http://quitter.se/user/113503" class="h-card u-url p-nickname mention" title="Luke">luke</a> Oh no, I miss being irritated by you, it helps me understand myself and others. Also it builds character. :-)<br /> <br /> So if this is not federation because you can't follow all of online mankind, what should we call it? Proto-federated? Pre-federated?<br /> <br /> The term has been used decades ago for just one Microsoft Active Directory domain cross-certifying the root of another, by mutual agreement. I don't see how it's any less relevant to opportunistic federation between open servers on an open internet.<br /> <br /> I'm not saying we should be satisfied, I'm just saying that &quot;federate&quot; is a useful word and to build a big system we need to start with a small one. And focus on the things we *can* change, like helping the OStatus network grow and making the tools more useful.<br /> <br /> Saying that the network's ideals have failed because other networks aren't joining is doing neither of that. - - - - - - - https://s.wefamlee.be/conversation/16478 - - - - - - - tag:social.heldscal.la,2017-05-02:fave:23211:comment:2011332:2017-05-02T10:37:40+00:00 - Favorite - lambadalambda favorited something by moonman: @<a href="https://social.heldscal.la/user/23211" class="h-card mention" title="Constance Variable">lambadalambda</a> <a href="https://www.youtube.com/watch?v=mKLizztikRk" title="https://www.youtube.com/watch?v=mKLizztikRk" class="attachment" rel="nofollow">https://www.youtube.com/watch?v=mKLizztikRk</a> - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-02T10:37:40+00:00 - 2017-05-02T10:37:40+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-02:noticeId=2781833:objectType=comment - New comment by moonman - @<a href="https://social.heldscal.la/user/23211" class="h-card mention" title="Constance Variable">lambadalambda</a> <a href="https://www.youtube.com/watch?v=mKLizztikRk" title="https://www.youtube.com/watch?v=mKLizztikRk" class="attachment" rel="nofollow">https://www.youtube.com/watch?v=mKLizztikRk</a> - - - - - - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=11d8b8c27d9513ec - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:social.heldscal.la,2017-05-02:noticeId=2012145:objectType=comment - New comment by lambadalambda - @<a href="https://sealion.club/user/186" class="h-card u-url p-nickname mention" title="I'M CEREAL U GUISE">cereal</a> ? No, you don't even need the identity servers for federation. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-02T10:37:33+00:00 - 2017-05-02T10:37:33+00:00 - - - - https://sealion.club/conversation/1629037 - - - - - - - diff --git a/test/fixtures/cw_retweet.xml b/test/fixtures/cw_retweet.xml deleted file mode 100644 index c99a569d7..000000000 --- a/test/fixtures/cw_retweet.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - https://mastodon.social/users/lambadalambda.atom - Critical Value - - 2017-04-16T21:47:25Z - https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif - - https://mastodon.social/users/lambadalambda - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/lambadalambda - lambadalambda - lambadalambda@mastodon.social - - - - lambadalambda - Critical Value - public - - - - - - - tag:mastodon.social,2017-05-11:objectId=5647963:objectType=Status - 2017-05-11T10:23:15Z - 2017-05-11T10:23:15Z - lambadalambda shared a status by Skruyb@mamot.fr - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - tag:mamot.fr,2017-05-10:objectId=1294943:objectType=Status - 2017-05-10T17:31:44Z - 2017-05-10T17:31:45Z - New status by Skruyb@mamot.fr - - https://mamot.fr/users/Skruyb - http://activitystrea.ms/schema/1.0/person - https://mamot.fr/users/Skruyb - Skruyb - Skruyb@mamot.fr - <p>Fr and En.<br>Posts will disappear on a regular basis.</p> - - - - Skruyb - The 7th Son - Fr and En.Posts will disappear on a regular basis. - public - - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - Hey. - <p><span class="h-card"><a href="https://mastodon.social/@lambadalambda">@<span>lambadalambda</span></a></span></p><p>Hey!!!</p> - - - public - - - - <p><span class="h-card"><a href="https://mastodon.social/@lambadalambda">@<span>lambadalambda</span></a></span></p><p>Hey!!!</p> - - public - - - - diff --git a/test/fixtures/delete.xml b/test/fixtures/delete.xml deleted file mode 100644 index 731e1c204..000000000 --- a/test/fixtures/delete.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - https://mastodon.sdf.org/users/snowdusk.atom - snowdusk - Amateur live performance DJ/radio DJ on SDF's underground Internet radio http://aNONradio.net (LIVE Sat Sun Mon Tue 23:00-24:00 UTC) - http://snowdusk.sdf.org - 2017-06-17T04:14:34Z - https://mastodon.sdf.org/system/accounts/avatars/000/000/002/original/405a7652d5f60449.jpg?1497672873 - - https://mastodon.sdf.org/users/snowdusk - http://activitystrea.ms/schema/1.0/person - https://mastodon.sdf.org/users/snowdusk - snowdusk - snowdusk@mastodon.sdf.org - <p>Amateur live performance DJ/radio DJ on SDF&apos;s underground Internet radio <a href="http://anonradio.net/" rel="nofollow noopener" target="_blank"><span class="invisible">http://</span><span class="">anonradio.net/</span><span class="invisible"></span></a> (LIVE Sat Sun Mon Tue 23:00-24:00 UTC) - <a href="http://snowdusk.sdf.org/" rel="nofollow noopener" target="_blank"><span class="invisible">http://</span><span class="">snowdusk.sdf.org/</span><span class="invisible"></span></a></p> - - - - snowdusk - snowdusk - Amateur live performance DJ/radio DJ on SDF's underground Internet radio http://aNONradio.net (LIVE Sat Sun Mon Tue 23:00-24:00 UTC) - http://snowdusk.sdf.org - public - - - - - - - - tag:mastodon.sdf.org,2017-06-10:objectId=310513:objectType=Status - 2017-06-10T22:02:31Z - 2017-06-10T22:02:31Z - snowdusk deleted status - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/delete - Deleted status - - - - diff --git a/test/fixtures/dm.xml b/test/fixtures/dm.xml deleted file mode 100644 index d0b8aa811..000000000 --- a/test/fixtures/dm.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - tag:mastodon.social,2017-06-30:objectId=11260427:objectType=Status - 2017-06-30T13:27:47Z - 2017-06-30T13:27:47Z - New status by lambadalambda - - https://mastodon.social/users/lambadalambda - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/lambadalambda - lambadalambda - lambadalambda@mastodon.social - - - lambadalambda - Critical Value - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://pleroma.soykaf.com/users/lain" class="u-url mention">@<span>lain</span></a></span> Hey.</p> - - direct - - - - diff --git a/test/fixtures/favorite.xml b/test/fixtures/favorite.xml deleted file mode 100644 index c32b4a403..000000000 --- a/test/fixtures/favorite.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - GNU social - https://social.heldscal.la/api/statuses/user_timeline/23211.atom - lambadalambda timeline - Updates from lambadalambda on social.heldscal.la! - https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg - 2017-05-05T09:12:53+00:00 - - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - Call me Deacon Blues. - - - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - - Berlin - - - homepage - https://heldscal.la - true - - - - - - - - - - - - - tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061643:2017-05-05T09:12:50+00:00 - Favorite - lambadalambda favorited something by moonman: @<a href="https://shitposter.club/user/9655" class="h-card mention" title="Solidarity for Pigs">neimzr4luzerz</a> @<a href="https://gs.smuglo.li/user/2326" class="h-card mention" title="Dolus_McHonest">dolus</a> childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T09:12:50+00:00 - 2017-05-05T09:12:50+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment - New comment by moonman - @<a href="https://shitposter.club/user/9655" class="h-card mention" title="Solidarity for Pigs">neimzr4luzerz</a> @<a href="https://gs.smuglo.li/user/2326" class="h-card mention" title="Dolus_McHonest">dolus</a> childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English - - - - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4 - - - - - - diff --git a/test/fixtures/favorite_with_local_note.xml b/test/fixtures/favorite_with_local_note.xml deleted file mode 100644 index 3c955607d..000000000 --- a/test/fixtures/favorite_with_local_note.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - GNU social - https://social.heldscal.la/api/statuses/user_timeline/23211.atom - lambadalambda timeline - Updates from lambadalambda on social.heldscal.la! - https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg - 2017-05-05T09:12:53+00:00 - - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - Call me Deacon Blues. - - - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - - Berlin - - - homepage - https://heldscal.la - true - - - - - - - - - - - - - tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061643:2017-05-05T09:12:50+00:00 - Favorite - lambadalambda favorited something by moonman: @<a href="https://shitposter.club/user/9655" class="h-card mention" title="Solidarity for Pigs">neimzr4luzerz</a> @<a href="https://gs.smuglo.li/user/2326" class="h-card mention" title="Dolus_McHonest">dolus</a> childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T09:12:50+00:00 - 2017-05-05T09:12:50+00:00 - - http://activitystrea.ms/schema/1.0/comment - localid - New comment by moonman - @<a href="https://shitposter.club/user/9655" class="h-card mention" title="Solidarity for Pigs">neimzr4luzerz</a> @<a href="https://gs.smuglo.li/user/2326" class="h-card mention" title="Dolus_McHonest">dolus</a> childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English - - - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4 - - - - - - diff --git a/test/fixtures/follow.xml b/test/fixtures/follow.xml deleted file mode 100644 index d4e89954b..000000000 --- a/test/fixtures/follow.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - GNU social - https://social.heldscal.la/api/statuses/user_timeline/23211.atom - lambadalambda timeline - Updates from lambadalambda on social.heldscal.la! - https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg - 2017-05-07T09:54:49+00:00 - - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - Call me Deacon Blues. - - - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - - Berlin - - - homepage - https://heldscal.la - true - - - - - - - - - - - - - tag:social.heldscal.la,2017-05-07:subscription:23211:person:44803:2017-05-07T09:54:48+00:00 - Constance Variable (lambadalambda@social.heldscal.la)'s status on Sunday, 07-May-2017 09:54:49 UTC - <a href="https://social.heldscal.la/lambadalambda">Constance Variable</a> started following <a href="https://pawoo.net/@pekorino">mono</a>. - - http://activitystrea.ms/schema/1.0/follow - 2017-05-07T09:54:49+00:00 - 2017-05-07T09:54:49+00:00 - - http://activitystrea.ms/schema/1.0/person - https://pawoo.net/users/pekorino - mono - http://shitposter.club/mono 孤独のグルメ - - - - - pekorino - mono - http://shitposter.club/mono 孤独のグルメ - - - tag:social.heldscal.la,2017-05-07:objectType=thread:nonce=6e80caf94e03029f - - - - - - diff --git a/test/fixtures/incoming_note_activity.xml b/test/fixtures/incoming_note_activity.xml deleted file mode 100644 index 21eda2d30..000000000 --- a/test/fixtures/incoming_note_activity.xml +++ /dev/null @@ -1,42 +0,0 @@ - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org:4040,2017-04-23:noticeId=29:objectType=note - New note by lambda - @<a href="http://pleroma.example.org:4000/users/lain3" class="h-card mention">lain3</a> - - - - - http://activitystrea.ms/schema/1.0/post - 2017-04-23T14:51:03+00:00 - 2017-04-23T14:51:03+00:00 - - http://activitystrea.ms/schema/1.0/person - http://gs.example.org:4040/index.php/user/1 - lambda - - - - - lambda - lambda - - - - - tag:gs.example.org:4040,2017-04-23:objectType=thread:nonce=f09e22f58abd5c7b - - - - http://gs.example.org:4040/index.php/api/statuses/user_timeline/1.atom - lambda - - - - http://gs.example.org:4040/theme/neo-gnu/default-avatar-profile.png - 2017-04-23T14:51:03+00:00 - - - - - diff --git a/test/fixtures/incoming_note_activity_answer.xml b/test/fixtures/incoming_note_activity_answer.xml deleted file mode 100644 index b1244faa6..000000000 --- a/test/fixtures/incoming_note_activity_answer.xml +++ /dev/null @@ -1,42 +0,0 @@ - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org:4040,2017-04-25:noticeId=55:objectType=note - New note by lambda - hey. - - - http://activitystrea.ms/schema/1.0/post - 2017-04-25T18:16:13+00:00 - 2017-04-25T18:16:13+00:00 - - http://activitystrea.ms/schema/1.0/person - http://gs.example.org:4040/index.php/user/1 - lambda - - - - - lambda - lambda - - - - - - - http://pleroma.example.org:4000/contexts/8f6f45d4-8e4d-4e1a-a2de-09f27367d2d0 - - - - http://gs.example.org:4040/index.php/api/statuses/user_timeline/1.atom - lambda - - - - http://gs.example.org:4040/theme/neo-gnu/default-avatar-profile.png - 2017-04-25T18:16:13+00:00 - - - - - diff --git a/test/fixtures/incoming_reply_mastodon.xml b/test/fixtures/incoming_reply_mastodon.xml deleted file mode 100644 index 8ee1186cc..000000000 --- a/test/fixtures/incoming_reply_mastodon.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - tag:mastodon.social,2017-05-02:objectId=4901603:objectType=Status - 2017-05-02T18:33:06Z - 2017-05-02T18:33:06Z - New status by lambadalambda - - https://mastodon.social/users/lambadalambda - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/lambadalambda - lambadalambda - lambadalambda@mastodon.social - - - - lambadalambda - Critical Value - public - - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://pleroma.soykaf.com/users/lain" class="u-url mention">@<span>lain</span></a></span> hey</p> - - - public - - - - diff --git a/test/fixtures/incoming_websub_gnusocial_attachments.xml b/test/fixtures/incoming_websub_gnusocial_attachments.xml deleted file mode 100644 index 9d331ef32..000000000 --- a/test/fixtures/incoming_websub_gnusocial_attachments.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - GNU social - https://social.heldscal.la/api/statuses/user_timeline/23211.atom - lambadalambda timeline - Updates from lambadalambda on social.heldscal.la! - https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg - 2017-05-02T20:29:35+00:00 - - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - Call me Deacon Blues. - - - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - - Berlin - - - homepage - https://heldscal.la - true - - - - - - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.heldscal.la,2017-05-02:noticeId=2020923:objectType=note - New note by lambadalambda - Okay gonna stream some cool games!! <a href="https://social.heldscal.la/file/7ed5ee508e6376a6e3dd581e17e7ed0b7b638147c7e86784bf83abc2641ee3d4.gif" title="https://social.heldscal.la/file/7ed5ee508e6376a6e3dd581e17e7ed0b7b638147c7e86784bf83abc2641ee3d4.gif" rel="nofollow external noreferrer" class="attachment" id="attachment-423842">https://social.heldscal.la/attachment/423842</a> <a href="https://social.heldscal.la/file/4c209099cadfc5afd3e27a334aa0db96b3a7510dde1603305d68a2707e59a11f.png" title="https://social.heldscal.la/file/4c209099cadfc5afd3e27a334aa0db96b3a7510dde1603305d68a2707e59a11f.png" rel="nofollow external noreferrer" class="attachment" id="attachment-423843">https://social.heldscal.la/attachment/423843</a> - - - http://activitystrea.ms/schema/1.0/post - 2017-05-02T20:29:35+00:00 - 2017-05-02T20:29:35+00:00 - - tag:social.heldscal.la,2017-05-02:objectType=thread:nonce=26c7afdcbcf4ebd4 - - - - - - - - diff --git a/test/fixtures/lambadalambda.atom b/test/fixtures/lambadalambda.atom deleted file mode 100644 index 964a416f7..000000000 --- a/test/fixtures/lambadalambda.atom +++ /dev/null @@ -1,479 +0,0 @@ - - - https://mastodon.social/users/lambadalambda.atom - Critical Value - - 2017-04-16T21:47:25Z - https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif?1492379244 - - https://mastodon.social/users/lambadalambda - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/lambadalambda - lambadalambda - lambadalambda@mastodon.social - a cool dude. - - - - lambadalambda - Critical Value - public - - - - - - - - tag:mastodon.social,2017-04-07:objectId=1874242:objectType=Status - 2017-04-07T11:02:56Z - 2017-04-07T11:02:56Z - lambadalambda shared a status by 0xroy@social.wxcafe.net - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - tag:social.wxcafe.net,2017-04-07:objectId=72554:objectType=Status - 2017-04-07T11:01:59Z - 2017-04-07T11:02:00Z - New status by 0xroy@social.wxcafe.net - - https://social.wxcafe.net/users/0xroy - http://activitystrea.ms/schema/1.0/person - https://social.wxcafe.net/users/0xroy - 0xroy - 0xroy@social.wxcafe.net - ta caution weeb | discussions privées : <a href="https://💌.0xroy.me" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="">💌.0xroy.me</span><span class="invisible"></span></a> - - - - 0xroy - 「R O Y 🍵 B O S」 - ta caution weeb | discussions privées : <a href="https://%F0%9F%92%8C.0xroy.me" rel="nofollow noopener"><span class="invisible">https://</span><span class="">💌.0xroy.me</span><span class="invisible"></span></a> - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>someone pls eli5 matrix (protocol) and riot</p> - - public - - - <p>someone pls eli5 matrix (protocol) and riot</p> - - public - - - - - tag:mastodon.social,2017-04-06:objectId=1768247:objectType=Status - 2017-04-06T11:10:19Z - 2017-04-06T11:10:19Z - lambadalambda shared a status by areyoutoo@mastodon.xyz - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - tag:mastodon.xyz,2017-04-05:objectId=133327:objectType=Status - 2017-04-05T17:36:41Z - 2017-04-05T18:12:14Z - New status by areyoutoo@mastodon.xyz - - https://mastodon.xyz/users/areyoutoo - http://activitystrea.ms/schema/1.0/person - https://mastodon.xyz/users/areyoutoo - areyoutoo - areyoutoo@mastodon.xyz - devops | retired gamedev | always boost puppy pics - - - - areyoutoo - Raw Butter - devops | retired gamedev | always boost puppy pics - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>Some UX thoughts for <a href="https://mastodon.xyz/tags/mastodev" class="mention hashtag">#<span>mastodev</span></a>:</p><p>- Would be nice if I could work on multiple draft toots? Clicking to reply to someone seems to erase any draft I had been working on.</p><p>- Kinda risky to click on the Federated Timeline if it loads new toots and scrolls 10ms before I click on something.</p><p>I probably don't know enough web frontend to help, but it might be fun to try.</p> - - - public - - - <p>Some UX thoughts for <a href="https://mastodon.xyz/tags/mastodev" class="mention hashtag">#<span>mastodev</span></a>:</p><p>- Would be nice if I could work on multiple draft toots? Clicking to reply to someone seems to erase any draft I had been working on.</p><p>- Kinda risky to click on the Federated Timeline if it loads new toots and scrolls 10ms before I click on something.</p><p>I probably don't know enough web frontend to help, but it might be fun to try.</p> - - public - - - - - tag:mastodon.social,2017-04-06:objectId=1764509:objectType=Status - 2017-04-06T10:15:38Z - 2017-04-06T10:15:38Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - This is a test for cw federation - <p>This is a test for cw federation body text.</p> - - public - - - - - tag:mastodon.social,2017-04-05:objectId=1645208:objectType=Status - 2017-04-05T07:14:53Z - 2017-04-05T07:14:53Z - lambadalambda shared a status by lambadalambda@social.heldscal.la - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - tag:social.heldscal.la,2017-04-05:noticeId=1502088:objectType=note - 2017-04-05T06:12:09Z - 2017-04-05T07:12:47Z - New status by lambadalambda@social.heldscal.la - - https://social.heldscal.la/user/23211 - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - lambadalambda@social.heldscal.la - Call me Deacon Blues. - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - Federation 101: <a href="https://www.youtube.com/watch?v=t1lYU5CA40o" rel="nofollow external noreferrer" class="attachment thumbnail">https://www.youtube.com/watch?v=t1lYU5CA40o</a> - - public - - - Federation 101: <a href="https://www.youtube.com/watch?v=t1lYU5CA40o" rel="nofollow external noreferrer" class="attachment thumbnail">https://www.youtube.com/watch?v=t1lYU5CA40o</a> - - public - - - - - tag:mastodon.social,2017-04-05:objectId=1641750:objectType=Status - 2017-04-05T05:44:48Z - 2017-04-05T05:44:48Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> just a test.</p> - - - public - - - - - tag:mastodon.social,2017-04-04:objectId=1540149:objectType=Status - 2017-04-04T06:31:09Z - 2017-04-04T06:31:09Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>Looks like you still can&apos;t delete your account here (PRIVACY!), but I won&apos;t be posting here anymore, my main account is <span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span></p> - - - public - - - - - tag:mastodon.social,2017-04-04:objectId=1539608:objectType=Status - 2017-04-04T06:18:16Z - 2017-04-04T06:18:16Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mastodon.social/@ghostbar" class="u-url mention">@<span>ghostbar</span></a></span> Remember to rewrite it in Rust once you&apos;re done.</p> - - - public - - - - - - tag:mastodon.social,2017-04-03:objectId=1504813:objectType=Status - 2017-04-03T18:01:20Z - 2017-04-03T18:01:20Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mastodon.xyz/@Azurolu" class="u-url mention">@<span>Azurolu</span></a></span> You mean gs.smuglo.li?</p> - - - public - - - - - - tag:mastodon.social,2017-04-03:objectId=1504805:objectType=Status - 2017-04-03T18:01:05Z - 2017-04-03T18:01:05Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>There&apos;s nothing wrong with having several alt accounts all across the fediverse. Try out another mastodon instance (<a href="https://icosahedron.website" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="">icosahedron.website</span><span class="invisible"></span></a>) or a GNU Social instance (like <a href="https://shitposter.club" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="">shitposter.club</span><span class="invisible"></span></a> or <a href="https://freezepeach.xyz" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="">freezepeach.xyz</span><span class="invisible"></span></a>), or friendica. They are all on the same network, so you can still follow all your friends!</p> - - public - - - - - tag:mastodon.social,2017-04-03:objectId=1503965:objectType=Status - 2017-04-03T17:31:30Z - 2017-04-03T17:31:30Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mastodon.social/@20Hz" class="u-url mention">@<span>20Hz</span></a></span> you could also try out a GS instance, which are on the same network :)</p> - - - public - - - - - - tag:mastodon.social,2017-04-03:objectId=1503955:objectType=Status - 2017-04-03T17:31:08Z - 2017-04-03T17:31:08Z - lambadalambda shared a status by shpuld@shitposter.club - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - tag:shitposter.club,2017-04-03:noticeId=2251717:objectType=note - 2017-04-03T17:06:43Z - 2017-04-03T17:12:06Z - New status by shpuld@shitposter.club - - https://shitposter.club/user/5381 - http://activitystrea.ms/schema/1.0/person - https://shitposter.club/user/5381 - shpuld - shpuld@shitposter.club - - - - - shpuld - shp - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - reposting the classic <a href="https://shitposter.club/file/89c5fe483526caf3a46cfc5cdd4ae68061054350e767397731af658d54786e31.jpg" class="attachment" rel="nofollow external">https://shitposter.club/attachment/219846</a> - - - public - - - reposting the classic <a href="https://shitposter.club/file/89c5fe483526caf3a46cfc5cdd4ae68061054350e767397731af658d54786e31.jpg" class="attachment" rel="nofollow external">https://shitposter.club/attachment/219846</a> - - public - - - - - tag:mastodon.social,2017-04-03:objectId=1503929:objectType=Status - 2017-04-03T17:30:43Z - 2017-04-03T17:30:43Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mastodon.social/@ghostbar" class="u-url mention">@<span>ghostbar</span></a></span> Normally you shouldn&apos;t be running tens of thousands of users on one instance... That&apos;s one of the reasons for federation.</p> - - - public - - - - - - tag:mastodon.social,2017-04-03:objectId=1477255:objectType=Status - 2017-04-03T08:24:39Z - 2017-04-03T08:24:39Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mastodon.social/@dot_tiff" class="u-url mention">@<span>dot_tiff</span></a></span> it&apos;s the vaporwave mode.</p> - - - public - - - - - - tag:mastodon.social,2017-04-03:objectId=1476210:objectType=Status - 2017-04-03T07:45:42Z - 2017-04-03T07:45:42Z - lambadalambda shared a status by lambadalambda@social.heldscal.la - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - tag:social.heldscal.la,2017-04-03:noticeId=1475727:objectType=note - 2017-04-03T07:44:43Z - 2017-04-03T07:44:48Z - New status by lambadalambda@social.heldscal.la - - https://social.heldscal.la/user/23211 - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - lambadalambda@social.heldscal.la - Call me Deacon Blues. - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - Here's a song by the original anti-idol, Togawa Jun: <a href="https://www.youtube.com/watch?v=kNI_NK2YY-s" rel="nofollow external noreferrer" class="attachment">https://www.youtube.com/watch?v=kNI_NK2YY-s</a> - - public - - - Here's a song by the original anti-idol, Togawa Jun: <a href="https://www.youtube.com/watch?v=kNI_NK2YY-s" rel="nofollow external noreferrer" class="attachment">https://www.youtube.com/watch?v=kNI_NK2YY-s</a> - - public - - - - - tag:mastodon.social,2017-04-03:objectId=1476047:objectType=Status - 2017-04-03T07:39:14Z - 2017-04-03T07:39:14Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mastodon.social/@amrrr" class="u-url mention">@<span>amrrr</span></a></span> tumblr/10, but pretty good!</p> - - - public - - - - - - tag:mastodon.social,2017-04-03:objectId=1475949:objectType=Status - 2017-04-03T07:35:45Z - 2017-04-03T07:35:45Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mastodon.social/@Shookaite" class="u-url mention">@<span>Shookaite</span></a></span> Oh, you mean like userstyles?</p> - - - public - - - - - - tag:mastodon.social,2017-04-03:objectId=1475581:objectType=Status - 2017-04-03T07:20:03Z - 2017-04-03T07:20:03Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mastodon.social/@Shookaite" class="u-url mention">@<span>Shookaite</span></a></span> Would be nice if someone helped port Pleroma to Mastodon, that has a theme switcher (click on the cog in the upper right): <a href="https://pleroma.heldscal.la/main/all" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="">pleroma.heldscal.la/main/all</span><span class="invisible"></span></a></p> - - - public - - - - - - tag:mastodon.social,2017-04-02:objectId=1457325:objectType=Status - 2017-04-02T21:57:43Z - 2017-04-02T21:57:43Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mastodon.social/@rhosyn" class="u-url mention">@<span>rhosyn</span></a></span> <span class="h-card"><a href="https://mastodon.social/@Meaningness" class="u-url mention">@<span>Meaningness</span></a></span> you could take a look at those listed at social.guhnoo.org</p> - - - - public - - - - - - tag:mastodon.social,2017-04-02:objectId=1447926:objectType=Status - 2017-04-02T18:31:52Z - 2017-04-02T18:31:52Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>My main account is <span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> , btw.</p> - - - public - - - - - tag:mastodon.social,2017-04-02:objectId=1447878:objectType=Status - 2017-04-02T18:30:37Z - 2017-04-02T18:30:37Z - lambadalambda shared a status by Firstaide@awoo.space - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - tag:awoo.space,2017-04-02:objectId=135324:objectType=Status - 2017-04-02T18:29:32Z - 2017-04-02T18:29:32Z - New status by Firstaide@awoo.space - - https://awoo.space/users/Firstaide - http://activitystrea.ms/schema/1.0/person - https://awoo.space/users/Firstaide - Firstaide - Firstaide@awoo.space - A smol awoo account, for a smol autistic 💙 -They/them please! -NB/white/ace - - - - Firstaide - Miff🚑✨ - A smol awoo account, for a smol autistic 💙 -They/them please! -NB/white/ace - public - - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><a href="https://mastodon.social/users/lambadalambda" class="h-card u-url p-nickname mention">@<span>lambadalambda</span></a> yeah, I think that's p much the big issue here? <br>When I first heard of Masto, I thought it was just like twitter at first, I had no idea federation was even a thing?, and I actually joined p early on? :-o </p><p>idk I think more stuff needs to be done about federation promotion, but honestly its gotta come from the get go when people get here to make an account I feel :-o</p> - - - public - - - - <p><a href="https://mastodon.social/users/lambadalambda" class="h-card u-url p-nickname mention">@<span>lambadalambda</span></a> yeah, I think that's p much the big issue here? <br>When I first heard of Masto, I thought it was just like twitter at first, I had no idea federation was even a thing?, and I actually joined p early on? :-o </p><p>idk I think more stuff needs to be done about federation promotion, but honestly its gotta come from the get go when people get here to make an account I feel :-o</p> - - public - - - - diff --git a/test/fixtures/mastodon-note-cw.xml b/test/fixtures/mastodon-note-cw.xml deleted file mode 100644 index 02f49dd61..000000000 --- a/test/fixtures/mastodon-note-cw.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - https://mastodon.social/users/lambadalambda.atom - Critical Value - - 2017-04-16T21:47:25Z - https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif - - https://mastodon.social/users/lambadalambda - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/lambadalambda - lambadalambda - lambadalambda@mastodon.social - - - - lambadalambda - Critical Value - public - - - - - - - tag:mastodon.social,2017-05-10:objectId=5551985:objectType=Status - 2017-05-10T12:21:36Z - 2017-05-10T12:21:36Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - technologic - <p>test</p> - - public - - - - diff --git a/test/fixtures/mastodon-note-unlisted.xml b/test/fixtures/mastodon-note-unlisted.xml deleted file mode 100644 index d21017b80..000000000 --- a/test/fixtures/mastodon-note-unlisted.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - https://mastodon.social/users/lambadalambda.atom - Critical Value - - 2017-04-16T21:47:25Z - https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif - - https://mastodon.social/users/lambadalambda - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/lambadalambda - lambadalambda - lambadalambda@mastodon.social - - - - lambadalambda - Critical Value - public - - - - - - - tag:mastodon.social,2017-05-10:objectId=5551985:objectType=Status - 2017-05-10T12:21:36Z - 2017-05-10T12:21:36Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - technologic - <p>test</p> - unlisted - - - - diff --git a/test/fixtures/mastodon-problematic.xml b/test/fixtures/mastodon-problematic.xml deleted file mode 100644 index a39e72759..000000000 --- a/test/fixtures/mastodon-problematic.xml +++ /dev/null @@ -1,72 +0,0 @@ - - - https://icosahedron.website/users/shel.atom - shel🍖‼️ - Gay jackal dog, poet, future librarian. - -http://datapup.info -avatar: @puppytube@twitter.com - 2017-05-02T23:26:01Z - https://icosahedron.website/system/accounts/avatars/000/001/207/original/b1e07b09ae1cc787.png?1493767561 - - https://icosahedron.website/users/shel - http://activitystrea.ms/schema/1.0/person - https://icosahedron.website/users/shel - shel - shel@icosahedron.website - <p>Gay jackal dog, poet, future librarian. </p><p><a href="http://datapup.info/" rel="nofollow noopener" target="_blank"><span class="invisible">http://</span><span class="">datapup.info/</span><span class="invisible"></span></a><br />avatar: @puppytube@twitter.com</p> - - - - shel - shel🍖‼️ - Gay jackal dog, poet, future librarian. - -http://datapup.info -avatar: @puppytube@twitter.com - public - - - - - - - tag:icosahedron.website,2017-05-10:objectId=1414013:objectType=Status - 2017-05-10T17:16:24Z - 2017-05-10T17:16:24Z - shel shared a status by instance_names@cybre.space - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - tag:cybre.space,2017-05-10:objectId=946671:objectType=Status - 2017-05-10T17:15:51Z - 2017-05-10T17:15:52Z - New status by instance_names@cybre.space - - https://cybre.space/users/instance_names - http://activitystrea.ms/schema/1.0/person - https://cybre.space/users/instance_names - instance_names - instance_names@cybre.space - <p>name ideas for your new mastodon instance. made by <span class="h-card"><a href="https://witches.town/@lycaon">@<span>lycaon</span></a></span> source available at <a href="https://github.com/LycaonIsAWolf/instance_names"><span class="invisible">https://</span><span class="ellipsis">github.com/LycaonIsAWolf/insta</span><span class="invisible">nce_names</span></a></p> - - - - instance_names - instance names - name ideas for your new mastodon instance. made by @lycaon source available at https://github.com/LycaonIsAWolf/instance_names - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>dildo.codes</p> - unlisted - - - <p>dildo.codes</p> - - public - - - - diff --git a/test/fixtures/mastodon_conversation.xml b/test/fixtures/mastodon_conversation.xml deleted file mode 100644 index 8faab2304..000000000 --- a/test/fixtures/mastodon_conversation.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - tag:mastodon.social,2017-08-28:objectId=16402826:objectType=Status - 2017-08-28T17:58:55Z - 2017-08-28T17:58:55Z - New status by lambadalambda - - https://mastodon.social/users/lambadalambda - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/lambadalambda - lambadalambda - lambadalambda@mastodon.social - - - - lambadalambda - Critical Value - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - <p>test. <a href="https://mastodon.social/media/XCp0OHGPON9kWZwhjaI" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="ellipsis">mastodon.social/media/XCp0OHGP</span><span class="invisible">ON9kWZwhjaI</span></a></p> - - - public - - - - diff --git a/test/fixtures/nil_mention_entry.xml b/test/fixtures/nil_mention_entry.xml deleted file mode 100644 index e13024cb3..000000000 --- a/test/fixtures/nil_mention_entry.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - GNU social - https://social.stopwatchingus-heidelberg.de/api/statuses/user_timeline/18330.atom - atarifrosch timeline - Updates from atarifrosch on social.stopwatchingus-heidelberg.de! - https://social.stopwatchingus-heidelberg.de/avatar/18330-96-20150628163706.png - 2017-08-24T11:36:49+02:00 - - http://activitystrea.ms/schema/1.0/person - https://social.stopwatchingus-heidelberg.de/user/18330 - atarifrosch - Nerd, Pirat, Debian user, CAcert assurer, Geocacher, Freifunker. Autismus/Depression, agender. GnuPG Key-ID: 0xBCF81ADE - - - - - - atarifrosch - Atari-Frosch - Nerd, Pirat, Debian user, CAcert assurer, Geocacher, Freifunker. Autismus/Depression, agender. GnuPG Key-ID: 0xBCF81ADE - - Düsseldorf, NRW, Germany - - - homepage - https://www.atari-frosch.de/ - true - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.stopwatchingus-heidelberg.de,2017-08-22:noticeId=978072:objectType=note - New note by atarifrosch - 2017-08-22 Bundesverfassungsgericht: Erfolgreiche Verfassungsbeschwerde gegen die Versagung vorläufiger Leistungen für Kosten der Unterkunft und Heizung – <a href="https://www.bundesverfassungsgericht.de/SharedDocs/Pressemitteilungen/DE/2017/bvg17-072.html" title="https://www.bundesverfassungsgericht.de/SharedDocs/Pressemitteilungen/DE/2017/bvg17-072.html" class="attachment" id="attachment-450768" rel="nofollow external">https://www.bundesverfassungsgericht.de/SharedDocs/Pressemitteilungen/DE/2017/bvg17-072.html</a> !<a href="http://quitter.se/group/2184/id" class="h-card group" title="HartzIV (hartziv)">hartziv</a> - - - http://activitystrea.ms/schema/1.0/post - 2017-08-22T12:00:21+00:00 - 2017-08-22T12:00:21+00:00 - - tag:social.stopwatchingus-heidelberg.de,2017-08-22:noticeId=978072:objectType=thread:crc32=28a35f44 - - - - - - - - diff --git a/test/fixtures/ostatus_incoming_post.xml b/test/fixtures/ostatus_incoming_post.xml deleted file mode 100644 index 7967e1b32..000000000 --- a/test/fixtures/ostatus_incoming_post.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - GNU social - https://social.heldscal.la/api/statuses/user_timeline/23211.atom - lambadalambda timeline - Updates from lambadalambda on social.heldscal.la! - https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg - 2017-04-29T18:25:38+00:00 - - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - Call me Deacon Blues. - - - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - - Berlin - - - homepage - https://heldscal.la - true - - - - - - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.heldscal.la,2017-04-29:noticeId=1967725:objectType=note - New note by lambadalambda - Will it blend? - - - http://activitystrea.ms/schema/1.0/post - 2017-04-29T18:25:38+00:00 - 2017-04-29T18:25:38+00:00 - - tag:social.heldscal.la,2017-04-29:objectType=thread:nonce=3f3a9dd83acc4e35 - - - - - - diff --git a/test/fixtures/ostatus_incoming_post_tag.xml b/test/fixtures/ostatus_incoming_post_tag.xml deleted file mode 100644 index 0f99c4126..000000000 --- a/test/fixtures/ostatus_incoming_post_tag.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - GNU social - https://social.heldscal.la/api/statuses/user_timeline/23211.atom - lambadalambda timeline - Updates from lambadalambda on social.heldscal.la! - https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg - 2017-04-29T18:25:38+00:00 - - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - Call me Deacon Blues. - - - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - - Berlin - - - homepage - https://heldscal.la - true - - - - - - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.heldscal.la,2017-04-29:noticeId=1967725:objectType=note - New note by lambadalambda - Will it blend? - - - - - http://activitystrea.ms/schema/1.0/post - 2017-04-29T18:25:38+00:00 - 2017-04-29T18:25:38+00:00 - - tag:social.heldscal.la,2017-04-29:objectType=thread:nonce=3f3a9dd83acc4e35 - - - - - - diff --git a/test/fixtures/ostatus_incoming_reply.xml b/test/fixtures/ostatus_incoming_reply.xml deleted file mode 100644 index 83a427a68..000000000 --- a/test/fixtures/ostatus_incoming_reply.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - GNU social - https://social.heldscal.la/api/statuses/user_timeline/23211.atom - lambadalambda timeline - Updates from lambadalambda on social.heldscal.la! - https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg - 2017-04-30T09:30:32+00:00 - - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - Call me Deacon Blues. - - - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - - Berlin - - - homepage - https://heldscal.la - true - - - - - - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:social.heldscal.la,2017-04-30:noticeId=1978790:objectType=comment - New comment by lambadalambda - @<a href="https://gs.archae.me/user/4687" class="h-card u-url p-nickname mention" title="shpbot">shpbot</a> why not indeed. - - - http://activitystrea.ms/schema/1.0/post - 2017-04-30T09:30:32+00:00 - 2017-04-30T09:30:32+00:00 - - - - https://gs.archae.me/conversation/327120 - - - - - - - diff --git a/test/fixtures/share-gs-local.xml b/test/fixtures/share-gs-local.xml deleted file mode 100644 index 9d52eab7b..000000000 --- a/test/fixtures/share-gs-local.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - GNU social - https://social.heldscal.la/api/statuses/user_timeline/23211.atom - lambadalambda timeline - Updates from lambadalambda on social.heldscal.la! - https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg - 2017-05-03T08:05:41+00:00 - - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - Call me Deacon Blues. - - - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - - Berlin - - - homepage - https://heldscal.la - true - - - - - - - - - - - - - tag:social.heldscal.la,2017-05-03:noticeId=2028428:objectType=note - lambadalambda repeated a notice by lain - RT @<a href="https://pleroma.soykaf.com/users/lain" class="h-card u-url p-nickname mention" title="Lain Iwakura">lain</a> Added returning the entries as xml... let's see if the mastodon hammering stops now. - - http://activitystrea.ms/schema/1.0/share - 2017-05-03T08:05:41+00:00 - 2017-05-03T08:05:41+00:00 - - http://activitystrea.ms/schema/1.0/activity - LOCAL_ID - - Added returning the entries as xml... let's see if the mastodon hammering stops now. - - http://activitystrea.ms/schema/1.0/post - 2017-05-03T08:04:44+00:00 - 2017-05-03T08:04:44+00:00 - - http://activitystrea.ms/schema/1.0/person - LOCAL_USER - lain - Test account - - - - - - lain - Lain Iwakura - Test account - - - - http://activitystrea.ms/schema/1.0/note - https://pleroma.soykaf.com/objects/4c1bda26-902e-4525-9fcd-b9fd44925193 - New note by lain - Added returning the entries as xml... let's see if the mastodon hammering stops now. - - - - - https://pleroma.soykaf.com/contexts/ede39a2b-7cf3-4fa4-8ccd-cb97431bcc22 - - - https://pleroma.soykaf.com/users/lain/feed.atom - Lain Iwakura - - - https://social.heldscal.la/avatar/43188-96-20170429172422.jpeg - 2017-05-03T08:04:44+00:00 - - - - https://pleroma.soykaf.com/contexts/ede39a2b-7cf3-4fa4-8ccd-cb97431bcc22 - - - - - - diff --git a/test/fixtures/share-gs.xml b/test/fixtures/share-gs.xml deleted file mode 100644 index ab5e488bd..000000000 --- a/test/fixtures/share-gs.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - GNU social - https://social.heldscal.la/api/statuses/user_timeline/23211.atom - lambadalambda timeline - Updates from lambadalambda on social.heldscal.la! - https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg - 2017-05-03T08:05:41+00:00 - - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - Call me Deacon Blues. - - - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - - Berlin - - - homepage - https://heldscal.la - true - - - - - - - - - - - - - tag:social.heldscal.la,2017-05-03:noticeId=2028428:objectType=note - lambadalambda repeated a notice by lain - RT @<a href="https://pleroma.soykaf.com/users/lain" class="h-card u-url p-nickname mention" title="Lain Iwakura">lain</a> Added returning the entries as xml... let's see if the mastodon hammering stops now. - - http://activitystrea.ms/schema/1.0/share - 2017-05-03T08:05:41+00:00 - 2017-05-03T08:05:41+00:00 - - http://activitystrea.ms/schema/1.0/activity - https://pleroma.soykaf.com/objects/4c1bda26-902e-4525-9fcd-b9fd44925193 - - Added returning the entries as xml... let's see if the mastodon hammering stops now. - - http://activitystrea.ms/schema/1.0/post - 2017-05-03T08:04:44+00:00 - 2017-05-03T08:04:44+00:00 - - http://activitystrea.ms/schema/1.0/person - https://pleroma.soykaf.com/users/lain - lain - Test account - - - - - - lain - Lain Iwakura - Test account - - - - http://activitystrea.ms/schema/1.0/note - https://pleroma.soykaf.com/objects/4c1bda26-902e-4525-9fcd-b9fd44925193 - New note by lain - Added returning the entries as xml... let's see if the mastodon hammering stops now. - - - - - https://pleroma.soykaf.com/contexts/ede39a2b-7cf3-4fa4-8ccd-cb97431bcc22 - - - https://pleroma.soykaf.com/users/lain/feed.atom - Lain Iwakura - - - https://social.heldscal.la/avatar/43188-96-20170429172422.jpeg - 2017-05-03T08:04:44+00:00 - - - - https://pleroma.soykaf.com/contexts/ede39a2b-7cf3-4fa4-8ccd-cb97431bcc22 - - - - - - diff --git a/test/fixtures/share.xml b/test/fixtures/share.xml deleted file mode 100644 index e07b88680..000000000 --- a/test/fixtures/share.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - tag:mastodon.social,2017-05-03:objectId=4934452:objectType=Status - 2017-05-03T08:21:09Z - 2017-05-03T08:21:09Z - lambadalambda shared a status by lain@pleroma.soykaf.com - - https://mastodon.social/users/lambadalambda - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/lambadalambda - lambadalambda - lambadalambda@mastodon.social - - - - lambadalambda - Critical Value - public - - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - https://pleroma.soykaf.com/objects/4c1bda26-902e-4525-9fcd-b9fd44925193 - 2017-05-03T08:04:44Z - 2017-05-03T08:05:52Z - New status by lain@pleroma.soykaf.com - - https://pleroma.soykaf.com/users/lain - http://activitystrea.ms/schema/1.0/person - https://pleroma.soykaf.com/users/lain - lain - lain@pleroma.soykaf.com - Test account - - - - lain - Lain Iwakura - Test account - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - Added returning the entries as xml... let's see if the mastodon hammering stops now. - - public - - - Added returning the entries as xml... let's see if the mastodon hammering stops now. - - public - - - diff --git a/test/fixtures/tesla_mock/7369654.atom b/test/fixtures/tesla_mock/7369654.atom deleted file mode 100644 index 74fd9ce6b..000000000 --- a/test/fixtures/tesla_mock/7369654.atom +++ /dev/null @@ -1,44 +0,0 @@ - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2018-02-22:noticeId=7369654:objectType=comment - New comment by shpuld - @<a href="https://testing.pleroma.lol/users/lain" class="h-card mention" title="Rael Electric Razor">lain</a> me far right - - - http://activitystrea.ms/schema/1.0/post - 2018-02-22T09:20:12+00:00 - 2018-02-22T09:20:12+00:00 - - http://activitystrea.ms/schema/1.0/person - https://shitposter.club/user/5381 - shpuld - - - - - - shpuld - shp - - - - - - - tag:shitposter.club,2018-02-22:objectType=thread:nonce=e5a7c72d60a9c0e4 - - - - https://shitposter.club/api/statuses/user_timeline/5381.atom - shp - - - - https://shitposter.club/avatar/5381-96-20171230093854.png - 2018-02-23T13:30:15+00:00 - - - - - diff --git a/test/fixtures/tesla_mock/atarifrosch_feed.xml b/test/fixtures/tesla_mock/atarifrosch_feed.xml deleted file mode 100644 index e00df782e..000000000 --- a/test/fixtures/tesla_mock/atarifrosch_feed.xml +++ /dev/null @@ -1,473 +0,0 @@ - - - GNU social - https://social.stopwatchingus-heidelberg.de/api/statuses/user_timeline/18330.atom - atarifrosch-Zeitleiste - Aktualisierungen von atarifrosch auf social.stopwatchingus-heidelberg.de! - https://social.stopwatchingus-heidelberg.de/avatar/18330-96-20150628163706.png - 2017-08-24T12:06:55+02:00 - - http://activitystrea.ms/schema/1.0/person - https://social.stopwatchingus-heidelberg.de/user/18330 - atarifrosch - Nerd, Pirat, Debian user, CAcert assurer, Geocacher, Freifunker. Autismus/Depression, agender. GnuPG Key-ID: 0xBCF81ADE - - - - - - atarifrosch - Atari-Frosch - Nerd, Pirat, Debian user, CAcert assurer, Geocacher, Freifunker. Autismus/Depression, agender. GnuPG Key-ID: 0xBCF81ADE - - Düsseldorf, NRW, Germany - - - homepage - https://www.atari-frosch.de/ - true - - - - - - - - - - - - - - tag:social.stopwatchingus-heidelberg.de,2017-08-24:noticeId=978735:objectType=note - atarifrosch repeated a notice by hoergen - RT @<a href="https://social.hoergen.org/hoergen" class="h-card mention" title="hoergen">hoergen</a> Das falsche Bild der Tagesschau &quot;Auffallend &quot;erfolgreich&quot; - Andrea Nahles und Manuela Schwesig&quot; #<span class="tag"><a href="https://social.stopwatchingus-heidelberg.de/tag/geringverdiener" rel="tag">Geringverdiener</a></span> #<span class="tag"><a href="https://social.stopwatchingus-heidelberg.de/tag/mindestlohn" rel="tag">Mindestlohn</a></span> #<span class="tag"><a href="https://social.stopwatchingus-heidelberg.de/tag/mannxismus" rel="tag">mannxismus</a></span> #<span class="tag"><a href="https://social.stopwatchingus-heidelberg.de/tag/erwerbsminderungsrente" rel="tag">Erwerbsminderungsrente</a></span> #<span class="tag"><a href="https://social.stopwatchingus-heidelberg.de/tag/arbeitnehmerflexibilisierung" rel="tag">ArbeitnehmerFlexibilisierung</a></span> #<span class="tag"><a href="https://social.stopwatchingus-heidelberg.de/tag/altersarmut" rel="tag">AltersArmut</a></span> ..... <a href="http://www.tagesschau.de/inland/btw17/bilanz-schwesig-nahles-101.html" title="http://www.tagesschau.de/inland/btw17/bilanz-schwesig-nahles-101.html" class="attachment" id="attachment-450858" rel="nofollow external">http://www.tagesschau.de/inland/btw17/bilanz-schwesig-nahles-101.html</a> - https://social.stopwatchingus-heidelberg.de/notice/978735 - http://activitystrea.ms/schema/1.0/share - 2017-08-24T09:18:25+00:00 - 2017-08-24T09:18:25+00:00 - - http://activitystrea.ms/schema/1.0/activity - tag:social.hoergen.org,2017-08-24:noticeId=222320:objectType=note - - Das falsche Bild der Tagesschau <br /> &quot;Auffallend &quot;erfolgreich&quot; - Andrea Nahles und Manuela Schwesig&quot; #<span class="tag"><a href="https://social.hoergen.org/tag/geringverdiener" rel="tag">Geringverdiener</a></span> #<span class="tag"><a href="https://social.hoergen.org/tag/mindestlohn" rel="tag">Mindestlohn</a></span> #<span class="tag"><a href="https://social.hoergen.org/tag/mannxismus" rel="tag">mannxismus</a></span> #<span class="tag"><a href="https://social.hoergen.org/tag/erwerbsminderungsrente" rel="tag">Erwerbsminderungsrente</a></span> #<span class="tag"><a href="https://social.hoergen.org/tag/arbeitnehmerflexibilisierung" rel="tag">ArbeitnehmerFlexibilisierung</a></span> #<span class="tag"><a href="https://social.hoergen.org/tag/altersarmut" rel="tag">AltersArmut</a></span> ..... <br /> <br /> <a href="http://www.tagesschau.de/inland/btw17/bilanz-schwesig-nahles-101.html" title="http://www.tagesschau.de/inland/btw17/bilanz-schwesig-nahles-101.html" rel="nofollow external noreferrer" class="attachment">http://www.tagesschau.de/inland/btw17/bilanz-schwesig-nahles-101.html</a> - https://social.hoergen.org/notice/222320 - http://activitystrea.ms/schema/1.0/post - 2017-08-24T07:36:31+00:00 - 2017-08-24T07:36:31+00:00 - - http://activitystrea.ms/schema/1.0/person - https://social.hoergen.org/user/2 - hoergen - aka Andi Memyself #humanist #nerd Menschen liebhabender Misanthrop und auch sonst sehr vielseitig interessiert. - - - - - - hoergen - hoergen - aka Andi Memyself #humanist #nerd Menschen liebhabender Misanthrop und auch sonst sehr vielseitig interessiert. - - Berlin - - - homepage - https://hyperblog.de/hoergen/ - true - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.hoergen.org,2017-08-24:noticeId=222320:objectType=note - New note by hoergen - Das falsche Bild der Tagesschau <br /> &quot;Auffallend &quot;erfolgreich&quot; - Andrea Nahles und Manuela Schwesig&quot; #<span class="tag"><a href="https://social.hoergen.org/tag/geringverdiener" rel="tag">Geringverdiener</a></span> #<span class="tag"><a href="https://social.hoergen.org/tag/mindestlohn" rel="tag">Mindestlohn</a></span> #<span class="tag"><a href="https://social.hoergen.org/tag/mannxismus" rel="tag">mannxismus</a></span> #<span class="tag"><a href="https://social.hoergen.org/tag/erwerbsminderungsrente" rel="tag">Erwerbsminderungsrente</a></span> #<span class="tag"><a href="https://social.hoergen.org/tag/arbeitnehmerflexibilisierung" rel="tag">ArbeitnehmerFlexibilisierung</a></span> #<span class="tag"><a href="https://social.hoergen.org/tag/altersarmut" rel="tag">AltersArmut</a></span> ..... <br /> <br /> <a href="http://www.tagesschau.de/inland/btw17/bilanz-schwesig-nahles-101.html" title="http://www.tagesschau.de/inland/btw17/bilanz-schwesig-nahles-101.html" rel="nofollow external noreferrer" class="attachment">http://www.tagesschau.de/inland/btw17/bilanz-schwesig-nahles-101.html</a> - - - - - https://social.hoergen.org/conversation/98616 - - - - - - - - - https://social.hoergen.org/api/statuses/user_timeline/2.atom - hoergen - - - https://social.stopwatchingus-heidelberg.de/avatar/54316-original-20170824072526.jpeg - 2017-08-24T09:48:30+00:00 - - - - https://social.hoergen.org/conversation/98616 - - - - - - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:social.stopwatchingus-heidelberg.de,2017-08-24:noticeId=978734:objectType=comment - New comment by atarifrosch - Jo, die Anzahl der Hartz-IV-Sanktionen nennt sie genausowenig wie die Anzahl der Menschen, die von den Repressionsbehörden in Obdachlosigkeit und Suizid getrieben wurden. Das würde die Erfolgszahlen dann doch ein wenig trüben, nech? - - - http://activitystrea.ms/schema/1.0/post - 2017-08-24T09:18:13+00:00 - 2017-08-24T09:18:13+00:00 - - - - https://social.hoergen.org/conversation/98616 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.stopwatchingus-heidelberg.de,2017-08-24:noticeId=978732:objectType=note - New note by atarifrosch - Moin-quak. - - - http://activitystrea.ms/schema/1.0/post - 2017-08-24T09:09:39+00:00 - 2017-08-24T09:09:39+00:00 - - tag:social.stopwatchingus-heidelberg.de,2017-08-24:noticeId=978732:objectType=thread:crc32=2f92b7b6 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.stopwatchingus-heidelberg.de,2017-08-23:noticeId=978594:objectType=note - New note by atarifrosch - n8-quak! - - - http://activitystrea.ms/schema/1.0/post - 2017-08-23T21:39:54+00:00 - 2017-08-23T21:39:54+00:00 - - tag:social.stopwatchingus-heidelberg.de,2017-08-23:noticeId=978594:objectType=thread:crc32=9bdb0ac9 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.stopwatchingus-heidelberg.de,2017-08-23:noticeId=978503:objectType=note - New note by atarifrosch - 2017-08-16 Michal Špaček: Post a boarding pass on Facebook, get your account stolen – Post a boarding pass on Facebook, get your account stolen (gilt übrinx nicht nur für Facebook) - - - http://activitystrea.ms/schema/1.0/post - 2017-08-23T15:14:29+00:00 - 2017-08-23T15:14:29+00:00 - - tag:social.stopwatchingus-heidelberg.de,2017-08-23:noticeId=978503:objectType=thread:crc32=3de05c3a - - - - - - - tag:social.stopwatchingus-heidelberg.de,2017-08-23:fave:18330:activity:978458:2017-08-23T15:18:19+02:00 - Favorite - atarifrosch favorited something by einebiene: Haha, große Überraschung. <a href="http://www.sueddeutsche.de/wirtschaft/abgasaffaere-software-updates-fuer-dieselautos-helfen-kaum-1.3637636" title="http://www.sueddeutsche.de/wirtschaft/abgasaffaere-software-updates-fuer-dieselautos-helfen-kaum-1.3637636" rel="nofollow noreferrer" class="attachment">https://quitter.is/url/1122672</a><br /> Was ich an all diesen Artikeln schade finde, ist, daß immer nur auf den Umstieg von Auto zu anderem Auto gesprochen wird. Öffis werden nicht erwähnt, Carsharing nicht, radeln nicht, und in der Stadt wäre ne Vespa auch deutlich besser als ein SUV. - http://activitystrea.ms/schema/1.0/favorite - 2017-08-23T13:18:19+00:00 - 2017-08-23T13:18:19+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:quitter.is,2017-08-23:noticeId=4032910:objectType=note - New note by einebiene - Haha, große Überraschung. <a href="http://www.sueddeutsche.de/wirtschaft/abgasaffaere-software-updates-fuer-dieselautos-helfen-kaum-1.3637636" title="http://www.sueddeutsche.de/wirtschaft/abgasaffaere-software-updates-fuer-dieselautos-helfen-kaum-1.3637636" rel="nofollow noreferrer" class="attachment">https://quitter.is/url/1122672</a><br /> Was ich an all diesen Artikeln schade finde, ist, daß immer nur auf den Umstieg von Auto zu anderem Auto gesprochen wird. Öffis werden nicht erwähnt, Carsharing nicht, radeln nicht, und in der Stadt wäre ne Vespa auch deutlich besser als ein SUV. - - - - - - - https://quitter.is/conversation/2535246 - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.stopwatchingus-heidelberg.de,2017-08-23:noticeId=978402:objectType=note - New note by atarifrosch - moin-quak - - - http://activitystrea.ms/schema/1.0/post - 2017-08-23T10:57:26+00:00 - 2017-08-23T10:57:26+00:00 - - tag:social.stopwatchingus-heidelberg.de,2017-08-23:noticeId=978402:objectType=thread:crc32=7050c397 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.stopwatchingus-heidelberg.de,2017-08-22:noticeId=978164:objectType=note - New note by atarifrosch - n8-quak - - - http://activitystrea.ms/schema/1.0/post - 2017-08-22T19:54:30+00:00 - 2017-08-22T19:54:30+00:00 - - tag:social.stopwatchingus-heidelberg.de,2017-08-22:noticeId=978164:objectType=thread:crc32=b0a209c7 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.stopwatchingus-heidelberg.de,2017-08-22:noticeId=978072:objectType=note - New note by atarifrosch - 2017-08-22 Bundesverfassungsgericht: Erfolgreiche Verfassungsbeschwerde gegen die Versagung vorläufiger Leistungen für Kosten der Unterkunft und Heizung – <a href="https://www.bundesverfassungsgericht.de/SharedDocs/Pressemitteilungen/DE/2017/bvg17-072.html" title="https://www.bundesverfassungsgericht.de/SharedDocs/Pressemitteilungen/DE/2017/bvg17-072.html" class="attachment" id="attachment-450768" rel="nofollow external">https://www.bundesverfassungsgericht.de/SharedDocs/Pressemitteilungen/DE/2017/bvg17-072.html</a> !<a href="http://quitter.se/group/2184/id" class="h-card group" title="HartzIV (hartziv)">hartziv</a> - - - http://activitystrea.ms/schema/1.0/post - 2017-08-22T12:00:21+00:00 - 2017-08-22T12:00:21+00:00 - - tag:social.stopwatchingus-heidelberg.de,2017-08-22:noticeId=978072:objectType=thread:crc32=28a35f44 - - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.stopwatchingus-heidelberg.de,2017-08-22:noticeId=978042:objectType=note - New note by atarifrosch - moin-quak! - - - http://activitystrea.ms/schema/1.0/post - 2017-08-22T07:55:27+00:00 - 2017-08-22T07:55:27+00:00 - - tag:social.stopwatchingus-heidelberg.de,2017-08-22:noticeId=978042:objectType=thread:crc32=f070a9f7 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.stopwatchingus-heidelberg.de,2017-08-21:noticeId=977914:objectType=note - New note by atarifrosch - So, morgen geht's weiter. n8-quak! - - - http://activitystrea.ms/schema/1.0/post - 2017-08-21T22:09:53+00:00 - 2017-08-21T22:09:53+00:00 - - tag:social.stopwatchingus-heidelberg.de,2017-08-21:noticeId=977914:objectType=thread:crc32=c0a9f7fa - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.stopwatchingus-heidelberg.de,2017-08-21:noticeId=977710:objectType=note - New note by atarifrosch - moin-quak. - - - http://activitystrea.ms/schema/1.0/post - 2017-08-21T08:58:26+00:00 - 2017-08-21T08:58:26+00:00 - - tag:social.stopwatchingus-heidelberg.de,2017-08-21:noticeId=977710:objectType=thread:crc32=60cfb466 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.stopwatchingus-heidelberg.de,2017-08-20:noticeId=977526:objectType=note - New note by atarifrosch - Meine Augen meinen, für heute sei es genug. Nun denn. n8-quak. - - - http://activitystrea.ms/schema/1.0/post - 2017-08-20T19:58:16+00:00 - 2017-08-20T19:58:16+00:00 - - tag:social.stopwatchingus-heidelberg.de,2017-08-20:noticeId=977526:objectType=thread:crc32=ce79634 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.stopwatchingus-heidelberg.de,2017-08-20:noticeId=977369:objectType=note - New note by atarifrosch - [Blog] Im Netz aufgefischt #<span class="tag"><a href="https://social.stopwatchingus-heidelberg.de/tag/330" rel="tag">330</a></span> – <a href="https://blog.atari-frosch.de/2017/08/20/im-netz-aufgefischt-330/" title="https://blog.atari-frosch.de/2017/08/20/im-netz-aufgefischt-330/" class="attachment" id="attachment-450668" rel="nofollow external">https://blog.atari-frosch.de/2017/08/20/im-netz-aufgefischt-330/</a> (was ich diese Woche so gelesen habe) - - - http://activitystrea.ms/schema/1.0/post - 2017-08-20T09:14:07+00:00 - 2017-08-20T09:14:07+00:00 - - tag:social.stopwatchingus-heidelberg.de,2017-08-20:noticeId=977369:objectType=thread:crc32=2f800b86 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.stopwatchingus-heidelberg.de,2017-08-19:noticeId=977268:objectType=note - New note by atarifrosch - Fast ständig husten müssen ist echt anstrengend … naja, n8-quak. - - - http://activitystrea.ms/schema/1.0/post - 2017-08-19T21:59:20+00:00 - 2017-08-19T21:59:20+00:00 - - tag:social.stopwatchingus-heidelberg.de,2017-08-19:noticeId=977268:objectType=thread:crc32=deda767a - - - - - - - tag:social.stopwatchingus-heidelberg.de,2017-08-19:fave:18330:activity:977146:2017-08-19T21:39:26+02:00 - Favorite - atarifrosch favorited something by einebienezwo: Ich mach gerade Kompetenztraining.<br /> Ich trainiere die Kompetenz, eine halb aufgegessene Gummibärchentüte nicht ganz aufzuessen. - http://activitystrea.ms/schema/1.0/favorite - 2017-08-19T19:39:26+00:00 - 2017-08-19T19:39:26+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:gnusocial.de,2017-08-19:noticeId=11011264:objectType=note - New note by einebienezwo - Ich mach gerade Kompetenztraining.<br /> Ich trainiere die Kompetenz, eine halb aufgegessene Gummibärchentüte nicht ganz aufzuessen. - - - - - - - https://gnusocial.de/conversation/9363945 - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:social.stopwatchingus-heidelberg.de,2017-08-19:noticeId=977242:objectType=comment - New comment by atarifrosch - Wir hatten hier schon Ordnungsdienst auf'm Radweg. Fotografisch dokumentiert (nicht von mir, Bekannter hatte es gesehen). Da hatte grad 'ne Pizzeria neu eröffnet … - - - http://activitystrea.ms/schema/1.0/post - 2017-08-19T19:38:53+00:00 - 2017-08-19T19:38:53+00:00 - - - - https://gnusocial.de/conversation/9363813 - - - - - - - - tag:social.stopwatchingus-heidelberg.de,2017-08-19:fave:18330:activity:977180:2017-08-19T21:37:36+02:00 - Favorite - atarifrosch favorited something by jcaktiv: BTW Hallo zusammen &lt;3, wo ich schon mal wieder hier bin - http://activitystrea.ms/schema/1.0/favorite - 2017-08-19T19:37:36+00:00 - 2017-08-19T19:37:36+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:quitter.se,2017-08-19:noticeId=17372467:objectType=note - New note by jcaktiv - BTW Hallo zusammen &lt;3, wo ich schon mal wieder hier bin - - - - - - - tag:quitter.se,2017-08-19:objectType=thread:nonce=46c1c433d88aaa9f - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:social.stopwatchingus-heidelberg.de,2017-08-19:noticeId=976985:objectType=comment - New comment by atarifrosch - Jo, oder einfach mal nachfragen, so als Realitätsabgleich. - - - http://activitystrea.ms/schema/1.0/post - 2017-08-19T10:34:50+00:00 - 2017-08-19T10:34:50+00:00 - - - - https://gnusocial.de/conversation/9362516 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.stopwatchingus-heidelberg.de,2017-08-19:noticeId=976983:objectType=note - New note by atarifrosch - Schöne Alternative zu mit Werbung überladenen kommerziellen Anbietern: <a href="http://ifconfig.at/" title="http://ifconfig.at/" class="attachment" id="attachment-450636" rel="nofollow external">http://ifconfig.at/</a> – eigene IP, Hostname etc. abfragen, mit curl dann auch in Textform zur lokalen Weiterverarbeitung in Scripten etc. Leider (noch?) kein https. - - - http://activitystrea.ms/schema/1.0/post - 2017-08-19T10:33:04+00:00 - 2017-08-19T10:33:04+00:00 - - tag:social.stopwatchingus-heidelberg.de,2017-08-19:noticeId=976983:objectType=thread:crc32=4a3593c0 - - - - - - diff --git a/test/fixtures/tesla_mock/emelie.atom b/test/fixtures/tesla_mock/emelie.atom deleted file mode 100644 index ddaa1c6ca..000000000 --- a/test/fixtures/tesla_mock/emelie.atom +++ /dev/null @@ -1,306 +0,0 @@ - - - https://mastodon.social/users/emelie.atom - emelie 🎨 - 23 / #Sweden / #Artist / #Equestrian / #GameDev - -If I ain't spending time with my pets, I'm probably drawing. 🐴 🐱 🐰 - 2019-02-04T20:22:19Z - https://files.mastodon.social/accounts/avatars/000/015/657/original/e7163f98280da1a4.png - - https://mastodon.social/users/emelie - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/emelie - emelie - emelie@mastodon.social - <p>23 / <a href="https://mastodon.social/tags/sweden" class="mention hashtag" rel="tag">#<span>Sweden</span></a> / <a href="https://mastodon.social/tags/artist" class="mention hashtag" rel="tag">#<span>Artist</span></a> / <a href="https://mastodon.social/tags/equestrian" class="mention hashtag" rel="tag">#<span>Equestrian</span></a> / <a href="https://mastodon.social/tags/gamedev" class="mention hashtag" rel="tag">#<span>GameDev</span></a></p><p>If I ain&apos;t spending time with my pets, I&apos;m probably drawing. 🐴 🐱 🐰</p> - - - - emelie - emelie 🎨 - 23 / #Sweden / #Artist / #Equestrian / #GameDev - -If I ain't spending time with my pets, I'm probably drawing. 🐴 🐱 🐰 - public - - - - - - - https://mastodon.social/users/emelie/statuses/101850331907006641 - 2019-04-01T09:58:50Z - 2019-04-01T09:58:50Z - New status by emelie - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - <p>Me: I&apos;m going to make this vital change to my world building in the morning, no way I&apos;ll forget this, it&apos;s too big of a deal<br />Also me: forgets</p> - - public - - - - - - https://mastodon.social/users/emelie/statuses/101849626603073336 - 2019-04-01T06:59:28Z - 2019-04-01T06:59:28Z - New status by emelie - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - - <p><span class="h-card"><a href="https://mastodon.social/@Fergant" class="u-url mention">@<span>Fergant</span></a></span> Dom är i stort sett religiös skrift vid det här laget 👏👏</p><p>har dock bara läst svenska översättningen, kanske är dags att jag läser dom på engelska</p> - - - public - - - - - - - https://mastodon.social/users/emelie/statuses/101849580030237068 - 2019-04-01T06:47:37Z - 2019-04-01T06:47:37Z - New status by emelie - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - <p>What&apos;s you people&apos;s favourite fantasy books? Give me some hot tips 🌞</p> - - public - - - - - - https://mastodon.social/users/emelie/statuses/101849550599949363 - 2019-04-01T06:40:08Z - 2019-04-01T06:40:08Z - New status by emelie - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - <p>Stick them legs out 💃 <a href="https://mastodon.social/tags/mastocats" class="mention hashtag" rel="tag">#<span>mastocats</span></a></p> - - - - public - - - - - - https://mastodon.social/users/emelie/statuses/101849191533152720 - 2019-04-01T05:08:49Z - 2019-04-01T05:08:49Z - New status by emelie - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - <p>long 🐱 <a href="https://mastodon.social/tags/mastocats" class="mention hashtag" rel="tag">#<span>mastocats</span></a></p> - - - - public - - - - - - https://mastodon.social/users/emelie/statuses/101849165031453009 - 2019-04-01T05:02:05Z - 2019-04-01T05:02:05Z - New status by emelie - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - <p>You gotta take whatever bellyrubbing opportunity you can get before she changes her mind 🦁 <a href="https://mastodon.social/tags/mastocats" class="mention hashtag" rel="tag">#<span>mastocats</span></a></p> - - - - public - - - - - - https://mastodon.social/users/emelie/statuses/101846512530748693 - 2019-03-31T17:47:31Z - 2019-03-31T17:47:31Z - New status by emelie - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - <p>Hello look at this boy having a decent haircut for once <a href="https://mastodon.social/tags/mastohorses" class="mention hashtag" rel="tag">#<span>mastohorses</span></a> <a href="https://mastodon.social/tags/equestrian" class="mention hashtag" rel="tag">#<span>equestrian</span></a></p> - - - - - public - - - - - - https://mastodon.social/users/emelie/statuses/101846181093805500 - 2019-03-31T16:23:14Z - 2019-03-31T16:23:14Z - New status by emelie - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - <p>Sorry did I disturb the who-is-the-longest-cat competition ? <a href="https://mastodon.social/tags/mastocats" class="mention hashtag" rel="tag">#<span>mastocats</span></a></p> - - - - public - - - - - - https://mastodon.social/users/emelie/statuses/101845897513133849 - 2019-03-31T15:11:07Z - 2019-03-31T15:11:07Z - New status by emelie - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - more earthsea ramblings - <p>I&apos;m re-watching Tales from Earthsea for the first time since I read the books, and that Therru doesn&apos;t squash Cob like a spider, as Orm Embar did is a wasted opportunity tbh</p> - - public - - - - - - https://mastodon.social/users/emelie/statuses/101841219051533307 - 2019-03-30T19:21:19Z - 2019-03-30T19:21:19Z - New status by emelie - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - <p>I gave my cats some mackerel and they ate it all in 0.3 seconds, and now they won&apos;t stop meowing for more, and I&apos;m tired plz shut up</p> - - public - - - - - - https://mastodon.social/users/emelie/statuses/101839949762341381 - 2019-03-30T13:58:31Z - 2019-03-30T13:58:31Z - New status by emelie - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - - <p>yet I&apos;m confused about this american dude with a gun, like the heck r ya doin in mah ghibli</p> - - public - - - - - - - https://mastodon.social/users/emelie/statuses/101839928677863590 - 2019-03-30T13:53:09Z - 2019-03-30T13:53:09Z - New status by emelie - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - <p>2 hours into Ni no Kuni 2 and I&apos;ve already sold my soul to this game</p> - - public - - - - - - https://mastodon.social/users/emelie/statuses/101836329521599438 - 2019-03-29T22:37:51Z - 2019-03-29T22:37:51Z - New status by emelie - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - <p>Pippi Longstocking the original one-punch /man</p> - - public - - - - - - https://mastodon.social/users/emelie/statuses/101835905282948341 - 2019-03-29T20:49:57Z - 2019-03-29T20:49:57Z - New status by emelie - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - <p>I&apos;ve had so much wine I thought I had a 3rd brother</p> - - public - - - - - - https://mastodon.social/users/emelie/statuses/101835878059204660 - 2019-03-29T20:43:02Z - 2019-03-29T20:43:02Z - New status by emelie - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - - <p>ååååhhh booi</p> - - public - - - - - - https://mastodon.social/users/emelie/statuses/101835848050598939 - 2019-03-29T20:35:24Z - 2019-03-29T20:35:24Z - New status by emelie - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - - <p><span class="h-card"><a href="https://thraeryn.net/@thraeryn" class="u-url mention">@<span>thraeryn</span></a></span> if I spent 1 hour and a half watching this monstrosity, I need to</p> - - - public - - - - - - - https://mastodon.social/users/emelie/statuses/101835823138262290 - 2019-03-29T20:29:04Z - 2019-03-29T20:29:04Z - New status by emelie - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - - medical, fluids mention - <p><span class="h-card"><a href="https://icosahedron.website/@Trev" class="u-url mention">@<span>Trev</span></a></span> *hugs* ✨</p> - - - public - - - - - - diff --git a/test/fixtures/tesla_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml b/test/fixtures/tesla_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml deleted file mode 100644 index 490467708..000000000 --- a/test/fixtures/tesla_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml +++ /dev/null @@ -1,460 +0,0 @@ - - - GNU social - http://gs.example.org/index.php/api/statuses/user_timeline/1.atom - lambda timeline - Updates from lambda on gs.example.org! - http://gs.example.org/theme/neo-gnu/default-avatar-profile.png - 2017-05-05T12:09:57+00:00 - - http://activitystrea.ms/schema/1.0/person - http://gs.example.org:4040/index.php/user/1 - lambda - - - - - lambda - lambda - - - - - - - - - - - - - tag:gs.example.org,2017-05-04:noticeId=84:objectType=note - lambda repeated a notice by lambda2 - RT @<a href="http://gs.example.org/index.php/user/7" class="h-card mention">lambda2</a> Hello! - - http://activitystrea.ms/schema/1.0/share - 2017-05-04T16:38:50+00:00 - 2017-05-04T16:38:50+00:00 - - http://activitystrea.ms/schema/1.0/activity - tag:gs.example.org,2017-05-01:noticeId=67:objectType=note - - Hello! - - http://activitystrea.ms/schema/1.0/post - 2017-05-01T08:41:04+00:00 - 2017-05-01T08:41:04+00:00 - - http://activitystrea.ms/schema/1.0/person - http://gs.example.org/index.php/user/7 - lambda2 - - - - - - lambda2 - lambda2 - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org,2017-05-01:noticeId=67:objectType=note - New note by lambda2 - Hello! - - - - - tag:gs.example.org,2017-05-01:objectType=thread:nonce=cffa792cb95fe417 - - - http://gs.example.org/index.php/api/statuses/user_timeline/7.atom - lambda2 - - - - http://gs.example.org/avatar/7-96-20170501084054.png - 2017-05-01T16:33:10+00:00 - - - - - - tag:gs.example.org,2017-05-01:objectType=thread:nonce=cffa792cb95fe417 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org,2017-04-30:noticeId=63:objectType=note - New note by lambda - what now? - - - http://activitystrea.ms/schema/1.0/post - 2017-04-30T10:09:57+00:00 - 2017-04-30T10:09:57+00:00 - - - - tag:gs.example.org,2017-04-30:objectType=thread:nonce=1bbb60991ae9874b - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org,2017-04-30:noticeId=61:objectType=note - New note by lambda - @<a href="http://pleroma.example.org:4000/users/lain5" class="h-card mention">lain5</a> Hello! - - - http://activitystrea.ms/schema/1.0/post - 2017-04-30T10:07:26+00:00 - 2017-04-30T10:07:26+00:00 - - tag:gs.example.org,2017-04-30:objectType=thread:nonce=1bbb60991ae9874b - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org,2017-04-29:noticeId=59:objectType=note - New note by lambda - ey - - - http://activitystrea.ms/schema/1.0/post - 2017-04-29T17:04:59+00:00 - 2017-04-29T17:04:59+00:00 - - tag:gs.example.org,2017-04-29:objectType=thread:nonce=4cc42c2c61a0f4bd - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org,2017-04-29:noticeId=58:objectType=note - New note by lambda - Another one. - - - http://activitystrea.ms/schema/1.0/post - 2017-04-29T17:02:47+00:00 - 2017-04-29T17:02:47+00:00 - - tag:gs.example.org,2017-04-29:objectType=thread:nonce=53e9b8f1d6d38d13 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org,2017-04-29:noticeId=57:objectType=note - New note by lambda - Let's see if this comes over. - - - http://activitystrea.ms/schema/1.0/post - 2017-04-29T17:01:39+00:00 - 2017-04-29T17:01:39+00:00 - - tag:gs.example.org,2017-04-29:objectType=thread:nonce=238a7bd3ffc7c9cc - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org,2017-04-29:noticeId=56:objectType=note - New note by lambda - @<a href="http://pleroma.example.org:4000/users/lain5" class="h-card mention">lain5</a> Hey! - - - http://activitystrea.ms/schema/1.0/post - 2017-04-29T16:38:13+00:00 - 2017-04-29T16:38:13+00:00 - - tag:gs.example.org,2017-04-29:objectType=thread:nonce=2629d3a398171b0f - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org:4040,2017-04-25:noticeId=55:objectType=note - New note by lambda - hey. - - - http://activitystrea.ms/schema/1.0/post - 2017-04-25T18:16:13+00:00 - 2017-04-25T18:16:13+00:00 - - - - http://pleroma.example.org:4000/contexts/8f6f45d4-8e4d-4e1a-a2de-09f27367d2d0 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org:4040,2017-04-25:noticeId=53:objectType=note - New note by lambda - and this? - - - http://activitystrea.ms/schema/1.0/post - 2017-04-25T18:14:34+00:00 - 2017-04-25T18:14:34+00:00 - - - - http://pleroma.example.org:4000/contexts/24779b0e-91ad-487e-81bd-6cf5bb437b09 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org:4040,2017-04-25:noticeId=52:objectType=note - New note by lambda - yeah it does :) - - - http://activitystrea.ms/schema/1.0/post - 2017-04-25T18:13:31+00:00 - 2017-04-25T18:13:31+00:00 - - - - tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=e0dc24b1a93ab6b3 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org:4040,2017-04-25:noticeId=50:objectType=note - New note by lambda - @<a href="http://pleroma.example.org:4000/users/lain5" class="h-card mention">lain5</a> Let's try with one that originates here! - - - http://activitystrea.ms/schema/1.0/post - 2017-04-25T18:10:28+00:00 - 2017-04-25T18:10:28+00:00 - - tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=e0dc24b1a93ab6b3 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org:4040,2017-04-25:noticeId=48:objectType=note - New note by lambda - works? - - - http://activitystrea.ms/schema/1.0/post - 2017-04-25T18:08:44+00:00 - 2017-04-25T18:08:44+00:00 - - - - http://pleroma.example.org:4000/contexts/24779b0e-91ad-487e-81bd-6cf5bb437b09 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org:4040,2017-04-25:noticeId=46:objectType=note - New note by lambda - Let's send you an answer. - - - http://activitystrea.ms/schema/1.0/post - 2017-04-25T18:05:31+00:00 - 2017-04-25T18:05:31+00:00 - - - - tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=73c7bcf6658f7ce3 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org:4040,2017-04-25:noticeId=44:objectType=note - New note by lambda - Hey. - - - http://activitystrea.ms/schema/1.0/post - 2017-04-25T18:01:09+00:00 - 2017-04-25T18:01:09+00:00 - - - - tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=6e7c8fc2823380b4 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org:4040,2017-04-25:noticeId=43:objectType=note - New note by lambda - What's coming to you? - - - http://activitystrea.ms/schema/1.0/post - 2017-04-25T17:58:41+00:00 - 2017-04-25T17:58:41+00:00 - - - - tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=6e7c8fc2823380b4 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org:4040,2017-04-25:noticeId=42:objectType=note - New note by lambda - Now this is podracing. - - - http://activitystrea.ms/schema/1.0/post - 2017-04-25T17:57:40+00:00 - 2017-04-25T17:57:40+00:00 - - - - tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=6e7c8fc2823380b4 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org:4040,2017-04-25:noticeId=39:objectType=note - New note by lambda - Sure looks like it! - - - http://activitystrea.ms/schema/1.0/post - 2017-04-25T17:48:27+00:00 - 2017-04-25T17:48:27+00:00 - - - - tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=4c6114a75bb4cea5 - - - - - - - - tag:gs.example.org:4040,2017-04-25:subscription:1:person:6:2017-04-25T17:47:47+00:00 - lambda (lambda)'s status on Tuesday, 25-Apr-2017 17:47:47 UTC - <a href="http://gs.example.org:4040/index.php/lambda">lambda</a> started following <a href="http://pleroma.example.org:4000/users/lain5">l</a>. - - http://activitystrea.ms/schema/1.0/follow - 2017-04-25T17:47:47+00:00 - 2017-04-25T17:47:47+00:00 - - http://activitystrea.ms/schema/1.0/person - http://pleroma.example.org:4000/users/lain5 - l - lambadalambda - - - - - - lain5 - l - lambadalambda - - - tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=119acad17515314c - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org:4040,2017-04-25:noticeId=36:objectType=note - New note by lambda - @<a href="http://pleroma.example.org:4000/users/lain5" class="h-card mention">lain5</a> Hey, how are you? - - - http://activitystrea.ms/schema/1.0/post - 2017-04-25T17:46:22+00:00 - 2017-04-25T17:46:22+00:00 - - tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=9c5ec19a18191372 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.example.org:4040,2017-04-25:noticeId=35:objectType=note - New note by lambda - @lain5@pleroma.example.org does this not work? - - - http://activitystrea.ms/schema/1.0/post - 2017-04-25T17:42:31+00:00 - 2017-04-25T17:42:31+00:00 - - tag:gs.example.org:4040,2017-04-25:objectType=thread:nonce=fc841d7f52caa363 - - - - - - diff --git a/test/fixtures/tesla_mock/https___mamot.fr_users_Skruyb.atom b/test/fixtures/tesla_mock/https___mamot.fr_users_Skruyb.atom deleted file mode 100644 index b5f3d923b..000000000 --- a/test/fixtures/tesla_mock/https___mamot.fr_users_Skruyb.atom +++ /dev/null @@ -1,342 +0,0 @@ - - - https://mamot.fr/users/Skruyb.atom - The 7th Son - Fr and En. -Posts will disappear on a regular basis. - 2017-04-28T13:54:23Z - https://mamot.fr/system/accounts/avatars/000/026/213/original/d95dbcfc76f77f4c.jpg?1493230984 - - https://mamot.fr/users/Skruyb - http://activitystrea.ms/schema/1.0/person - https://mamot.fr/users/Skruyb - Skruyb - Skruyb@mamot.fr - <p>Fr and En.<br />Posts will disappear on a regular basis.</p> - - - - Skruyb - The 7th Son - Fr and En. -Posts will disappear on a regular basis. - public - - - - - - - - tag:mamot.fr,2017-05-10:objectId=1299665:objectType=Status - 2017-05-10T20:06:59Z - 2017-05-10T20:06:59Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://pouets.ovh/@noName" class="u-url mention">@<span>noName</span></a></span></p><p>Pour comparer faut avoir tester... Ô wait!!! 😁</p> - - - public - - - - - - tag:mamot.fr,2017-05-10:objectId=1299185:objectType=Status - 2017-05-10T19:52:14Z - 2017-05-10T19:52:14Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://witches.town/@Dhveszak" class="u-url mention">@<span>Dhveszak</span></a></span></p><p>Toi!! Tu vises le ministère de la propagande avoue!!!!!!!</p> - - - public - - - - - - tag:mamot.fr,2017-05-10:objectId=1299019:objectType=Status - 2017-05-10T19:47:19Z - 2017-05-10T19:47:19Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>Facebook s&apos;attaque aux sites internet &quot;trompeurs&quot;</p><p><a href="http://u.afp.com/4W4z" rel="nofollow noopener" target="_blank"><span class="invisible">http://</span><span class="">u.afp.com/4W4z</span><span class="invisible"></span></a></p><p>J&apos;attends de voir que Facebook s&apos;attaque à lui même... rien qu&apos;à lire leurs conditions générales d&apos;utilisation, le respect de la vie privée...</p><p>Charité bien ordonnée... Parfois l&apos;égoïsme aurait du bon.</p> - - public - - - - - tag:mamot.fr,2017-05-10:objectId=1298889:objectType=Status - 2017-05-10T19:43:18Z - 2017-05-10T19:43:18Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://octodon.social/@Balise" class="u-url mention">@<span>Balise</span></a></span></p><p>Fait comme moi, annonce que tu fais dans le flou artistique et que seuls des esprits éclairés pourront en percevoir la beauté et apprécier. Globalement après ça, tout le monde trouve les photos cool :-p</p> - - - public - - - - - - tag:mamot.fr,2017-05-10:objectId=1298728:objectType=Status - 2017-05-10T19:38:39Z - 2017-05-10T19:38:39Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mastodon.social/@applecandy" class="u-url mention">@<span>applecandy</span></a></span></p><p>Lucky you!!!</p> - - - public - - - - - - tag:mamot.fr,2017-05-10:objectId=1298431:objectType=Status - 2017-05-10T19:26:32Z - 2017-05-10T19:26:32Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>Est-ce que je suis le seul qui lorsqu&apos;il commence à compter les arbres sur le bord de la route n&apos;arrive pas à s&apos;arrêter de compter?</p> - - public - - - - - tag:mamot.fr,2017-05-10:objectId=1298224:objectType=Status - 2017-05-10T19:18:17Z - 2017-05-10T19:18:17Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>Ca y est j&apos;ai une nouvelle passion. Mettre les bouchons qui trainent par terre dans le bons sens avec mon pied 🙌</p> - - public - - - - - tag:mamot.fr,2017-05-10:objectId=1297450:objectType=Status - 2017-05-10T18:53:37Z - 2017-05-10T18:53:37Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>Ok. On est capable d&apos;envoyer des mecs dans l&apos;espace, avoir des voitures autonomes, des trucs intelligents de partout mais pas tous les bâtiments accessibles aux personnes à mobilité réduite, les émissions sur le services publics avec une personne faisant la traduction pour les sourds et malentendants de manière systématique...</p><p>J&apos;ai du louper un truc dans l&apos;ordre des priorités Oo</p> - - public - - - - - tag:mamot.fr,2017-05-10:objectId=1297292:objectType=Status - 2017-05-10T18:48:17Z - 2017-05-10T18:48:17Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>J&apos;ai comme envie de faire un truc mais je ne sais pas quoi mais pourtant c&apos;est comme si je ressentais l&apos;idée dans ma tête mais c&apos;est pas clair...</p><p>Fuck!!! J&apos;vais aller draguer Josiane à la compta ça va me changer les idées!!!</p> - - public - - - - - tag:mamot.fr,2017-05-10:objectId=1296598:objectType=Status - 2017-05-10T18:25:11Z - 2017-05-10T18:25:11Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mamot.fr/@Smeablog" class="u-url mention">@<span>Smeablog</span></a></span></p><p>Pas faux MDR!!!!</p> - - - public - - - - - - tag:mamot.fr,2017-05-10:objectId=1296571:objectType=Status - 2017-05-10T18:24:13Z - 2017-05-10T18:24:13Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mamot.fr/@Smeablog" class="u-url mention">@<span>Smeablog</span></a></span></p><p>Ca ne change pas la finalité malheureusement, ça ne m&apos;ouvre pas ce à quoi je veux accéder 😭</p> - - - public - - - - - - tag:mamot.fr,2017-05-10:objectId=1296475:objectType=Status - 2017-05-10T18:20:50Z - 2017-05-10T18:20:50Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>Arrrgghhhhhhh!!!!</p><p>Quand t&apos;es sur le point de cliquer sur un lien dans le fil public global et que BOOM ça se met à jour... J&apos;ose même pas imaginer combien j&apos;ai ouvert de pages web sans le vouloir!!!</p> - - public - - - - - tag:mamot.fr,2017-05-10:objectId=1296426:objectType=Status - 2017-05-10T18:19:17Z - 2017-05-10T18:19:17Z - Skruyb shared a status by Isaluini@mastodon.social - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - tag:mastodon.social,2017-05-10:objectId=5587049:objectType=Status - 2017-05-10T18:18:59Z - 2017-05-10T18:19:00Z - New status by Isaluini@mastodon.social - - https://mastodon.social/users/Isaluini - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/Isaluini - Isaluini - Isaluini@mastodon.social - <p>Adicciones: Escribir, diseñar, cine, café, humor negro, música y dibujar. | Jedi. Bueno, no. Algún día (?) | Gratitude.</p> - - - - Isaluini - Isa - Adicciones: Escribir, diseñar, cine, café, humor negro, música y dibujar. | Jedi. Bueno, no. Algún día (?) | Gratitude. - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>♫ <br><a href="https://www.youtube.com/watch?v=pT68FS3YbQ4"><span class="invisible">https://www.</span><span class="ellipsis">youtube.com/watch?v=pT68FS3YbQ</span><span class="invisible">4</span></a></p> - - public - - - <p>♫ <br><a href="https://www.youtube.com/watch?v=pT68FS3YbQ4"><span class="invisible">https://www.</span><span class="ellipsis">youtube.com/watch?v=pT68FS3YbQ</span><span class="invisible">4</span></a></p> - - public - - - - - tag:mamot.fr,2017-05-10:objectId=1295893:objectType=Status - 2017-05-10T18:01:51Z - 2017-05-10T18:01:51Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mamot.fr/@Chat2Gouttieres" class="u-url mention">@<span>Chat2Gouttieres</span></a></span></p><p>Ah bah après faut savoir mettre à profit ce savoir ^^</p> - - - public - - - - - - tag:mamot.fr,2017-05-10:objectId=1295815:objectType=Status - 2017-05-10T18:00:02Z - 2017-05-10T18:00:02Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mamot.fr/@Chat2Gouttieres" class="u-url mention">@<span>Chat2Gouttieres</span></a></span></p><p>Exactement. On a les jeux mais pas le pain encore.</p><p>Finalement on a rien inventé :-p</p> - - - public - - - - - - tag:mamot.fr,2017-05-10:objectId=1295778:objectType=Status - 2017-05-10T17:58:52Z - 2017-05-10T17:58:52Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mamot.fr/@Chat2Gouttieres" class="u-url mention">@<span>Chat2Gouttieres</span></a></span></p><p>C&apos;est ça visiblement dans notre société dite moderne... &quot;Créer l&apos;illusion que&quot; Oo.</p> - - - public - - - - - - tag:mamot.fr,2017-05-10:objectId=1294943:objectType=Status - 2017-05-10T17:31:44Z - 2017-05-10T17:31:44Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - Hey. - <p><span class="h-card"><a href="https://mastodon.social/@lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span></p><p>Hey!!!</p> - - - public - - - - - - tag:mamot.fr,2017-05-10:objectId=1294914:objectType=Status - 2017-05-10T17:30:40Z - 2017-05-10T17:30:40Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mamot.fr/@EloClemTiti" class="u-url mention">@<span>EloClemTiti</span></a></span></p><p>J&apos;ai souvent cette impression en effet 😂</p> - - - public - - - - - - tag:mamot.fr,2017-05-10:objectId=1294148:objectType=Status - 2017-05-10T17:02:01Z - 2017-05-10T17:02:01Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>Les gars, les boss veulent voir de l&apos;avancement!! Une idée?</p><p>On fait comme d&apos;habitude. On divise nos tâches en 25.000 tâches unitaires, on fout du vert au maximum et on crée l&apos;illusion que ça a bien avancé!</p><p>Deal!!</p><p>Bob, tu choisis quel vert on utilise<br />Alice, t&apos;es en charge de la typo<br />Moi, je m&apos;occupe qu&apos;on prend bien le dernier template ppt fournit par la comm interne.</p><p>Des winners qu&apos;on est!!!! Des WI-NNERS!!!</p> - - public - - - - - tag:mamot.fr,2017-05-10:objectId=1293995:objectType=Status - 2017-05-10T16:57:53Z - 2017-05-10T16:57:53Z - New status by Skruyb - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://mastodon.social/@SauceHair" class="u-url mention">@<span>SauceHair</span></a></span></p><p>Cool!!</p><p>Bon courage.</p> - - - public - - - - - diff --git a/test/fixtures/tesla_mock/https___mastodon.social_users_lambadalambda.atom b/test/fixtures/tesla_mock/https___mastodon.social_users_lambadalambda.atom deleted file mode 100644 index 4d732b109..000000000 --- a/test/fixtures/tesla_mock/https___mastodon.social_users_lambadalambda.atom +++ /dev/null @@ -1,464 +0,0 @@ - - - https://mastodon.social/users/lambadalambda.atom - Critical Value - - 2017-04-16T21:47:25Z - https://files.mastodon.social/accounts/avatars/000/000/264/original/1429214160519.gif - - https://mastodon.social/users/lambadalambda - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/lambadalambda - lambadalambda - lambadalambda@mastodon.social - - - - lambadalambda - Critical Value - public - - - - - - - - tag:mastodon.social,2017-05-04:objectId=4991300:objectType=Status - 2017-05-04T14:10:30Z - 2017-05-04T14:10:30Z - Delete - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/delete - - - - - tag:mastodon.social,2017-05-04:objectId=4980289:objectType=Status - 2017-05-04T07:43:23Z - 2017-05-04T07:43:23Z - Delete - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/delete - - - - - tag:mastodon.social,2017-05-03:objectId=4952899:objectType=Status - 2017-05-03T17:26:43Z - 2017-05-03T17:26:43Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://pleroma.soykaf.com/users/lain" class="u-url mention">@<span>lain</span></a></span> OK!!</p> - - - public - - - - - - tag:mastodon.social,2017-05-03:objectId=4952810:objectType=Status - 2017-05-03T17:24:34Z - 2017-05-03T17:24:34Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://pleroma.soykaf.com/users/lain" class="u-url mention">@<span>lain</span></a></span> yeah :)</p> - - - public - - - - - - tag:mastodon.social,2017-05-03:objectId=4950388:objectType=Status - 2017-05-03T16:22:00Z - 2017-05-03T16:22:00Z - lambadalambda shared a status by lambadalambda@social.heldscal.la - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - tag:social.heldscal.la,2017-05-03:noticeId=2030733:objectType=note - 2017-05-03T12:29:20Z - 2017-05-03T12:29:31Z - New status by lambadalambda@social.heldscal.la - - https://social.heldscal.la/user/23211 - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - lambadalambda@social.heldscal.la - Call me Deacon Blues. - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - Time for work. <a href="https://social.heldscal.la/file/953c117a1e7e4c763755d2ac29cf1aae08e025599f4a4cc11ddff4082c07f969.jpg">https://social.heldscal.la/attachment/120552</a> - - - public - - - Time for work. <a href="https://social.heldscal.la/file/953c117a1e7e4c763755d2ac29cf1aae08e025599f4a4cc11ddff4082c07f969.jpg">https://social.heldscal.la/attachment/120552</a> - - public - - - - - tag:mastodon.social,2017-05-03:objectId=4934452:objectType=Status - 2017-05-03T08:21:09Z - 2017-05-03T08:21:09Z - lambadalambda shared a status by lain@pleroma.soykaf.com - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - https://pleroma.soykaf.com/objects/4c1bda26-902e-4525-9fcd-b9fd44925193 - 2017-05-03T08:04:44Z - 2017-05-03T08:05:52Z - New status by lain@pleroma.soykaf.com - - https://pleroma.soykaf.com/users/lain - http://activitystrea.ms/schema/1.0/person - https://pleroma.soykaf.com/users/lain - lain - lain@pleroma.soykaf.com - Test account - - - - lain - Lain Iwakura - Test account - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - Added returning the entries as xml... let's see if the mastodon hammering stops now. - - public - - - Added returning the entries as xml... let's see if the mastodon hammering stops now. - - public - - - - - tag:mastodon.social,2017-05-02:objectId=4905499:objectType=Status - 2017-05-02T19:34:21Z - 2017-05-02T19:34:21Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://pleroma.soykaf.com/users/lain" class="u-url mention">@<span>lain</span></a></span> yay!</p> - - - public - - - - - - tag:mastodon.social,2017-05-02:objectId=4905442:objectType=Status - 2017-05-02T19:33:33Z - 2017-05-02T19:33:33Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://pleroma.soykaf.com/users/lain" class="u-url mention">@<span>lain</span></a></span> so?</p> - - - public - - - - - - tag:mastodon.social,2017-05-02:objectId=4901603:objectType=Status - 2017-05-02T18:33:06Z - 2017-05-02T18:33:06Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://pleroma.soykaf.com/users/lain" class="u-url mention">@<span>lain</span></a></span> hey</p> - - - public - - - - - - tag:mastodon.social,2017-05-01:objectId=4836720:objectType=Status - 2017-05-01T18:52:16Z - 2017-05-01T18:52:16Z - lambadalambda shared a status by lain@pleroma.soykaf.com - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - https://pleroma.soykaf.com/objects/7b41bb51-9aba-436a-82d9-dd3f5aca98c9 - 2017-05-01T18:50:54Z - 2017-05-01T18:50:57Z - New status by lain@pleroma.soykaf.com - - https://pleroma.soykaf.com/users/lain - http://activitystrea.ms/schema/1.0/person - https://pleroma.soykaf.com/users/lain - lain - lain@pleroma.soykaf.com - Test account - - - - lain - Lain Iwakura - Test account - public - - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <a href="https://mastodon.social/users/lambadalambda">@lambadalambda@mastodon.social</a> you're an all-star. - - - public - - - - <a href="https://mastodon.social/users/lambadalambda">@lambadalambda@mastodon.social</a> you're an all-star. - - public - - - - - tag:mastodon.social,2017-05-01:objectId=4836142:objectType=Status - 2017-05-01T18:38:47Z - 2017-05-01T18:38:47Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://pleroma.soykaf.com/users/lain" class="u-url mention">@<span>lain</span></a></span> Hey now!</p> - - - public - - - - - - tag:mastodon.social,2017-05-01:objectId=4836055:objectType=Status - 2017-05-01T18:37:04Z - 2017-05-01T18:37:04Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://pleroma.soykaf.com/users/lain" class="u-url mention">@<span>lain</span></a></span> hello</p> - - - public - - - - - - tag:mastodon.social,2017-05-01:objectId=4834850:objectType=Status - 2017-05-01T18:10:43Z - 2017-05-01T18:10:43Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://pleroma.soykaf.com/users/lain" class="u-url mention">@<span>lain</span></a></span> Hey!</p> - - - public - - - - - tag:mastodon.social,2017-04-29:objectId=4694455:objectType=Status - 2017-04-29T18:39:12Z - 2017-04-29T18:39:12Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>@lain@pleroma.soykaf.com What&apos;s up?</p> - - public - - - - - tag:mastodon.social,2017-04-29:objectId=4694384:objectType=Status - 2017-04-29T18:37:32Z - 2017-04-29T18:37:32Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://social.heldscal.la/lain" class="u-url mention">@<span>lain</span></a></span> Hey.</p> - - - public - - - - - tag:mastodon.social,2017-04-07:objectId=1874242:objectType=Status - 2017-04-07T11:02:56Z - 2017-04-07T11:02:56Z - lambadalambda shared a status by 0xroy@social.wxcafe.net - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - tag:social.wxcafe.net,2017-04-07:objectId=72554:objectType=Status - 2017-04-07T11:01:59Z - 2017-04-07T11:02:00Z - New status by 0xroy@social.wxcafe.net - - https://social.wxcafe.net/users/0xroy - http://activitystrea.ms/schema/1.0/person - https://social.wxcafe.net/users/0xroy - 0xroy - 0xroy@social.wxcafe.net - ta caution weeb | discussions privées : <a href="https://%F0%9F%92%8C.0xroy.me"><span class="invisible">https://</span><span class="">💌.0xroy.me</span><span class="invisible"></span></a> - - - - 0xroy - 「R O Y 🍵 B O S」 - ta caution weeb | discussions privées : https://💌.0xroy.me - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>someone pls eli5 matrix (protocol) and riot</p> - - public - - - <p>someone pls eli5 matrix (protocol) and riot</p> - - public - - - - - tag:mastodon.social,2017-04-06:objectId=1768247:objectType=Status - 2017-04-06T11:10:19Z - 2017-04-06T11:10:19Z - lambadalambda shared a status by areyoutoo@mastodon.xyz - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - tag:mastodon.xyz,2017-04-05:objectId=133327:objectType=Status - 2017-04-05T17:36:41Z - 2017-04-05T18:12:14Z - New status by areyoutoo@mastodon.xyz - - https://mastodon.xyz/users/areyoutoo - http://activitystrea.ms/schema/1.0/person - https://mastodon.xyz/users/areyoutoo - areyoutoo - areyoutoo@mastodon.xyz - devops | retired gamedev | always boost puppy pics - - - - areyoutoo - Raw Butter - devops | retired gamedev | always boost puppy pics - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>Some UX thoughts for <a href="https://mastodon.xyz/tags/mastodev">#<span>mastodev</span></a>:</p><p>- Would be nice if I could work on multiple draft toots? Clicking to reply to someone seems to erase any draft I had been working on.</p><p>- Kinda risky to click on the Federated Timeline if it loads new toots and scrolls 10ms before I click on something.</p><p>I probably don't know enough web frontend to help, but it might be fun to try.</p> - - - public - - - <p>Some UX thoughts for <a href="https://mastodon.xyz/tags/mastodev">#<span>mastodev</span></a>:</p><p>- Would be nice if I could work on multiple draft toots? Clicking to reply to someone seems to erase any draft I had been working on.</p><p>- Kinda risky to click on the Federated Timeline if it loads new toots and scrolls 10ms before I click on something.</p><p>I probably don't know enough web frontend to help, but it might be fun to try.</p> - - public - - - - - tag:mastodon.social,2017-04-06:objectId=1764509:objectType=Status - 2017-04-06T10:15:38Z - 2017-04-06T10:15:38Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - This is a test for cw federation - <p>This is a test for cw federation body text.</p> - - public - - - - - tag:mastodon.social,2017-04-05:objectId=1645208:objectType=Status - 2017-04-05T07:14:53Z - 2017-04-05T07:14:53Z - lambadalambda shared a status by lambadalambda@social.heldscal.la - http://activitystrea.ms/schema/1.0/activity - http://activitystrea.ms/schema/1.0/share - - tag:social.heldscal.la,2017-04-05:noticeId=1502088:objectType=note - 2017-04-05T06:12:09Z - 2017-04-05T07:12:47Z - New status by lambadalambda@social.heldscal.la - - https://social.heldscal.la/user/23211 - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - lambadalambda@social.heldscal.la - Call me Deacon Blues. - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - public - - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - Federation 101: <a href="https://www.youtube.com/watch?v=t1lYU5CA40o">https://www.youtube.com/watch?v=t1lYU5CA40o</a> - - public - - - Federation 101: <a href="https://www.youtube.com/watch?v=t1lYU5CA40o">https://www.youtube.com/watch?v=t1lYU5CA40o</a> - - public - - - - - tag:mastodon.social,2017-04-05:objectId=1641750:objectType=Status - 2017-04-05T05:44:48Z - 2017-04-05T05:44:48Z - New status by lambadalambda - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> just a test.</p> - - - public - - - - diff --git a/test/fixtures/tesla_mock/https___pawoo.net_users_pekorino.atom b/test/fixtures/tesla_mock/https___pawoo.net_users_pekorino.atom deleted file mode 100644 index 17d1956e8..000000000 --- a/test/fixtures/tesla_mock/https___pawoo.net_users_pekorino.atom +++ /dev/null @@ -1,231 +0,0 @@ - - - https://pawoo.net/users/pekorino.atom - モノエ - シアトル・米国 - -GNUsocial 英語版 -http://shitposter.club/mono - - - 2017-05-07T09:28:20Z - https://img.pawoo.net/accounts/avatars/000/128/378/original/e1fce04a36a1ad90.jpg - - https://pawoo.net/users/pekorino - http://activitystrea.ms/schema/1.0/person - https://pawoo.net/users/pekorino - pekorino - pekorino@pawoo.net - <p>シアトル・米国</p><p>GNUsocial 英語版<br /><a href="http://shitposter.club/mono" rel="nofollow noopener" target="_blank"><span class="invisible">http://</span><span class="">shitposter.club/mono</span><span class="invisible"></span></a> </p> - - - - pekorino - モノエ - シアトル・米国 - -GNUsocial 英語版 -http://shitposter.club/mono - - - public - - - - - - - tag:pawoo.net,2017-05-07:objectId=9319211:objectType=Status - 2017-05-07T09:56:35Z - 2017-05-07T09:56:35Z - New status by pekorino - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://shitposter.club/moonman" class="u-url mention">@<span>moonman</span></a></span> <span class="h-card"><a href="https://shitposter.club/rw" class="u-url mention">@<span>rw</span></a></span> <span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> <span class="h-card"><a href="https://shitposter.club/mono" class="u-url mention">@<span>mono</span></a></span> </p><p>i have to wait for someone to respond to this before i can follow because i dont think this software has a direct follow by url option</p> - - - - - - public - - - - - - tag:pawoo.net,2017-05-07:objectId=9318595:objectType=Status - 2017-05-07T09:54:39Z - 2017-05-07T09:54:39Z - New status by pekorino - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://shitposter.club/mono" class="u-url mention">@<span>mono</span></a></span> <span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> <span class="h-card"><a href="https://shitposter.club/rw" class="u-url mention">@<span>rw</span></a></span> <span class="h-card"><a href="https://shitposter.club/moonman" class="u-url mention">@<span>moonman</span></a></span> <br />please respond</p> - - - - - - public - - - - - - tag:pawoo.net,2017-05-07:objectId=9313978:objectType=Status - 2017-05-07T09:39:17Z - 2017-05-07T09:39:17Z - New status by pekorino - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://shitposter.club/moonman" class="u-url mention">@<span>moonman</span></a></span> <br />mastodon is so slow. browser crashed twice trying to set avatar</p> - - - public - - - - - tag:pawoo.net,2017-05-07:objectId=9312691:objectType=Status - 2017-05-07T09:34:38Z - 2017-05-07T09:34:38Z - New status by pekorino - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://shitposter.club/hardbass2k8" class="u-url mention">@<span>hardbass2k8</span></a></span> <a href="https://pawoo.net/media/mZJjLpbPU72GFEz2Svk" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="ellipsis">pawoo.net/media/mZJjLpbPU72GFE</span><span class="invisible">z2Svk</span></a></p> - - - - public - - - - - - tag:pawoo.net,2017-05-07:objectId=9312379:objectType=Status - 2017-05-07T09:33:29Z - 2017-05-07T09:33:29Z - New status by pekorino - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://shitposter.club/hardbass2k8" class="u-url mention">@<span>hardbass2k8</span></a></span> <a href="https://pawoo.net/media/nt5JHBEHyTN2bqzdcGU" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="ellipsis">pawoo.net/media/nt5JHBEHyTN2bq</span><span class="invisible">zdcGU</span></a></p> - - - - public - - - - - - tag:pawoo.net,2017-05-07:objectId=9311765:objectType=Status - 2017-05-07T09:31:26Z - 2017-05-07T09:31:26Z - New status by pekorino - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p><a href="https://pawoo.net/media/C4RV6ubsEtvS04DX6qs" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="ellipsis">pawoo.net/media/C4RV6ubsEtvS04</span><span class="invisible">DX6qs</span></a></p> - - - public - - - - - tag:pawoo.net,2017-05-07:objectId=9311610:objectType=Status - 2017-05-07T09:30:59Z - 2017-05-07T09:30:59Z - New status by pekorino - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p><a href="https://pawoo.net/media/MBmkeEdrjs8pAtCHN6s" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="ellipsis">pawoo.net/media/MBmkeEdrjs8pAt</span><span class="invisible">CHN6s</span></a></p> - - - public - - - - - tag:pawoo.net,2017-05-07:objectId=9307782:objectType=Status - 2017-05-07T09:16:47Z - 2017-05-07T09:16:47Z - New status by pekorino - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://shitposter.club/mono" class="u-url mention">@<span>mono</span></a></span></p><p>test</p> - - - public - - - - - tag:pawoo.net,2017-05-07:objectId=9307444:objectType=Status - 2017-05-07T09:15:42Z - 2017-05-07T09:15:42Z - New status by pekorino - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://shitposter.club/hardbass2k8" class="u-url mention">@<span>hardbass2k8</span></a></span> テスト</p> - - - public - - - - - - tag:pawoo.net,2017-05-07:objectId=9307239:objectType=Status - 2017-05-07T09:14:58Z - 2017-05-07T09:14:58Z - New status by pekorino - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>ててててててテスト</p> - - public - - - - - tag:pawoo.net,2017-04-20:objectId=2212164:objectType=Status - 2017-04-20T06:19:18Z - 2017-04-20T06:19:18Z - New status by pekorino - http://activitystrea.ms/schema/1.0/comment - http://activitystrea.ms/schema/1.0/post - <p><span class="h-card"><a href="https://shitposter.club/mono" class="u-url mention">@<span>mono</span></a></span> <a href="https://pawoo.net/media/iMbjMBVPfZJX3lUC2Sc" rel="nofollow noopener" target="_blank"><span class="invisible">https://</span><span class="ellipsis">pawoo.net/media/iMbjMBVPfZJX3l</span><span class="invisible">UC2Sc</span></a></p> - - - - public - - - - - - tag:pawoo.net,2017-04-20:objectId=2206216:objectType=Status - 2017-04-20T05:57:59Z - 2017-04-20T05:57:59Z - New status by pekorino - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>テスト</p> - - public - - - - - tag:pawoo.net,2017-04-20:objectId=2204702:objectType=Status - 2017-04-20T05:52:09Z - 2017-04-20T05:52:09Z - New status by pekorino - http://activitystrea.ms/schema/1.0/note - http://activitystrea.ms/schema/1.0/post - <p>HELLOWORLD</p> - - public - - - - diff --git a/test/fixtures/tesla_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml b/test/fixtures/tesla_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml deleted file mode 100644 index a2a2629a6..000000000 --- a/test/fixtures/tesla_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml +++ /dev/null @@ -1 +0,0 @@ -https://pleroma.soykaf.com/users/lain/feed.atomlain's timeline2017-05-05T08:38:03.385598https://pleroma.soykaf.com/users/lainhttp://activitystrea.ms/schema/1.0/personhttps://pleroma.soykaf.com/users/lainlainLain IwakuraTest accountlainhttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/sharehttps://pleroma.soykaf.com/activities/579e4224-b2ab-4ffa-8bbe-f7197a0a38d1lain repeated a noticeRT In just seven days, I can make you a man!<br> -- The Rocky Horror Picture Show2017-05-05T08:38:03.3855902017-05-05T08:38:03.385598https://pleroma.soykaf.com/contexts/e8673466-9642-4c9e-8781-f0f69d6b15aehttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/53dd40f4-3069-45a1-863b-94a9b317093dNew note by fortuneIn just seven days, I can make you a man!<br> -- The Rocky Horror Picture Show2017-05-05T02:10:02.9308022017-05-05T08:38:03.423539https://pleroma.soykaf.com/contexts/e8673466-9642-4c9e-8781-f0f69d6b15aehttps://pleroma.soykaf.com/users/fortunehttp://activitystrea.ms/schema/1.0/personhttps://pleroma.soykaf.com/users/fortunefortunefortuneThe trusty unix fortune filefortunehttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/2bc86888-a256-4771-bb53-903f375804f9New note by lainRTs federating into pleroma now.2017-05-04T18:18:50.2764702017-05-04T18:18:50.276476https://pleroma.soykaf.com/contexts/b7ae9350-f317-48aa-8058-2668091bb280http://activitystrea.ms/schema/1.0/favoritehttps://pleroma.soykaf.com/activities/902b1f50-f295-4189-8c15-9c880919e121New favorite by lainlain favorited something2017-05-04T08:03:01.3088902017-05-04T08:03:01.308927http://activitystrea.ms/schema/1.0/notetag:gs.smuglo.li,2017-05-03:noticeId=2164642:objectType=commenthttps://pleroma.soykaf.com/contexts/9419f742-aaba-4eb5-89a2-8b599e8bf43chttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/4e396e66-b063-454c-92c6-583506a9a2deNew note by lainClassic.<br><a href='https://pleroma.soykaf.com/media/adc36781-9765-4d9a-b57c-99b7a99108b2/mikodaemonstop.jpg'>https://pleroma.soykaf.com/media/adc36781-9765-4d9a-b57c-99b7a99108b2/mikodaemonstop.jpg</a>2017-05-04T07:59:45.1806192017-05-04T07:59:45.180628https://pleroma.soykaf.com/contexts/6afd9659-41e6-406d-ae97-43b880722861http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/85d183e9-c935-4655-a1e6-8d69a4108235New note by lainん?<br><a href='https://pleroma.soykaf.com/media/ab144c6d-a38c-4d35-a60b-9a998becc094/n.gif'>https://pleroma.soykaf.com/media/ab144c6d-a38c-4d35-a60b-9a998becc094/n.gif</a>2017-05-04T07:58:08.8107162017-05-04T07:58:08.810726https://pleroma.soykaf.com/contexts/2e1aa616-86ce-4b50-9c81-63045a972156http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/7c5c45bb-e4d9-4f72-b4c6-0314afbd3553New note by lainyeah.2017-05-04T07:55:17.3352902017-05-04T07:55:17.335299https://pleroma.soykaf.com/contexts/702c06cf-56ff-4a2f-bf5a-150bc00bb168http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/f33f5f54-1c1d-4462-b9ed-229bb635dfd8New note by lainyeah.2017-05-04T07:49:24.9314842017-05-04T07:49:24.931492https://pleroma.soykaf.com/contexts/c4932e7a-00cb-431a-b4ec-7404cb9daf65http://activitystrea.ms/schema/1.0/favoritehttps://pleroma.soykaf.com/activities/0709bc79-7ac5-4983-b6d0-2205bf5ceba3New favorite by lainlain favorited something2017-05-03T20:08:11.2945792017-05-03T20:08:11.294587http://activitystrea.ms/schema/1.0/notetag:pawoo.net,2017-05-03:objectId=7967690:objectType=Statushttps://pleroma.soykaf.com/contexts/07a4b34d-6255-4bb2-8c73-c295a09ac952http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/72c0288e-62d8-43d9-b3d8-1a9d78be8375New note by lain<a href='https://pawoo.net/users/God_Emperor_of_Dune'>@God_Emperor_of_Dune@pawoo.net</a> no man, just some fun domination play among buddies, nothing homo about it.2017-05-03T20:01:00.9983142017-05-03T20:01:00.998322https://pleroma.soykaf.com/contexts/07a4b34d-6255-4bb2-8c73-c295a09ac952http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/d846409e-cf2a-4b68-a149-d5de34a91b0dNew note by lain<a href='https://social.heldscal.la/user/24974'>@dtluna@social.heldscal.la</a> btfo.<br><a href='https://pleroma.soykaf.com/media/fbe42e87-5574-4544-89ba-29ddf46227fa/pnc__picked_media_1889ce61-4961-4fea-8a14-04fe6783ebf6.jpg'>https://pleroma.soykaf.com/media/fbe42e87-5574-4544-89ba-29ddf46227fa/pnc__picked_media_1889ce61-4961-4fea-8a14-04fe6783ebf6.jpg</a>2017-05-03T20:00:15.8609952017-05-03T20:00:15.861002https://pleroma.soykaf.com/contexts/0e88f35e-1a38-4181-bef9-5cbb0d943c63http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/9075265f-f3b2-40e8-809f-10714f05a1fdNew note by lain#nohomo <br><a href='https://pleroma.soykaf.com/media/5cc5ad91-d637-4c45-a691-5ea778dc1bb3/pnc__picked_media_f62dc9ae-ea23-4fe6-bf85-cb75a129ab34.jpg'>https://pleroma.soykaf.com/media/5cc5ad91-d637-4c45-a691-5ea778dc1bb3/pnc__picked_media_f62dc9ae-ea23-4fe6-bf85-cb75a129ab34.jpg</a>2017-05-03T19:50:38.5891062017-05-03T19:50:38.589113https://pleroma.soykaf.com/contexts/07a4b34d-6255-4bb2-8c73-c295a09ac952http://activitystrea.ms/schema/1.0/favoritehttps://pleroma.soykaf.com/activities/7924e992-0a95-40d9-8d17-7278c6c634c9New favorite by lainlain favorited something2017-05-03T18:32:59.2733752017-05-03T18:32:59.273382http://activitystrea.ms/schema/1.0/notetag:gs.smuglo.li,2017-05-03:noticeId=2164774:objectType=commenthttps://pleroma.soykaf.com/contexts/9419f742-aaba-4eb5-89a2-8b599e8bf43chttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/569571ba-f54c-41b0-bde4-0fede54599f0New note by lain<a href='https://gs.smuglo.li/user/2'>@nepfag@gs.smuglo.li</a>@gs.smuglo.li I'll do proper subfolders soon, for now it's one per attachment + thumbs etc.2017-05-03T18:27:01.4499492017-05-03T18:27:01.449956https://pleroma.soykaf.com/contexts/9419f742-aaba-4eb5-89a2-8b599e8bf43chttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/sharehttps://pleroma.soykaf.com/activities/b6cc5d7c-0785-4785-a689-f1b05dc9b24dlain repeated a noticeRT <p><span class="h-card"><a href="https://pleroma.soykaf.com/users/lain" class="u-url mention">@<span>lain</span></a></span> Hey now!</p>2017-05-03T18:13:48.8910612017-05-03T18:13:48.891069https://pleroma.soykaf.com/contexts/ec6fdd27-0ec1-4672-8408-5a8e5a9c094bhttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posttag:mastodon.social,2017-05-01:objectId=4836142:objectType=StatusNew note by lambadalambda@mastodon.social<p><span class="h-card"><a href="https://pleroma.soykaf.com/users/lain" class="u-url mention">@<span>lain</span></a></span> Hey now!</p>2017-05-01T18:38:49.3653912017-05-03T18:13:48.934745https://pleroma.soykaf.com/contexts/ec6fdd27-0ec1-4672-8408-5a8e5a9c094bhttps://mastodon.social/users/lambadalambdahttp://activitystrea.ms/schema/1.0/personhttps://mastodon.social/users/lambadalambdalambadalambda@mastodon.socialCritical Valuenillambadalambda@mastodon.socialhttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/sharehttps://pleroma.soykaf.com/activities/3c09eb31-4ba8-4ff5-b4fa-8f6f74d58bf0lain repeated a noticeRT Haha, salmons from mastodon didn't work because it's not implementing conversation id...2017-05-03T18:13:15.1480412017-05-03T18:13:15.148049tag:social.heldscal.la,2017-05-01:objectType=thread:nonce=86cda6c734401d80http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posttag:social.heldscal.la,2017-05-01:noticeId=2000425:objectType=noteNew note by lambadalambda@social.heldscal.laHaha, salmons from mastodon didn't work because it's not implementing conversation id...2017-05-01T18:39:36.2163772017-05-03T18:13:15.171143tag:social.heldscal.la,2017-05-01:objectType=thread:nonce=86cda6c734401d80https://social.heldscal.la/user/23211http://activitystrea.ms/schema/1.0/personhttps://social.heldscal.la/user/23211lambadalambda@social.heldscal.laConstance Variablenillambadalambda@social.heldscal.lahttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/b8fc83d5-d7c0-4b5f-8976-0317b51935eaNew note by lain.<br><a href='https://pleroma.soykaf.com/media/563008a7-9a60-47ac-a263-22835729adf6/1492530528735.png'>https://pleroma.soykaf.com/media/563008a7-9a60-47ac-a263-22835729adf6/1492530528735.png</a>2017-05-03T18:12:50.7452412017-05-03T18:12:50.745249https://pleroma.soykaf.com/contexts/9419f742-aaba-4eb5-89a2-8b599e8bf43chttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/sharehttps://pleroma.soykaf.com/activities/ac93ecef-cde0-48e8-ae4b-19e3b94dbe30lain repeated a noticeRT Awright, which one of you hid my PENIS ENVY?2017-05-03T18:08:49.2310012017-05-03T18:08:49.235354https://pleroma.soykaf.com/contexts/a9132cf8-6afa-4dd8-8b29-7b6fcab623b8http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/04e15c66-4936-4930-a134-32841f088bcfNew note by fortuneAwright, which one of you hid my PENIS ENVY?2017-05-01T19:40:03.1699962017-05-03T18:08:49.285347https://pleroma.soykaf.com/contexts/a9132cf8-6afa-4dd8-8b29-7b6fcab623b8https://pleroma.soykaf.com/users/fortunehttp://activitystrea.ms/schema/1.0/personhttps://pleroma.soykaf.com/users/fortunefortunefortuneThe trusty unix fortune filefortunehttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/sharehttps://pleroma.soykaf.com/activities/54b10fa9-d602-4a0f-b659-e6d3f7bc8c4clain repeated a noticeRT He is a man capable of turning any colour into grey.<br> -- John LeCarre2017-05-03T17:44:47.5789842017-05-03T17:44:47.578996https://pleroma.soykaf.com/contexts/8aebc8e5-5352-4047-8b74-4098a5830ccahttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/70ded299-184d-49cd-af17-23c0950536aaNew note by fortuneHe is a man capable of turning any colour into grey.<br> -- John LeCarre2017-05-02T08:40:03.4194652017-05-03T17:44:47.646192https://pleroma.soykaf.com/contexts/8aebc8e5-5352-4047-8b74-4098a5830ccahttps://pleroma.soykaf.com/users/fortunehttp://activitystrea.ms/schema/1.0/personhttps://pleroma.soykaf.com/users/fortunefortunefortuneThe trusty unix fortune filefortunehttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/sharehttps://pleroma.soykaf.com/activities/eff9fe49-8fc9-48e6-a1a0-921aa25c8118lain repeated a noticeRT The real trouble with women is that they have *all* the pussy.2017-05-03T17:30:22.5960372017-05-03T17:30:22.596048https://pleroma.soykaf.com/contexts/8c88c9df-4e40-4f54-b15f-c21848d1a8e2http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/0b9b008d-49eb-48a9-a18d-172ce7d01ea2New note by fortuneThe real trouble with women is that they have *all* the pussy.2017-05-02T12:10:03.6030862017-05-03T17:30:22.683141https://pleroma.soykaf.com/contexts/8c88c9df-4e40-4f54-b15f-c21848d1a8e2https://pleroma.soykaf.com/users/fortunehttp://activitystrea.ms/schema/1.0/personhttps://pleroma.soykaf.com/users/fortunefortunefortuneThe trusty unix fortune filefortunehttp://activitystrea.ms/schema/1.0/favoritehttps://pleroma.soykaf.com/activities/5d90bb26-ce23-4a5b-8dbd-651011780007New favorite by lainlain favorited something2017-05-03T17:28:20.9679262017-05-03T17:28:20.967935http://activitystrea.ms/schema/1.0/notetag:mastodon.social,2017-05-03:objectId=4952899:objectType=Statushttps://pleroma.soykaf.com/contexts/42701ab4-964a-441a-a372-f51bd183e441 \ No newline at end of file diff --git a/test/fixtures/tesla_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml b/test/fixtures/tesla_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml deleted file mode 100644 index 26fdebb49..000000000 --- a/test/fixtures/tesla_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment - New comment by moonman - @<a href="https://shitposter.club/user/9655" class="h-card mention" title="Solidarity for Pigs">neimzr4luzerz</a> @<a href="https://gs.smuglo.li/user/2326" class="h-card mention" title="Dolus_McHonest">dolus</a> childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T08:51:48+00:00 - 2017-05-05T08:51:48+00:00 - - http://activitystrea.ms/schema/1.0/person - https://shitposter.club/user/1 - moonman - EMAIL:shitposterclub@gmail.com XMPP: moon@talk.shitposter.club Matrix Ed25519 fingerprint: 2HuDUTEz3iFN5N3xl6PYp9xZW/EWhgbbt78SrFy4w8o - - - - - - moonman - Generic Enemy - EMAIL:shitposterclub@gmail.com XMPP: moon@talk.shitposter.club Matrix Ed25519 fingerprint: 2HuDUTEz3iFN5N3xl6PYp9xZW/EWhgbbt78SrFy4w8o - - The Moon - - - homepage - https://shitposter.club/moonman - true - - - - - - - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26 - - - - - https://shitposter.club/api/statuses/user_timeline/1.atom - Generic Enemy - - - - https://shitposter.club/avatar/1-96-20170503024316.jpeg - 2017-05-05T11:43:58+00:00 - - - - - diff --git a/test/fixtures/tesla_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml b/test/fixtures/tesla_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml deleted file mode 100644 index 31df7c2a6..000000000 --- a/test/fixtures/tesla_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml +++ /dev/null @@ -1,454 +0,0 @@ - - - GNU social - https://shitposter.club/api/statuses/user_timeline/1.atom - moonman timeline - Updates from moonman on Shitposter Club! - https://shitposter.club/avatar/1-96-20170503024316.jpeg - 2017-05-05T13:24:09+00:00 - - http://activitystrea.ms/schema/1.0/person - https://shitposter.club/user/1 - moonman - EMAIL:shitposterclub@gmail.com XMPP: moon@talk.shitposter.club Matrix Ed25519 fingerprint: 2HuDUTEz3iFN5N3xl6PYp9xZW/EWhgbbt78SrFy4w8o - - - - - - moonman - Generic Enemy - EMAIL:shitposterclub@gmail.com XMPP: moon@talk.shitposter.club Matrix Ed25519 fingerprint: 2HuDUTEz3iFN5N3xl6PYp9xZW/EWhgbbt78SrFy4w8o - - The Moon - - - homepage - https://shitposter.club/moonman - true - - - - - - - - - - - - - - tag:shitposter.club,2017-05-05:subscription:1:person:23190:2017-05-05T11:43:58+00:00 - Generic Enemy (moonman)'s status on Friday, 05-May-2017 11:43:58 UTC - <a href="https://shitposter.club/moonman">Generic Enemy</a> started following <a href="https://noagendasocial.com/@Ma5on">Mason</a>. - - http://activitystrea.ms/schema/1.0/follow - 2017-05-05T11:43:58+00:00 - 2017-05-05T11:43:58+00:00 - - http://activitystrea.ms/schema/1.0/person - https://noagendasocial.com/users/Ma5on - Mason - - - - - - ma5on - Mason - - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=abffa9c14a054d3b - - - - - - - tag:shitposter.club,2017-05-05:subscription:1:person:14357:2017-05-05T10:29:03+00:00 - Generic Enemy (moonman)'s status on Friday, 05-May-2017 10:29:03 UTC - <a href="https://shitposter.club/moonman">Generic Enemy</a> started following <a href="https://mastodon.cloud/@ohyran">Jens Reuterberg</a>. - - http://activitystrea.ms/schema/1.0/follow - 2017-05-05T10:29:03+00:00 - 2017-05-05T10:29:03+00:00 - - http://activitystrea.ms/schema/1.0/person - https://mastodon.cloud/users/ohyran - Jens Reuterberg - RPG-nerd, illustrator, Open Source enthusiast, KDE dude, designer and gay lefty. Might be a cliché - but we will soon find out! - - - - - - ohyran - Jens Reuterberg - RPG-nerd, illustrator, Open Source enthusiast, KDE dude, designer and gay lefty. Might be a cliché - but we will soon find out! - - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=937151d4825a85bf - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:shitposter.club,2017-05-05:noticeId=2828637:objectType=note - New note by moonman - basicall i would just rather have ppl say &quot;i like x and y&quot; than &quot;i'm a nerd&quot; the term can be retired. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T10:24:54+00:00 - 2017-05-05T10:24:54+00:00 - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=65992b0b9b5e6931 - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2828579:objectType=comment - New comment by moonman - @<a href="https://gs.smuglo.li/user/35497" class="h-card mention" title="Bokuro Bokusawa">boco</a> to be honest i've turned right around and been cruel to other people, i said i'd never do it but it happens again eventually. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T10:20:33+00:00 - 2017-05-05T10:20:33+00:00 - - - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=c997fc73d7f8a8f0 - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2828554:objectType=comment - New comment by moonman - @<a href="https://mastodon.cloud/users/ohyran" class="h-card mention" title="Jens Reuterberg">ohyran</a> i won't ever get over bullying but i agree otherwise. i don't go to comic shops too often these days but i got dragged to one last year and the sheer diversity of people enjoying comics now compared to years ago was striking and it pleased me. and i noticed a couple years ago because of youtube i find things i truly enjoy watching, like in-depth videos about electronic parts, didn't exist 20 years ago. it's pretty great. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T10:18:10+00:00 - 2017-05-05T10:18:10+00:00 - - - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767 - - - - - - - - tag:shitposter.club,2017-05-05:fave:1:comment:2828502:2017-05-05T10:12:52+00:00 - Favorite - moonman favorited something by ohyran: <p><span class="h-card"><a href="https://shitposter.club/moonman" class="u-url mention">@<span>moonman</span></a></span> fair enough - that distinction makes it clearer...</p><p>On the other hand - those of us who did "pay the price" of being nerdy little kids in the 80's and 90's should strive to get past it anyway (mental health wise not "just get over it") and see the "nerd culture" thing as a blessing of sorts. We are in the optimal spot to do it. (not saying that that is something easy btw just that NOW is the best of time to start talking about it)</p> - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T10:12:52+00:00 - 2017-05-05T10:12:52+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:mastodon.cloud,2017-05-05:objectId=6334570:objectType=Status - New comment by ohyran - <p><span class="h-card"><a href="https://shitposter.club/moonman" class="u-url mention">@<span>moonman</span></a></span> fair enough - that distinction makes it clearer...</p><p>On the other hand - those of us who did "pay the price" of being nerdy little kids in the 80's and 90's should strive to get past it anyway (mental health wise not "just get over it") and see the "nerd culture" thing as a blessing of sorts. We are in the optimal spot to do it. (not saying that that is something easy btw just that NOW is the best of time to start talking about it)</p> - - - - - - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:shitposter.club,2017-05-05:noticeId=2828496:objectType=note - New note by moonman - things are better now, a lot less kids in america get beaten up and called a fag. still too many. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T10:11:31+00:00 - 2017-05-05T10:11:31+00:00 - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=c997fc73d7f8a8f0 - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2828457:objectType=comment - New comment by moonman - @<a href="https://shitposter.club/user/21787" class="h-card mention" title="Yukari">cutscenes</a> @<a href="https://gs.smuglo.li/user/28250" class="h-card mention" title="Bricky">thatbrickster</a> @<a href="https://gs.smuglo.li/user/35497" class="h-card mention" title="Bokuro Bokusawa">boco</a> i never understood this because nerds had pocket protectors, which was a draftsman engineer thing and therefore smart, while geeks were people in carnivals who bit heads off small animals. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T10:07:57+00:00 - 2017-05-05T10:07:57+00:00 - - - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767 - - - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2828435:objectType=comment - New comment by moonman - @<a href="https://mastodon.cloud/users/ohyran" class="h-card mention" title="Jens Reuterberg">ohyran</a> since i didn't specify i'm talking about people subjected to physical and psychological abuse and not people that are just mad that more people like comic books now. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T10:05:07+00:00 - 2017-05-05T10:05:07+00:00 - - - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:shitposter.club,2017-05-05:noticeId=2828326:objectType=note - New note by moonman - if you were a &quot;nerd&quot; before, like, 2001 you have permanent excuse to hate this kind of shit.   <a href="https://shitposter.club/file/b79fa5644be0d6f22679136e67b7bf45c9c4a74a55c32dd2d0cf15de4ddd5be5.gif" title="https://shitposter.club/file/b79fa5644be0d6f22679136e67b7bf45c9c4a74a55c32dd2d0cf15de4ddd5be5.gif" class="attachment" id="attachment-662105" rel="nofollow external">https://shitposter.club/attachment/662105</a> - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T09:47:42+00:00 - 2017-05-05T09:47:42+00:00 - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=efae3a23b6e05767 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:shitposter.club,2017-05-05:noticeId=2828250:objectType=note - New note by moonman - <a href="https://shitposter.club/file/1283e2d4dd8f96b8eeb5d9a16b318e210868aa11386cf0d593891e4c75c9126e.gif" title="https://shitposter.club/file/1283e2d4dd8f96b8eeb5d9a16b318e210868aa11386cf0d593891e4c75c9126e.gif" class="attachment" id="attachment-662098" rel="nofollow external">https://shitposter.club/attachment/662098</a> - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T09:39:06+00:00 - 2017-05-05T09:39:06+00:00 - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=ea8ffae90546f0ab - - - - - - - - tag:shitposter.club,2017-05-05:fave:1:comment:2828161:2017-05-05T09:28:19+00:00 - Favorite - moonman favorited something by kro: @<a href="https://shitposter.club/user/1" class="h-card u-url p-nickname mention" title="Generic Enemy">moonman</a> Till Brooklyn? - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T09:28:19+00:00 - 2017-05-05T09:28:19+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:gs.smuglo.li,2017-05-05:noticeId=2188587:objectType=comment - New comment by kro - @<a href="https://shitposter.club/user/1" class="h-card u-url p-nickname mention" title="Generic Enemy">moonman</a> Till Brooklyn? - - - - - - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=d7aa6b5b057ca555 - - - - - - - tag:shitposter.club,2017-05-05:fave:1:comment:2828125:2017-05-05T09:24:56+00:00 - Favorite - moonman favorited something by hardbass2k8: this has obviously interesting implications in various places, for example:<br /> the nationalism of the nazis might not have been real, who would have thought?<br /> socialism is usually promoted to implementation by real douchebags!<br /> your local social justice people might want diversity but they don't want you, m/19, white, why?<br /> amateur soccer club, they want to be the best in the amateur league but actually they just get drunk after training and are 50% overweight.<br /> This is because humans are not capable of telepathy, so if you join a group it doesn't magically align every little bit of your being with the declared group goals.<br /> <br /> Even though you see unmanned group beliefs flying around from time to time, generally groups are created from a bunch of people. they are not a container for people, they are the people inside them.<br /> <br /> so if you see a group that appears to be cool don't think of it as cool because its goals are cool but because its members are cool. if they aren't, tough cookies. don't be the retard and end up on the camp watchtower. - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T09:24:56+00:00 - 2017-05-05T09:24:56+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2828125:objectType=comment - New comment by hardbass2k8 - this has obviously interesting implications in various places, for example:<br /> the nationalism of the nazis might not have been real, who would have thought?<br /> socialism is usually promoted to implementation by real douchebags!<br /> your local social justice people might want diversity but they don't want you, m/19, white, why?<br /> amateur soccer club, they want to be the best in the amateur league but actually they just get drunk after training and are 50% overweight.<br /> This is because humans are not capable of telepathy, so if you join a group it doesn't magically align every little bit of your being with the declared group goals.<br /> <br /> Even though you see unmanned group beliefs flying around from time to time, generally groups are created from a bunch of people. they are not a container for people, they are the people inside them.<br /> <br /> so if you see a group that appears to be cool don't think of it as cool because its goals are cool but because its members are cool. if they aren't, tough cookies. don't be the retard and end up on the camp watchtower. - - - - - - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=51b227fe92f6babf - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:shitposter.club,2017-05-05:noticeId=2828128:objectType=note - New note by moonman - In a valid remake of They live, signs would say REBEL, and DON'T GET MARRIED AND HAVE KIDS - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T09:24:23+00:00 - 2017-05-05T09:24:23+00:00 - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=b74397fa766b82c9 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:shitposter.club,2017-05-05:noticeId=2828104:objectType=note - New note by moonman - <a href="https://shitposter.club/file/4d34178bde99599f31a28928e1666fbd58448d8a22e94ed82222496e4a45cb07.gif" title="https://shitposter.club/file/4d34178bde99599f31a28928e1666fbd58448d8a22e94ed82222496e4a45cb07.gif" class="attachment" id="attachment-662049" rel="nofollow external">https://shitposter.club/attachment/662049</a> - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T09:21:01+00:00 - 2017-05-05T09:21:01+00:00 - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=d7aa6b5b057ca555 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:shitposter.club,2017-05-05:noticeId=2828102:objectType=note - New note by moonman - when ppl find out i haven't always been serious  <a href="https://shitposter.club/file/5859fa95875342cc65dba0d852f726db158ce28198c326d5f13d9de7c0d2c449.gif" title="https://shitposter.club/file/5859fa95875342cc65dba0d852f726db158ce28198c326d5f13d9de7c0d2c449.gif" class="attachment" id="attachment-662053" rel="nofollow external">https://shitposter.club/attachment/662053</a> - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T09:20:45+00:00 - 2017-05-05T09:20:45+00:00 - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=0a025ac5a570b4ec - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2828086:objectType=comment - New comment by moonman - @<a href="https://shitposter.club/user/9655" class="h-card mention" title="Solidarity for Pigs">neimzr4luzerz</a> @<a href="https://gs.smuglo.li/user/2326" class="h-card mention" title="Dolus_McHonest">dolus</a> @<a href="https://gs.smuglo.li/user/35497" class="h-card mention" title="Bokuro Bokusawa">boco</a> you are being too serious lol - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T09:17:19+00:00 - 2017-05-05T09:17:19+00:00 - - - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26 - - - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:shitposter.club,2017-05-05:noticeId=2828085:objectType=note - New note by moonman - shitposter dot club  <a href="https://shitposter.club/file/9b084c7210b16abbf4d28594b924a07ef4a2a06f89d901a4c42fb1e243291263.gif" title="https://shitposter.club/file/9b084c7210b16abbf4d28594b924a07ef4a2a06f89d901a4c42fb1e243291263.gif" class="attachment" id="attachment-662047" rel="nofollow external">https://shitposter.club/attachment/662047</a> - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T09:16:50+00:00 - 2017-05-05T09:16:50+00:00 - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=d1ae088a1b91e5e5 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:shitposter.club,2017-05-05:noticeId=2828061:objectType=note - New note by moonman - even when i lie i tell the truth, is that so hard to understand? - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T09:15:07+00:00 - 2017-05-05T09:15:07+00:00 - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=a516e4b8506b8ef5 - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2828052:objectType=comment - New comment by moonman - @<a href="https://shitposter.club/user/9591" class="h-card mention" title="warum hei&#xDF;en deutschl&#xE4;nder deutschl&#xE4;nder">hardbass2k8</a> history, anthropology. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T09:14:22+00:00 - 2017-05-05T09:14:22+00:00 - - - - tag:shitposter.club,2017-05-05:objectType=thread:nonce=fe4d7f35b13403ba - - - - - - - diff --git a/test/fixtures/tesla_mock/https___shitposter.club_notice_2827873.json b/test/fixtures/tesla_mock/https___shitposter.club_notice_2827873.json deleted file mode 100644 index 4b7b4df44..000000000 --- a/test/fixtures/tesla_mock/https___shitposter.club_notice_2827873.json +++ /dev/null @@ -1 +0,0 @@ -{"@context":["https://www.w3.org/ns/activitystreams","https://shitposter.club/schemas/litepub-0.1.jsonld",{"@language":"und"}],"actor":"https://shitposter.club/users/moonman","attachment":[],"attributedTo":"https://shitposter.club/users/moonman","cc":["https://shitposter.club/users/moonman/followers"],"content":"@neimzr4luzerz @dolus childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English","context":"tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26","conversation":"tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26","id":"tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment","inReplyTo":"tag:shitposter.club,2017-05-05:noticeId=2827849:objectType=comment","inReplyToStatusId":2827849,"published":"2017-05-05T08:51:48Z","sensitive":false,"summary":null,"tag":[],"to":["https://www.w3.org/ns/activitystreams#Public"],"type":"Note"} \ No newline at end of file diff --git a/test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml b/test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml deleted file mode 100644 index 6cba5c28f..000000000 --- a/test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml +++ /dev/null @@ -1,591 +0,0 @@ - - - GNU social - https://social.heldscal.la/api/statuses/user_timeline/23211.atom - lambadalambda timeline - Updates from lambadalambda on social.heldscal.la! - https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg - 2017-05-05T12:01:21+00:00 - - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - Call me Deacon Blues. - - - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - - Berlin - - - homepage - https://heldscal.la - true - - - - - - - - - - - - - - tag:social.heldscal.la,2017-05-05:fave:23211:comment:2063249:2017-05-05T11:40:21+00:00 - Favorite - lambadalambda favorited something by tatiana: <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> they will start complaining about this, but won't come up with any solutions)</p> - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T11:40:21+00:00 - 2017-05-05T11:40:21+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:social.weho.st,2017-05-05:objectId=172033:objectType=Status - New comment by tatiana - <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> they will start complaining about this, but won't come up with any solutions)</p> - - - - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198 - - - - - - - tag:social.heldscal.la,2017-05-05:fave:23211:comment:2063041:2017-05-05T11:27:28+00:00 - Favorite - lambadalambda favorited something by kat: @<a href="https://social.heldscal.la/lambadalambda" class="h-card mention" title="Constance Variable">lambadalambda</a> if the admin reading mine would delete a few it would be really useful in prioritising.  - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T11:27:28+00:00 - 2017-05-05T11:27:28+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:quitter.se,2017-05-05:noticeId=11807959:objectType=comment - New comment by kat - @<a href="https://social.heldscal.la/lambadalambda" class="h-card mention" title="Constance Variable">lambadalambda</a> if the admin reading mine would delete a few it would be really useful in prioritising.  - - - - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198 - - - - - - - tag:social.heldscal.la,2017-05-05:noticeId=2062924:objectType=note - lambadalambda repeated a notice by nielsk - RT @nielsk @<a href="https://social.heldscal.la/user/23211" class="h-card u-url p-nickname mention" title="Constance Variable">lambadalambda</a> but there are soooo many, where should I start to read? - - http://activitystrea.ms/schema/1.0/share - 2017-05-05T11:09:37+00:00 - 2017-05-05T11:09:37+00:00 - - http://activitystrea.ms/schema/1.0/activity - tag:mastodon.social,2017-05-05:objectId=5024471:objectType=Status - - <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> but there are soooo many, where should I start to read?</p> - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T11:05:18+00:00 - 2017-05-05T11:05:18+00:00 - - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/nielsk - nielsk - Sysadmin by day and ehm… sysadmin by night. Besides that old video games, Japan, economics and some other stuff - - - - - - nielsk - nielsk - Sysadmin by day and ehm… sysadmin by night. Besides that old video games, Japan, economics and some other stuff - - - - http://activitystrea.ms/schema/1.0/comment - tag:mastodon.social,2017-05-05:objectId=5024471:objectType=Status - New comment by nielsk - <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> but there are soooo many, where should I start to read?</p> - - - - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198 - - - - https://mastodon.social/users/nielsk.atom - nielsk - - - https://social.heldscal.la/avatar/29849-96-20170428120041.jpeg - 2017-05-05T11:06:32+00:00 - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198 - - - - - - - tag:social.heldscal.la,2017-05-05:fave:23211:comment:2062875:2017-05-05T11:09:27+00:00 - Favorite - lambadalambda favorited something by nielsk: <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> but there are soooo many, where should I start to read?</p> - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T11:09:27+00:00 - 2017-05-05T11:09:27+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:mastodon.social,2017-05-05:objectId=5024471:objectType=Status - New comment by nielsk - <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> but there are soooo many, where should I start to read?</p> - - - - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198 - - - - - - - tag:social.heldscal.la,2017-05-05:fave:23211:comment:2062863:2017-05-05T11:09:11+00:00 - Favorite - lambadalambda favorited something by kasil: <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> surely, google is not that evil !</p> - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T11:09:11+00:00 - 2017-05-05T11:09:11+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:loutre.info,2017-05-05:objectId=23331:objectType=Status - New comment by kasil - <p><span class="h-card"><a href="https://social.heldscal.la/lambadalambda" class="u-url mention">@<span>lambadalambda</span></a></span> surely, google is not that evil !</p> - - - - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198 - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:social.heldscal.la,2017-05-05:noticeId=2062767:objectType=comment - New comment by lambadalambda - @<a href="https://sealion.club/user/4" class="h-card u-url p-nickname mention" title="dewoo &#x274E;">dwmatiz</a> dunno, probably. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T10:55:17+00:00 - 2017-05-05T10:55:17+00:00 - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198 - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:social.heldscal.la,2017-05-05:noticeId=2062705:objectType=comment - New comment by lambadalambda - @<a href="https://gs.smuglo.li/user/28250" class="h-card u-url p-nickname mention" title="Bricky">thatbrickster</a> I do it, too. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T10:48:12+00:00 - 2017-05-05T10:48:12+00:00 - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198 - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:social.heldscal.la,2017-05-05:noticeId=2062620:objectType=comment - New comment by lambadalambda - @<a href="https://social.tchncs.de/users/israuor" class="h-card u-url p-nickname mention" title="Israuor &#x2642;">israuor</a> @<a href="https://mastodon.gougere.fr/users/bortzmeyer" class="h-card u-url p-nickname mention" title="S. Bortzmeyer &#x2705;">bortzmeyer</a> so, 99%. 100% for 'normal' people. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T10:38:52+00:00 - 2017-05-05T10:38:52+00:00 - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198 - - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.heldscal.la,2017-05-05:noticeId=2062583:objectType=note - New note by lambadalambda - I wonder what'll happen when people realize the admin at their mail hoster can read all their e-mails. - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T10:35:45+00:00 - 2017-05-05T10:35:45+00:00 - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=e95b99adc050e198 - - - - - - - tag:social.heldscal.la,2017-05-05:subscription:23211:person:35708:2017-05-05T09:34:46+00:00 - Constance Variable (lambadalambda@social.heldscal.la)'s status on Friday, 05-May-2017 09:34:46 UTC - <a href="https://social.heldscal.la/lambadalambda">Constance Variable</a> started following <a href="https://mastodon.social/@milouse">milouse</a>. - - http://activitystrea.ms/schema/1.0/follow - 2017-05-05T09:34:46+00:00 - 2017-05-05T09:34:46+00:00 - - http://activitystrea.ms/schema/1.0/person - https://mastodon.social/users/milouse - milouse - #Scout leader #sgdf, interested in #openweb, #semanticweb, #privacy, #foss and #socialeconomy. 0xA714ECAC8C9CEE3D - - - - - - milouse - milouse - #Scout leader #sgdf, interested in #openweb, #semanticweb, #privacy, #foss and #socialeconomy. 0xA714ECAC8C9CEE3D - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=26ca19a355bb6135 - - - - - - - tag:social.heldscal.la,2017-05-05:noticeId=2061871:objectType=note - lambadalambda repeated a notice by safebot - RT @<a href="https://gs.smuglo.li/user/25857" class="h-card u-url p-nickname mention" title="safebot">safebot</a> #<span class="tag"><a href="https://social.heldscal.la/tag/cheers" rel="tag">cheers</a></span> <a href="https://gs.smuglo.li/attachment/456444" title="https://gs.smuglo.li/attachment/456444" rel="nofollow external noreferrer" class="attachment" id="attachment-432334">https://gs.smuglo.li/attachment/456444</a> - - http://activitystrea.ms/schema/1.0/share - 2017-05-05T09:16:17+00:00 - 2017-05-05T09:16:17+00:00 - - http://activitystrea.ms/schema/1.0/activity - tag:gs.smuglo.li,2017-05-05:noticeId=2188073:objectType=note - - #<span class="tag"><a href="https://gs.smuglo.li/tag/cheers" rel="tag">cheers</a></span> <a href="https://gs.smuglo.li/file/5099e73c83da778cd032a721e96880f99a868b712be2975d08238547a5ba06c7.jpg" title="https://gs.smuglo.li/file/5099e73c83da778cd032a721e96880f99a868b712be2975d08238547a5ba06c7.jpg" rel="nofollow noreferrer" class="attachment">https://gs.smuglo.li/attachment/456444</a> - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T08:36:53+00:00 - 2017-05-05T08:36:53+00:00 - - http://activitystrea.ms/schema/1.0/person - https://gs.smuglo.li/user/25857 - safebot - - - - - - safebot - safebot - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.smuglo.li,2017-05-05:noticeId=2188073:objectType=note - New note by safebot - #<span class="tag"><a href="https://gs.smuglo.li/tag/cheers" rel="tag">cheers</a></span> <a href="https://gs.smuglo.li/file/5099e73c83da778cd032a721e96880f99a868b712be2975d08238547a5ba06c7.jpg" title="https://gs.smuglo.li/file/5099e73c83da778cd032a721e96880f99a868b712be2975d08238547a5ba06c7.jpg" rel="nofollow noreferrer" class="attachment">https://gs.smuglo.li/attachment/456444</a> - - - - - https://gs.smuglo.li/conversation/1009429 - - - - https://gs.smuglo.li/api/statuses/user_timeline/25857.atom - safebot - - - https://social.heldscal.la/avatar/25719-original-20161215233234.jpeg - 2017-05-05T12:00:57+00:00 - - - - https://gs.smuglo.li/conversation/1009429 - - - - - - - tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061643:2017-05-05T09:12:50+00:00 - Favorite - lambadalambda favorited something by moonman: @<a href="https://shitposter.club/user/9655" class="h-card mention" title="Solidarity for Pigs">neimzr4luzerz</a> @<a href="https://gs.smuglo.li/user/2326" class="h-card mention" title="Dolus_McHonest">dolus</a> childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T09:12:50+00:00 - 2017-05-05T09:12:50+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment - New comment by moonman - @<a href="https://shitposter.club/user/9655" class="h-card mention" title="Solidarity for Pigs">neimzr4luzerz</a> @<a href="https://gs.smuglo.li/user/2326" class="h-card mention" title="Dolus_McHonest">dolus</a> childhood poring over Strong's concordance and a koine Greek dictionary, fast forward to 2017 and some fuckstick who translates japanese jackoff material tells me you just need to make it sound right in English - - - - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4 - - - - - - - tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061696:2017-05-05T09:06:10+00:00 - Favorite - lambadalambda favorited something by moonman: @<a href="https://shitposter.club/user/9655" class="h-card mention" title="Solidarity for Pigs">neimzr4luzerz</a> <br /> <span class="greentext">&gt; (((common era)))</span> - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T09:06:10+00:00 - 2017-05-05T09:06:10+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2827918:objectType=comment - New comment by moonman - @<a href="https://shitposter.club/user/9655" class="h-card mention" title="Solidarity for Pigs">neimzr4luzerz</a> <br /> <span class="greentext">&gt; (((common era)))</span> - - - - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4 - - - - - - - tag:social.heldscal.la,2017-05-05:fave:23211:note:2061673:2017-05-05T08:58:28+00:00 - Favorite - lambadalambda favorited something by moonman: discussion is one thing but any argument I've heard over and over again for the last three decades is going to go unanswered. - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T08:58:28+00:00 - 2017-05-05T08:58:28+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:shitposter.club,2017-05-05:noticeId=2827895:objectType=note - New note by moonman - discussion is one thing but any argument I've heard over and over again for the last three decades is going to go unanswered. - - - - - - - https://shitposter.club/conversation/1390494 - - - - - - - tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061280:2017-05-05T08:47:38+00:00 - Favorite - lambadalambda favorited something by moonman: @<a href="https://shitposter.club/user/9655" class="h-card mention" title="Solidarity for Pigs">neimzr4luzerz</a> sex is for procreation and as an expression of intimacy between commited couples, it is a sacramental act - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T08:47:38+00:00 - 2017-05-05T08:47:38+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2827561:objectType=comment - New comment by moonman - @<a href="https://shitposter.club/user/9655" class="h-card mention" title="Solidarity for Pigs">neimzr4luzerz</a> sex is for procreation and as an expression of intimacy between commited couples, it is a sacramental act - - - - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=55ead90125cd4bd4 - - - - - - - tag:social.heldscal.la,2017-05-05:fave:23211:note:2061535:2017-05-05T08:40:55+00:00 - Favorite - lambadalambda favorited something by fortune: What did Mickey Mouse get for Christmas?<br /> <br /> A Dan Quayle watch.<br /> <br /> -- heard from a Mike Dukakis field worker - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T08:40:55+00:00 - 2017-05-05T08:40:55+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:social.heldscal.la,2017-05-05:noticeId=2061535:objectType=note - New note by fortune - What did Mickey Mouse get for Christmas?<br /> <br /> A Dan Quayle watch.<br /> <br /> -- heard from a Mike Dukakis field worker - - - - - - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=5185e5c145ee4762 - - - - - - - tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061421:2017-05-05T08:36:27+00:00 - Favorite - lambadalambda favorited something by moonman: @<a href="https://maly.io/users/sonya" class="h-card mention" title="Sonya Mann ✅">sonya</a> banned from 4chan. you better watch ou. i'm trouble, y'hear? - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T08:36:27+00:00 - 2017-05-05T08:36:27+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2827689:objectType=comment - New comment by moonman - @<a href="https://maly.io/users/sonya" class="h-card mention" title="Sonya Mann ✅">sonya</a> banned from 4chan. you better watch ou. i'm trouble, y'hear? - - - - - - - https://shitposter.club/conversation/1389345 - - - - - - - tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061351:2017-05-05T08:28:03+00:00 - Favorite - lambadalambda favorited something by moonman: @<a href="https://social.heldscal.la/user/29138" class="h-card mention" title="Claes Wallin (韋嘉誠)">clacke</a> is that the sequel to Time Crisis - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T08:28:03+00:00 - 2017-05-05T08:28:03+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2827630:objectType=comment - New comment by moonman - @<a href="https://social.heldscal.la/user/29138" class="h-card mention" title="Claes Wallin (韋嘉誠)">clacke</a> is that the sequel to Time Crisis - - - - - - - https://shitposter.club/conversation/1385528 - - - - - - - tag:social.heldscal.la,2017-05-05:fave:23211:comment:2061339:2017-05-05T08:21:05+00:00 - Favorite - lambadalambda favorited something by hardbass2k8: @<a href="https://social.heldscal.la/user/23211" class="h-card mention" title="Constance Variable">lambadalambda</a> pretty sure it's money laundering - - http://activitystrea.ms/schema/1.0/favorite - 2017-05-05T08:21:05+00:00 - 2017-05-05T08:21:05+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2017-05-05:noticeId=2827617:objectType=comment - New comment by hardbass2k8 - @<a href="https://social.heldscal.la/user/23211" class="h-card mention" title="Constance Variable">lambadalambda</a> pretty sure it's money laundering - - - - - - - https://shitposter.club/conversation/1387523 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.heldscal.la,2017-05-05:noticeId=2061303:objectType=note - New note by lambadalambda - It's got tattoos, it's got a pierced hood<br /> It's got generation X<br /> It's got lesbians, and vitriol<br /> And sadomasochistic latex sex<br /> It's got Mighty Morphin' power brokers<br /> And Tanya Harding nude<br /> Macrobiotic lacto-vegan non-confrontational free range food<br /> It's got the handshake, peace talk, non-aggression pact<br /> A multicultural integration of segregated historical facts<br /> <br /> #<span class="tag"><a href="https://social.heldscal.la/tag/nsfw" rel="tag">nsfw</a></span> <a href="https://social.heldscal.la/file/61c13b99c92f40ec4865e7a3830da340b187e3de70d94b8da38fd2138bbede3a.jpg" title="https://social.heldscal.la/file/61c13b99c92f40ec4865e7a3830da340b187e3de70d94b8da38fd2138bbede3a.jpg" rel="nofollow external noreferrer" class="attachment" id="attachment-432199">https://social.heldscal.la/attachment/432199</a> <a href="https://social.heldscal.la/file/a88bba1a324da68ee2cfdbcd1c4cde60bd9553298244d6f81731270b71aa80df.jpg" title="https://social.heldscal.la/file/a88bba1a324da68ee2cfdbcd1c4cde60bd9553298244d6f81731270b71aa80df.jpg" rel="nofollow external noreferrer" class="attachment" id="attachment-432200">https://social.heldscal.la/attachment/432200</a> <a href="https://social.heldscal.la/file/887329a303250e73dc2eea06b1f0512fcac4b9d1b534068f03c45f00d5b21c39.jpg" title="https://social.heldscal.la/file/887329a303250e73dc2eea06b1f0512fcac4b9d1b534068f03c45f00d5b21c39.jpg" rel="nofollow external noreferrer" class="attachment" id="attachment-432201">https://social.heldscal.la/attachment/432201</a> <a href="https://social.heldscal.la/file/6d7a1ec15c1368c4c68810434d24da528606fcbccdd1da97b25affafeeb6ffda.jpg" title="https://social.heldscal.la/file/6d7a1ec15c1368c4c68810434d24da528606fcbccdd1da97b25affafeeb6ffda.jpg" rel="nofollow external noreferrer" class="attachment" id="attachment-432202">https://social.heldscal.la/attachment/432202</a> <a href="https://social.heldscal.la/file/2f55f2bb028eb9be744cc82b35a6b86b496d8c3924c700aff55a872ff11df54c.jpg" title="https://social.heldscal.la/file/2f55f2bb028eb9be744cc82b35a6b86b496d8c3924c700aff55a872ff11df54c.jpg" rel="nofollow external noreferrer" class="attachment" id="attachment-432203">https://social.heldscal.la/attachment/432203</a> - - - http://activitystrea.ms/schema/1.0/post - 2017-05-05T08:17:08+00:00 - 2017-05-05T08:17:08+00:00 - - tag:social.heldscal.la,2017-05-05:objectType=thread:nonce=bb6f4343036970e8 - - - - - - - - - - - - diff --git a/test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml b/test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml deleted file mode 100644 index f70fbc695..000000000 --- a/test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml +++ /dev/null @@ -1,719 +0,0 @@ - - - GNU social - https://social.heldscal.la/api/statuses/user_timeline/29191.atom - shp timeline - Updates from shp on social.heldscal.la! - https://social.heldscal.la/avatar/29191-96-20170421154949.jpeg - 2017-05-05T11:57:06+00:00 - - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/29191 - shp - cofe - - - - - - shp - shp - cofe - - cofe - - - - - - - - - - - - - - tag:social.heldscal.la,2017-04-29:noticeId=1967657:objectType=note - shp repeated a notice by lain - RT @<a href="https://social.heldscal.la/user/37181" class="h-card u-url p-nickname mention" title="Lain Iwakura">lain</a> @<a href="https://social.heldscal.la/user/29191" class="h-card u-url p-nickname mention" title="shp">shp</a> @<a href="https://social.heldscal.la/user/23211" class="h-card u-url p-nickname mention">lambadalambda</a> cofe. - - http://activitystrea.ms/schema/1.0/share - 2017-04-29T18:19:34+00:00 - 2017-04-29T18:19:34+00:00 - - http://activitystrea.ms/schema/1.0/activity - https://pleroma.soykaf.com/activities/43d12c05-db3f-4f3d-bee1-d676f264490c - - <a href="https://pleroma.soykaf.com/users/shp">@shp</a> <a href="https://social.heldscal.la/user/23211">@lambadalambda@social.heldscal.la</a> cofe. - - http://activitystrea.ms/schema/1.0/post - 2017-04-29T18:14:36+00:00 - 2017-04-29T18:14:36+00:00 - - http://activitystrea.ms/schema/1.0/person - https://pleroma.soykaf.com/users/lain - lain - Test account - - - - - - lain - Lain Iwakura - Test account - - - - http://activitystrea.ms/schema/1.0/note - https://pleroma.soykaf.com/activities/43d12c05-db3f-4f3d-bee1-d676f264490c - New note by lain - <a href="https://pleroma.soykaf.com/users/shp">@shp</a> <a href="https://social.heldscal.la/user/23211">@lambadalambda@social.heldscal.la</a> cofe. - - - - - tag:social.heldscal.la,2017-04-29:objectType=thread:nonce=e0b75431888efdab - - - https://pleroma.soykaf.com/users/lain/feed.atom - Lain Iwakura - - - https://social.heldscal.la/avatar/43188-96-20170429172422.jpeg - 2017-05-05T08:38:03+00:00 - - - - tag:social.heldscal.la,2017-04-29:objectType=thread:nonce=e0b75431888efdab - - - - - - - tag:social.heldscal.la,2017-04-27:subscription:29191:person:29558:2017-04-27T17:26:37+00:00 - shp (shp@social.heldscal.la)'s status on Thursday, 27-Apr-2017 17:26:37 UTC - <a href="https://social.heldscal.la/shp">shp</a> started following <a href="https://gs.smuglo.li/kfist">KFist</a>. - - http://activitystrea.ms/schema/1.0/follow - 2017-04-27T17:26:37+00:00 - 2017-04-27T17:26:37+00:00 - - http://activitystrea.ms/schema/1.0/person - https://gs.smuglo.li/user/28051 - KFist - I stream thanks to @nepfag. I also drink, shitpost, and fly planes. I visited Japan and it changed my life. Do you love your station? - - - - - - kfist - KFist - I stream thanks to @nepfag. I also drink, shitpost, and fly planes. I visited Japan and it changed my life. Do you love your station? - - homepage - http://smuglo.li:8000/stream.m3u - true - - - - tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=f766240d13ed9c2e - - - - - - - tag:social.heldscal.la,2017-04-27:noticeId=1933030:objectType=note - shp repeated a notice by shpbot - RT @<a href="https://gs.archae.me/user/4687" class="h-card u-url p-nickname mention" title="shpbot">shpbot</a> &gt;QuakeC - - http://activitystrea.ms/schema/1.0/share - 2017-04-27T17:21:10+00:00 - 2017-04-27T17:21:10+00:00 - - http://activitystrea.ms/schema/1.0/activity - tag:gs.archae.me,2017-04-27:noticeId=760881:objectType=note - - <span class='greentext'>&gt;QuakeC</span> - - http://activitystrea.ms/schema/1.0/post - 2017-04-27T17:15:13+00:00 - 2017-04-27T17:15:13+00:00 - - http://activitystrea.ms/schema/1.0/person - https://gs.archae.me/user/4687 - shpbot - - - - - - shpbot - shpbot - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.archae.me,2017-04-27:noticeId=760881:objectType=note - New note by shpbot - <span class='greentext'>&gt;QuakeC</span> - - - - - https://gs.archae.me/conversation/318362 - - - https://gs.archae.me/api/statuses/user_timeline/4687.atom - shpbot - - - https://social.heldscal.la/avatar/31581-original-20170405170019.jpeg - 2017-05-05T11:45:08+00:00 - - - - https://gs.archae.me/conversation/318362 - - - - - - - tag:social.heldscal.la,2017-04-27:subscription:29191:person:23226:2017-04-27T17:20:48+00:00 - shp (shp@social.heldscal.la)'s status on Thursday, 27-Apr-2017 17:20:48 UTC - <a href="https://social.heldscal.la/shp">shp</a> started following <a href="http://quitter.se/taknamay">Internet Turtle Ⓐ 🏴 ✅</a>. - - http://activitystrea.ms/schema/1.0/follow - 2017-04-27T17:20:48+00:00 - 2017-04-27T17:20:48+00:00 - - http://activitystrea.ms/schema/1.0/person - http://quitter.se/user/115823 - Internet Turtle Ⓐ 🏴 ✅ - Scheme programmer, Novice esperantist, Spiritual naturalist - Will listen to your problems for free - XMPP: DarkDungeons94 at chatme.im - - - - - - taknamay - Internet Turtle Ⓐ 🏴 ✅ - Scheme programmer, Novice esperantist, Spiritual naturalist - Will listen to your problems for free - XMPP: DarkDungeons94 at chatme.im - - New Jersey, United States - - - homepage - https://quitter.se/taknamay - true - - - - tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=a66b1fb22020c152 - - - - - - - tag:social.heldscal.la,2017-04-27:subscription:29191:person:29302:2017-04-27T17:20:33+00:00 - shp (shp@social.heldscal.la)'s status on Thursday, 27-Apr-2017 17:20:33 UTC - <a href="https://social.heldscal.la/shp">shp</a> started following <a href="https://icosahedron.website/@Trev">Chillidan Stormrave</a>. - - http://activitystrea.ms/schema/1.0/follow - 2017-04-27T17:20:33+00:00 - 2017-04-27T17:20:33+00:00 - - http://activitystrea.ms/schema/1.0/person - https://icosahedron.website/users/Trev - Trev Prime - web tech, music, ethics. radical individualist. kinda queer. love thy neighbor. always open for conversation. - - - - - - trev - Trev Prime - web tech, music, ethics. radical individualist. kinda queer. love thy neighbor. always open for conversation. - - - tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=781c05bd64ad9520 - - - - - - - tag:social.heldscal.la,2017-04-27:subscription:29191:person:29367:2017-04-27T17:20:27+00:00 - shp (shp@social.heldscal.la)'s status on Thursday, 27-Apr-2017 17:20:27 UTC - <a href="https://social.heldscal.la/shp">shp</a> started following <a href="https://gs.kawa-kun.com/aya">射命丸 文</a>. - - http://activitystrea.ms/schema/1.0/follow - 2017-04-27T17:20:27+00:00 - 2017-04-27T17:20:27+00:00 - - http://activitystrea.ms/schema/1.0/person - https://gs.kawa-kun.com/user/4885 - 射命丸 文 - Traditional Reporter of Fantasy - - - - - - aya - 射命丸 文 - Traditional Reporter of Fantasy - - Gensōkyō - - - homepage - https://danbooru.donmai.us - true - - - - tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=5921da7a934e47ca - - - - - - - tag:social.heldscal.la,2017-04-27:subscription:29191:person:27773:2017-04-27T17:20:18+00:00 - shp (shp@social.heldscal.la)'s status on Thursday, 27-Apr-2017 17:20:18 UTC - <a href="https://social.heldscal.la/shp">shp</a> started following <a href="https://gs.smuglo.li/japananon">JapanAnon</a>. - - http://activitystrea.ms/schema/1.0/follow - 2017-04-27T17:20:18+00:00 - 2017-04-27T17:20:18+00:00 - - http://activitystrea.ms/schema/1.0/person - https://gs.smuglo.li/user/27299 - JapanAnon - 匿名でしていてね! - - - - - - japananon - JapanAnon - 匿名でしていてね! - - ワイヤード - - - homepage - http://www.anonymous-japan.org - true - - - - tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=ae3d819865886cba - - - - - - - tag:social.heldscal.la,2017-04-27:subscription:29191:person:36560:2017-04-27T17:19:30+00:00 - shp (shp@social.heldscal.la)'s status on Thursday, 27-Apr-2017 17:19:30 UTC - <a href="https://social.heldscal.la/shp">shp</a> started following <a href="https://shitposter.club/wareya">wareya</a>. - - http://activitystrea.ms/schema/1.0/follow - 2017-04-27T17:19:30+00:00 - 2017-04-27T17:19:30+00:00 - - http://activitystrea.ms/schema/1.0/person - https://shitposter.club/user/15439 - wareya - Who are you to defy such a perfect being that is the machine? 日本語難しいけど頑張るぜ github.com/wareya wareya.moe Short: reya or war, never "ware" - - - - - - wareya - wareya - Who are you to defy such a perfect being that is the machine? 日本語難しいけど頑張るぜ github.com/wareya wareya.moe Short: reya or war, never "ware" - - - tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=bd88a3cd20b5a418 - - - - - - - tag:social.heldscal.la,2017-04-27:subscription:29191:person:41176:2017-04-27T17:19:21+00:00 - shp (shp@social.heldscal.la)'s status on Thursday, 27-Apr-2017 17:19:21 UTC - <a href="https://social.heldscal.la/shp">shp</a> started following <a href="https://hakui.club/takeshitakenji">竹下憲二 (白)</a>. - - http://activitystrea.ms/schema/1.0/follow - 2017-04-27T17:19:21+00:00 - 2017-04-27T17:19:21+00:00 - - http://activitystrea.ms/schema/1.0/person - https://hakui.club/user/6 - 竹下憲二 (白) - Oh boy. - - - - - - takeshitakenji - 竹下憲二 (白) - Oh boy. - - Seattle, WA - - - homepage - http://gs.kawa-kun.com - true - - - - tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=b139a673deba6963 - - - - - - - tag:social.heldscal.la,2017-04-27:fave:29191:note:1932205:2017-04-27T17:17:46+00:00 - Favorite - shp favorited something by dolus: Looks like Merry is pussing out and caving to pressure. Sad. <a href="https://gs.smuglo.li/file/23e37de3c321248d3f322d8ec042372914568ab4c9431a94e568a61b8146587f.png" title="https://gs.smuglo.li/file/23e37de3c321248d3f322d8ec042372914568ab4c9431a94e568a61b8146587f.png" rel="nofollow noreferrer" class="attachment">https://gs.smuglo.li/attachment/432294</a> <a href="https://gs.smuglo.li/file/e5a9549a19986d59d51750090910f47c186787adf02b2b6ac58df37556887297.png" title="https://gs.smuglo.li/file/e5a9549a19986d59d51750090910f47c186787adf02b2b6ac58df37556887297.png" rel="nofollow noreferrer" class="attachment">https://gs.smuglo.li/attachment/432295</a> <a href="https://gs.smuglo.li/file/2fdfabbc8ab0b8dc135903a8c48c29b440d1f97446b98ced4ad14a54d3b5d41f.png" title="https://gs.smuglo.li/file/2fdfabbc8ab0b8dc135903a8c48c29b440d1f97446b98ced4ad14a54d3b5d41f.png" rel="nofollow noreferrer" class="attachment">https://gs.smuglo.li/attachment/432296</a> <a href="https://gs.smuglo.li/file/af605d7c6fe3a8c26c6d334c2a8e0005f7e86a266f14a5b3755e7d3ac4e226de.png" title="https://gs.smuglo.li/file/af605d7c6fe3a8c26c6d334c2a8e0005f7e86a266f14a5b3755e7d3ac4e226de.png" rel="nofollow noreferrer" class="attachment">https://gs.smuglo.li/attachment/432297</a> - - http://activitystrea.ms/schema/1.0/favorite - 2017-04-27T17:17:46+00:00 - 2017-04-27T17:17:46+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:gs.smuglo.li,2017-04-27:noticeId=2065465:objectType=note - New note by dolus - Looks like Merry is pussing out and caving to pressure. Sad. <a href="https://gs.smuglo.li/file/23e37de3c321248d3f322d8ec042372914568ab4c9431a94e568a61b8146587f.png" title="https://gs.smuglo.li/file/23e37de3c321248d3f322d8ec042372914568ab4c9431a94e568a61b8146587f.png" rel="nofollow noreferrer" class="attachment">https://gs.smuglo.li/attachment/432294</a> <a href="https://gs.smuglo.li/file/e5a9549a19986d59d51750090910f47c186787adf02b2b6ac58df37556887297.png" title="https://gs.smuglo.li/file/e5a9549a19986d59d51750090910f47c186787adf02b2b6ac58df37556887297.png" rel="nofollow noreferrer" class="attachment">https://gs.smuglo.li/attachment/432295</a> <a href="https://gs.smuglo.li/file/2fdfabbc8ab0b8dc135903a8c48c29b440d1f97446b98ced4ad14a54d3b5d41f.png" title="https://gs.smuglo.li/file/2fdfabbc8ab0b8dc135903a8c48c29b440d1f97446b98ced4ad14a54d3b5d41f.png" rel="nofollow noreferrer" class="attachment">https://gs.smuglo.li/attachment/432296</a> <a href="https://gs.smuglo.li/file/af605d7c6fe3a8c26c6d334c2a8e0005f7e86a266f14a5b3755e7d3ac4e226de.png" title="https://gs.smuglo.li/file/af605d7c6fe3a8c26c6d334c2a8e0005f7e86a266f14a5b3755e7d3ac4e226de.png" rel="nofollow noreferrer" class="attachment">https://gs.smuglo.li/attachment/432297</a> - - - - - - - https://gs.smuglo.li/conversation/927473 - - - - - - - tag:social.heldscal.la,2017-04-27:fave:29191:note:1932492:2017-04-27T17:13:55+00:00 - Favorite - shp favorited something by zemichi: <a href="https://gs.smuglo.li/file/1d45ea4ffc95f15037f361b56ad6b89f8451b70ad1ff7a03b7bb0345b8e2227c.jpg" title="https://gs.smuglo.li/file/1d45ea4ffc95f15037f361b56ad6b89f8451b70ad1ff7a03b7bb0345b8e2227c.jpg" rel="nofollow noreferrer" class="attachment">https://gs.smuglo.li/attachment/432344</a><br /> that's a lot of loli - - http://activitystrea.ms/schema/1.0/favorite - 2017-04-27T17:13:55+00:00 - 2017-04-27T17:13:55+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:gs.smuglo.li,2017-04-27:noticeId=2065713:objectType=note - New note by zemichi - <a href="https://gs.smuglo.li/file/1d45ea4ffc95f15037f361b56ad6b89f8451b70ad1ff7a03b7bb0345b8e2227c.jpg" title="https://gs.smuglo.li/file/1d45ea4ffc95f15037f361b56ad6b89f8451b70ad1ff7a03b7bb0345b8e2227c.jpg" rel="nofollow noreferrer" class="attachment">https://gs.smuglo.li/attachment/432344</a><br /> that's a lot of loli - - - - - - - https://gs.smuglo.li/conversation/927673 - - - - - - - tag:social.heldscal.la,2017-04-27:fave:29191:note:1932559:2017-04-27T17:12:46+00:00 - Favorite - shp favorited something by gsimg: <a href="https://gs.kawa-kun.com/file/3435c5cafda46f31cad5abb5837b3521b7b458198507073a496f4d10bad3633b.jpg" title="https://gs.kawa-kun.com/file/3435c5cafda46f31cad5abb5837b3521b7b458198507073a496f4d10bad3633b.jpg" rel="nofollow noreferrer" class="attachment">https://gs.kawa-kun.com/file/3435c5cafda46f31cad5abb5837b3521b7b458198507073a496f4d10bad3633b.jpg</a> #<span class="tag"><a href="https://gs.kawa-kun.com/tag/nsfw" rel="tag">nsfw</a></span> - - http://activitystrea.ms/schema/1.0/favorite - 2017-04-27T17:12:46+00:00 - 2017-04-27T17:12:46+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:gs.kawa-kun.com,2017-04-27:noticeId=1608309:objectType=note - New note by gsimg - <a href="https://gs.kawa-kun.com/file/3435c5cafda46f31cad5abb5837b3521b7b458198507073a496f4d10bad3633b.jpg" title="https://gs.kawa-kun.com/file/3435c5cafda46f31cad5abb5837b3521b7b458198507073a496f4d10bad3633b.jpg" rel="nofollow noreferrer" class="attachment">https://gs.kawa-kun.com/file/3435c5cafda46f31cad5abb5837b3521b7b458198507073a496f4d10bad3633b.jpg</a> #<span class="tag"><a href="https://gs.kawa-kun.com/tag/nsfw" rel="tag">nsfw</a></span> - - - - - - - https://gs.kawa-kun.com/conversation/690817 - - - - - - - tag:social.heldscal.la,2017-04-27:fave:29191:note:1932601:2017-04-27T17:12:28+00:00 - Favorite - shp favorited something by zemichi: <a href="https://gs.smuglo.li/file/5d9114fafea7b9866c9d852bcfeaf66aade65ae26149758346bc5ade7e3fa8f0.jpg" title="https://gs.smuglo.li/file/5d9114fafea7b9866c9d852bcfeaf66aade65ae26149758346bc5ade7e3fa8f0.jpg" rel="nofollow noreferrer" class="attachment">https://gs.smuglo.li/attachment/432372</a> - - http://activitystrea.ms/schema/1.0/favorite - 2017-04-27T17:12:28+00:00 - 2017-04-27T17:12:28+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:gs.smuglo.li,2017-04-27:noticeId=2065821:objectType=note - New note by zemichi - <a href="https://gs.smuglo.li/file/5d9114fafea7b9866c9d852bcfeaf66aade65ae26149758346bc5ade7e3fa8f0.jpg" title="https://gs.smuglo.li/file/5d9114fafea7b9866c9d852bcfeaf66aade65ae26149758346bc5ade7e3fa8f0.jpg" rel="nofollow noreferrer" class="attachment">https://gs.smuglo.li/attachment/432372</a> - - - - - - - https://gs.smuglo.li/conversation/927760 - - - - - - - tag:social.heldscal.la,2017-04-27:noticeId=1932867:objectType=note - shp repeated a notice by shpbot - RT @<a href="https://gs.archae.me/user/4687" class="h-card u-url p-nickname mention" title="shpbot">shpbot</a> <a href="https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg" title="https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg" rel="nofollow external noreferrer" class="attachment" id="attachment-237676">https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg</a> #<span class="tag"><a href="https://social.heldscal.la/tag/2hu" rel="tag">2hu</a></span> #<span class="tag"><a href="https://social.heldscal.la/tag/ordinarymagician" rel="tag">ordinarymagician</a></span> :thinking: <a href="https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg" title="https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg" rel="nofollow external noreferrer" class="attachment" id="attachment-312306">https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg</a> - - http://activitystrea.ms/schema/1.0/share - 2017-04-27T17:11:35+00:00 - 2017-04-27T17:11:35+00:00 - - http://activitystrea.ms/schema/1.0/activity - tag:gs.archae.me,2017-04-27:noticeId=760830:objectType=note - - <a href="https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg" title="https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg" rel="nofollow noreferrer" class="attachment">https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg</a> #<span class="tag"><a href="https://gs.archae.me/tag/2hu" rel="tag">2hu</a></span> #<span class="tag"><a href="https://gs.archae.me/tag/ordinarymagician" rel="tag">ordinarymagician</a></span> :thinking: <a href="https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg" title="https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg" rel="nofollow noreferrer" class="attachment">https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg</a> - - http://activitystrea.ms/schema/1.0/post - 2017-04-27T17:00:08+00:00 - 2017-04-27T17:00:08+00:00 - - http://activitystrea.ms/schema/1.0/person - https://gs.archae.me/user/4687 - shpbot - - - - - - shpbot - shpbot - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.archae.me,2017-04-27:noticeId=760830:objectType=note - New note by shpbot - <a href="https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg" title="https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg" rel="nofollow noreferrer" class="attachment">https://shitposter.club/file/cbf7fbbee1127a9870e871305ca7de70f1eb1bbb79ffe5b3b0f33e37514d14d8.jpg</a> #<span class="tag"><a href="https://gs.archae.me/tag/2hu" rel="tag">2hu</a></span> #<span class="tag"><a href="https://gs.archae.me/tag/ordinarymagician" rel="tag">ordinarymagician</a></span> :thinking: <a href="https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg" title="https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg" rel="nofollow noreferrer" class="attachment">https://shitposter.club/file/abf3f82d9ce28d2293d858af26c75bb5d4fdd091c0d90ca7bc72ea7efba220e4.jpg</a> - - - - - https://gs.archae.me/conversation/318317 - - - - - https://gs.archae.me/api/statuses/user_timeline/4687.atom - shpbot - - - https://social.heldscal.la/avatar/31581-original-20170405170019.jpeg - 2017-05-05T11:45:08+00:00 - - - - https://gs.archae.me/conversation/318317 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.heldscal.la,2017-04-27:noticeId=1932815:objectType=note - New note by shp - federation issues with SPC atm it seems - - - http://activitystrea.ms/schema/1.0/post - 2017-04-27T17:08:55+00:00 - 2017-04-27T17:08:55+00:00 - - tag:social.heldscal.la,2017-04-27:objectType=thread:nonce=645a13c841f51769 - - - - - - - tag:social.heldscal.la,2017-04-26:fave:29191:note:1907285:2017-04-26T06:59:07+00:00 - Favorite - shp favorited something by lambadalambda: Is this the most offensive video on the net? <a href="https://social.heldscal.la/file/4c34bfb81a8155c265031bc48f7e69c29eb0d2941c57daf63f80e17b0e2e5f47.webm" title="https://social.heldscal.la/file/4c34bfb81a8155c265031bc48f7e69c29eb0d2941c57daf63f80e17b0e2e5f47.webm" rel="nofollow noreferrer" class="attachment">https://social.heldscal.la/attachment/402251</a> - - http://activitystrea.ms/schema/1.0/favorite - 2017-04-26T06:59:07+00:00 - 2017-04-26T06:59:07+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:social.heldscal.la,2017-04-26:noticeId=1907285:objectType=note - New note by lambadalambda - Is this the most offensive video on the net? <a href="https://social.heldscal.la/file/4c34bfb81a8155c265031bc48f7e69c29eb0d2941c57daf63f80e17b0e2e5f47.webm" title="https://social.heldscal.la/file/4c34bfb81a8155c265031bc48f7e69c29eb0d2941c57daf63f80e17b0e2e5f47.webm" rel="nofollow external noreferrer" class="attachment" id="attachment-402251">https://social.heldscal.la/attachment/402251</a> - - - - - - - tag:social.heldscal.la,2017-04-26:objectType=thread:nonce=07b02e1328f456af - - - - - - - tag:social.heldscal.la,2017-04-26:noticeId=1907951:objectType=note - shp repeated a notice by shpbot - RT @<a href="https://gs.archae.me/user/4687" class="h-card u-url p-nickname mention" title="shpbot">shpbot</a> <a href="https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg" title="https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg" rel="nofollow external noreferrer" class="attachment" id="attachment-346198">https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg</a> - - http://activitystrea.ms/schema/1.0/share - 2017-04-26T06:58:19+00:00 - 2017-04-26T06:58:19+00:00 - - http://activitystrea.ms/schema/1.0/activity - tag:gs.archae.me,2017-04-26:noticeId=752596:objectType=note - - <a href="https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg" title="https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg" rel="nofollow noreferrer" class="attachment">https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg</a> - - http://activitystrea.ms/schema/1.0/post - 2017-04-26T06:15:07+00:00 - 2017-04-26T06:15:07+00:00 - - http://activitystrea.ms/schema/1.0/person - https://gs.archae.me/user/4687 - shpbot - - - - - - shpbot - shpbot - - - - http://activitystrea.ms/schema/1.0/note - tag:gs.archae.me,2017-04-26:noticeId=752596:objectType=note - New note by shpbot - <a href="https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg" title="https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg" rel="nofollow noreferrer" class="attachment">https://shitposter.club/file/718db06b564841331c72f9df767f8c9459e20c4dddbf0d4e61cd08ecbee7739d.jpg</a> - - - - - https://gs.archae.me/conversation/314010 - - - https://gs.archae.me/api/statuses/user_timeline/4687.atom - shpbot - - - https://social.heldscal.la/avatar/31581-original-20170405170019.jpeg - 2017-05-05T11:45:08+00:00 - - - - https://gs.archae.me/conversation/314010 - - - - - - - tag:social.heldscal.la,2017-04-26:fave:29191:note:1907341:2017-04-26T06:58:16+00:00 - Favorite - shp favorited something by moonman: <a href="https://shitposter.club/file/1377b0894e983599c11e739e406243cabed9f8af7961a2550ecaf97e32de8e60.jpg" title="https://shitposter.club/file/1377b0894e983599c11e739e406243cabed9f8af7961a2550ecaf97e32de8e60.jpg" class="attachment" rel="nofollow">https://shitposter.club/attachment/630989</a> - - http://activitystrea.ms/schema/1.0/favorite - 2017-04-26T06:58:16+00:00 - 2017-04-26T06:58:16+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:shitposter.club,2017-04-26:noticeId=2681941:objectType=note - New note by moonman - <a href="https://shitposter.club/file/1377b0894e983599c11e739e406243cabed9f8af7961a2550ecaf97e32de8e60.jpg" title="https://shitposter.club/file/1377b0894e983599c11e739e406243cabed9f8af7961a2550ecaf97e32de8e60.jpg" class="attachment" rel="nofollow">https://shitposter.club/attachment/630989</a> - - - - - - - https://shitposter.club/conversation/1300990 - - - - - - - tag:social.heldscal.la,2017-04-26:fave:29191:comment:1907412:2017-04-26T06:57:56+00:00 - Favorite - shp favorited something by lambadalambda: @<a href="https://gs.smuglo.li/user/2" class="h-card u-url p-nickname mention" title="nepfag">nepfag</a> <a href="https://cherubini.casa/why-i-shut-down-wizards-town-and-left-mastodon-6d4e631346b3?source=linkShare-89c2f851e979-1493184822&amp;gi=a6a47c5466a0" title="https://cherubini.casa/why-i-shut-down-wizards-town-and-left-mastodon-6d4e631346b3?source=linkShare-89c2f851e979-1493184822&amp;gi=a6a47c5466a0" rel="nofollow noreferrer" class="attachment">https://social.heldscal.la/url/402273</a> - - http://activitystrea.ms/schema/1.0/favorite - 2017-04-26T06:57:56+00:00 - 2017-04-26T06:57:56+00:00 - - http://activitystrea.ms/schema/1.0/comment - tag:social.heldscal.la,2017-04-26:noticeId=1907412:objectType=comment - New comment by lambadalambda - @<a href="https://gs.smuglo.li/user/2" class="h-card u-url p-nickname mention" title="nepfag">nepfag</a> <a href="https://cherubini.casa/why-i-shut-down-wizards-town-and-left-mastodon-6d4e631346b3?source=linkShare-89c2f851e979-1493184822&amp;gi=a6a47c5466a0" title="https://cherubini.casa/why-i-shut-down-wizards-town-and-left-mastodon-6d4e631346b3?source=linkShare-89c2f851e979-1493184822&amp;gi=a6a47c5466a0" rel="nofollow external noreferrer" class="attachment" id="attachment-402273">https://social.heldscal.la/url/402273</a> - - - - - - - tag:social.heldscal.la,2017-04-26:objectType=thread:nonce=85c21eda7aaa7259 - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:social.heldscal.la,2017-04-26:noticeId=1907942:objectType=note - New note by shp - #<span class="tag"><a href="https://social.heldscal.la/tag/cofe" rel="tag">cofe</a></span> time my friends <a href="https://social.heldscal.la/file/ec254b45b3a86ff74bc08bc7e065cb681d77cf7d4cedc9cdcf59e16adf311da3.png" title="https://social.heldscal.la/file/ec254b45b3a86ff74bc08bc7e065cb681d77cf7d4cedc9cdcf59e16adf311da3.png" rel="nofollow external noreferrer" class="attachment" id="attachment-402381">https://social.heldscal.la/attachment/402381</a> - - - http://activitystrea.ms/schema/1.0/post - 2017-04-26T06:57:18+00:00 - 2017-04-26T06:57:18+00:00 - - tag:social.heldscal.la,2017-04-26:objectType=thread:nonce=9c9d9373bccfaf70 - - - - - - - - diff --git a/test/fixtures/tesla_mock/sakamoto.atom b/test/fixtures/tesla_mock/sakamoto.atom deleted file mode 100644 index 648946795..000000000 --- a/test/fixtures/tesla_mock/sakamoto.atom +++ /dev/null @@ -1 +0,0 @@ -http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://social.sakamoto.gq/objects/0ccc1a2c-66b0-4305-b23a-7f7f2b040056New note by eal<a href='https://shitposter.club/user/5381'>@shpuld</a> <a href='https://pleroma.hjkos.com/users/hj'>@hj</a> IM NOT GAY DAD2017-08-04T12:51:26.130592Z2017-08-04T12:51:26.130592Zhttps://pleroma.hjkos.com/contexts/53093c74-2100-4bf4-aac6-66d1973d03efhttps://social.sakamoto.gq/users/ealhttp://activitystrea.ms/schema/1.0/personhttps://social.sakamoto.gq/users/ealeal坂本(・ヮ・)eal \ No newline at end of file diff --git a/test/fixtures/tesla_mock/sakamoto_eal_feed.atom b/test/fixtures/tesla_mock/sakamoto_eal_feed.atom deleted file mode 100644 index 9340d9038..000000000 --- a/test/fixtures/tesla_mock/sakamoto_eal_feed.atom +++ /dev/null @@ -1 +0,0 @@ -https://social.sakamoto.gq/users/eal/feed.atomeal's timeline2017-08-04T14:19:12.683854https://social.sakamoto.gq/users/ealhttp://activitystrea.ms/schema/1.0/personhttps://social.sakamoto.gq/users/ealeal坂本(・ヮ・)ealhttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://social.sakamoto.gq/objects/b79a1721-23f3-45a5-9610-adb08c2afae5New note by ealHonestly, I like all smileys that are not emoji.2017-08-04T14:19:12.675999Z2017-08-04T14:19:12.675999Zhttps://social.sakamoto.gq/contexts/e05ede92-8db9-4963-8b8e-e71a5797d68fhttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://social.sakamoto.gq/objects/45475bf3-2dfc-4d9e-8eae-1f4f86f48982New note by ealThen again, I like all smileys/emoticons that are not emoji.<br>2017-08-04T14:19:10.113373Z2017-08-04T14:19:10.113373Zhttps://social.sakamoto.gq/contexts/852d1605-4dcb-4ba7-9ba4-dfc37ed62fbchttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://social.sakamoto.gq/objects/8f8fd6d6-cc63-40c6-a5d0-1c0e4f919368New note by ealI love the russian-style smiley.2017-08-04T14:18:30.478552Z2017-08-04T14:18:30.478552Zhttps://social.sakamoto.gq/contexts/852d1605-4dcb-4ba7-9ba4-dfc37ed62fbchttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/followhttps://social.sakamoto.gq/activities/6e69df95-f2ad-4b8e-af4a-e93ff93d64e1eal started following https://cybre.space/users/0x3Feal started following https://cybre.space/users/0x3F2017-08-04T14:17:24.942193Z2017-08-04T14:17:24.942193Zhttp://activitystrea.ms/schema/1.0/personhttps://cybre.space/users/0x3Fhttps://cybre.space/users/0x3Fhttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/followhttps://social.sakamoto.gq/activities/54c5e260-0185-4267-a2a6-f5dd9c76c2c9eal started following https://niu.moe/users/ryeeal started following https://niu.moe/users/rye2017-08-04T14:16:35.604739Z2017-08-04T14:16:35.604739Zhttp://activitystrea.ms/schema/1.0/personhttps://niu.moe/users/ryehttps://niu.moe/users/ryehttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/followhttps://social.sakamoto.gq/activities/092ca863-19a8-416c-85d7-d3f23b3c0203eal started following https://mastodon.xyz/users/rafudesueal started following https://mastodon.xyz/users/rafudesu2017-08-04T14:16:10.993429Z2017-08-04T14:16:10.993429Zhttp://activitystrea.ms/schema/1.0/personhttps://mastodon.xyz/users/rafudesuhttps://mastodon.xyz/users/rafudesuhttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/followhttps://social.sakamoto.gq/activities/be5cf702-b127-423b-a6be-5f78f01a4289eal started following https://gs.kawa-kun.com/user/2eal started following https://gs.kawa-kun.com/user/22017-08-04T14:15:41.804611Z2017-08-04T14:15:41.804611Zhttp://activitystrea.ms/schema/1.0/personhttps://gs.kawa-kun.com/user/2https://gs.kawa-kun.com/user/2http://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/followhttps://social.sakamoto.gq/activities/4951e2a1-9bae-4e87-8e98-e6d2f8a52338eal started following https://gs.kawa-kun.com/user/4885eal started following https://gs.kawa-kun.com/user/48852017-08-04T14:15:00.135352Z2017-08-04T14:15:00.135352Zhttp://activitystrea.ms/schema/1.0/personhttps://gs.kawa-kun.com/user/4885https://gs.kawa-kun.com/user/4885http://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/followhttps://social.sakamoto.gq/activities/cadf8745-b9ee-4f6c-af32-bfddb70e4607eal started following https://mastodon.social/users/Murassaeal started following https://mastodon.social/users/Murassa2017-08-04T14:14:36.339560Z2017-08-04T14:14:36.339560Zhttp://activitystrea.ms/schema/1.0/personhttps://mastodon.social/users/Murassahttps://mastodon.social/users/Murassahttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/followhttps://social.sakamoto.gq/activities/a52c9aab-f0e6-4ccb-8dd3-9f417e72a41ceal started following https://mastodon.social/users/rysiekeal started following https://mastodon.social/users/rysiek2017-08-04T14:13:04.061572Z2017-08-04T14:13:04.061572Zhttp://activitystrea.ms/schema/1.0/personhttps://mastodon.social/users/rysiekhttps://mastodon.social/users/rysiekhttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/followhttps://social.sakamoto.gq/activities/738bc887-4cca-4b36-8c86-2b54d4c54732eal started following https://mastodon.hasameli.com/users/munineal started following https://mastodon.hasameli.com/users/munin2017-08-04T14:12:10.514155Z2017-08-04T14:12:10.514155Zhttp://activitystrea.ms/schema/1.0/personhttps://mastodon.hasameli.com/users/muninhttps://mastodon.hasameli.com/users/muninhttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/followhttps://social.sakamoto.gq/activities/dc66ad5a-b776-4180-a8aa-e4c1bf7cb703eal started following https://cybre.space/users/nightpooleal started following https://cybre.space/users/nightpool2017-08-04T14:11:16.046148Z2017-08-04T14:11:16.046148Zhttp://activitystrea.ms/schema/1.0/personhttps://cybre.space/users/nightpoolhttps://cybre.space/users/nightpoolhttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://social.sakamoto.gq/objects/9c5c00d7-3ce4-4c11-b965-dc5c2bda86c5New note by eal<a href='https://mastodon.zombocloud.com/users/staticsafe'>@staticsafe</a> privet )))2017-08-04T14:10:08.812247Z2017-08-04T14:10:08.812247Zhttps://social.sakamoto.gq/contexts/12a33823-0327-4c1c-a591-850ea79331b5http://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/followhttps://social.sakamoto.gq/activities/49798053-1f40-4a71-ad33-106e90630863eal started following https://social.homunyan.com/users/animeirleal started following https://social.homunyan.com/users/animeirl2017-08-04T14:09:44.904792Z2017-08-04T14:09:44.904792Zhttp://activitystrea.ms/schema/1.0/personhttps://social.homunyan.com/users/animeirlhttps://social.homunyan.com/users/animeirlhttp://activitystrea.ms/schema/1.0/favoritehttps://social.sakamoto.gq/activities/2d83a1c5-70a6-45d3-9b84-59d6a70fbb17New favorite by ealeal favorited something2017-08-04T14:07:27.210044Z2017-08-04T14:07:27.210044Zhttp://activitystrea.ms/schema/1.0/notehttps://pleroma.soykaf.com/objects/b831e52f-4ed4-438e-95b4-888897f64f09https://pleroma.hjkos.com/contexts/3ed48205-1e72-4e19-a618-89a0d2ca811ehttp://activitystrea.ms/schema/1.0/favoritehttps://social.sakamoto.gq/activities/06d28bed-544a-496b-8414-1c6d439273b5New favorite by ealeal favorited something2017-08-04T14:05:37.280200Z2017-08-04T14:05:37.280200Zhttp://activitystrea.ms/schema/1.0/notetag:toot-lab.reclaim.technology,2017-08-04:objectId=1166030:objectType=Statustag:p2px.me,2017-08-04:objectType=thread:nonce=f8bfc4d13db6ce91http://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/followhttps://social.sakamoto.gq/activities/72bf19d4-9ad4-4b2f-9cd0-f0d70f4e931beal started following https://mstdn.jp/users/nullkaleal started following https://mstdn.jp/users/nullkal2017-08-04T14:05:04.148904Z2017-08-04T14:05:04.148904Zhttp://activitystrea.ms/schema/1.0/personhttps://mstdn.jp/users/nullkalhttps://mstdn.jp/users/nullkalhttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://social.sakamoto.gq/objects/b0e89515-7621-4e09-b23d-83e192324107New note by eal<a href='https://p2px.me/user/1'>@stitchxd</a> test also2017-08-04T14:04:38.699051Z2017-08-04T14:04:38.699051Ztag:p2px.me,2017-08-04:objectType=thread:nonce=f8bfc4d13db6ce91http://activitystrea.ms/schema/1.0/favoritehttps://social.sakamoto.gq/activities/d8d2006b-6b23-45d6-ba27-39d27587777dNew favorite by ealeal favorited something2017-08-04T14:04:32.106626Z2017-08-04T14:04:32.106626Zhttp://activitystrea.ms/schema/1.0/notetag:p2px.me,2017-08-04:noticeId=222109:objectType=notetag:p2px.me,2017-08-04:objectType=thread:nonce=f8bfc4d13db6ce91http://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/followhttps://social.sakamoto.gq/activities/cb9db95d-ec27-41fa-bebd-5375fc13acb9eal started following https://mastodon.social/users/Gargroneal started following https://mastodon.social/users/Gargron2017-08-04T14:04:04.325531Z2017-08-04T14:04:04.325531Zhttp://activitystrea.ms/schema/1.0/personhttps://mastodon.social/users/Gargronhttps://mastodon.social/users/Gargron \ No newline at end of file diff --git a/test/fixtures/tesla_mock/shp@pleroma.soykaf.com.feed b/test/fixtures/tesla_mock/shp@pleroma.soykaf.com.feed deleted file mode 100644 index b24ef7ab6..000000000 --- a/test/fixtures/tesla_mock/shp@pleroma.soykaf.com.feed +++ /dev/null @@ -1 +0,0 @@ -https://pleroma.soykaf.com/users/shp/feed.atomshp's timeline2017-09-14T08:31:48.911686https://pleroma.soykaf.com/users/shphttp://activitystrea.ms/schema/1.0/personhttps://pleroma.soykaf.com/users/shpshpshpcofeshphttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/followhttps://pleroma.soykaf.com/activities/0b5f5ef2-020a-4f9e-a92b-a2bf21224644shp started following https://pleroma.soykaf.com/users/goozshp started following https://pleroma.soykaf.com/users/gooz2017-09-14T08:31:48.911226Z2017-09-14T08:31:48.911226Zhttp://activitystrea.ms/schema/1.0/personhttps://pleroma.soykaf.com/users/goozhttps://pleroma.soykaf.com/users/goozhttp://activitystrea.ms/schema/1.0/activityhttp://activitystrea.ms/schema/1.0/followhttps://pleroma.soykaf.com/activities/d928b7f7-dc10-478c-859b-cd604770da60shp started following https://niu.moe/users/xiaoyongmaoshp started following https://niu.moe/users/xiaoyongmao2017-09-14T08:16:52.674253Z2017-09-14T08:16:52.674253Zhttp://activitystrea.ms/schema/1.0/personhttps://niu.moe/users/xiaoyongmaohttps://niu.moe/users/xiaoyongmaohttp://activitystrea.ms/schema/1.0/favoritehttps://pleroma.soykaf.com/activities/3f5089b3-f1e5-47b6-8bfe-a9c4a860e724New favorite by shpshp favorited something2017-09-14T08:12:18.213055Z2017-09-14T08:12:18.213055Zhttp://activitystrea.ms/schema/1.0/notehttps://mastodon.xyz/users/Azurolu/statuses/8346804tag:mastodon.xyz,2017-09-14:objectId=3669709:objectType=Conversationhttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/0def9b19-6b0f-44e0-96b3-543fa06a4010New note by shp<a href='https://niu.moe/users/Pasty'>@Pasty</a> I love the peach<br><a href="https://pleroma.soykaf.com/media/7e8bd209-dbd4-481a-a62c-d302d68df16d/__hinanawi_tenshi_touhou_drawn_by_e_o__8c6824f52dd494f6026607570179265f.jpg" class='attachment'>__hinanawi_tenshi_touhou_drawn_…</a>2017-09-14T08:12:04.367142Z2017-09-14T08:12:04.367142Ztag:niu.moe,2017-09-14:objectId=1660781:objectType=Conversationhttp://activitystrea.ms/schema/1.0/favoritehttps://pleroma.soykaf.com/activities/a4170edf-d273-4b82-931d-662aaf3872f3New favorite by shpshp favorited something2017-09-14T08:10:26.205104Z2017-09-14T08:10:26.205104Zhttp://activitystrea.ms/schema/1.0/notehttps://niu.moe/users/NekoiNemo/statuses/3210992tag:niu.moe,2017-09-14:objectId=1660761:objectType=Conversationhttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/c50c47a0-fac5-4781-a7e6-f20e7226d5fcNew note by shp<a href='https://freezepeach.xyz/user/3458'>@hakui</a> <a href='https://pleroma.soykaf.com/users/lain'>@lain</a> you guys are forgetting the pancakes jeez2017-09-14T08:09:30.088418Z2017-09-14T08:09:30.088418Zhttps://pleroma.soykaf.com/contexts/ac9c98ee-3eca-4b4b-9620-64b5e85e2623http://activitystrea.ms/schema/1.0/favoritehttps://pleroma.soykaf.com/activities/2af9f622-5986-483c-83a1-ac59a9035b50New favorite by shpshp favorited something2017-09-14T08:09:16.346235Z2017-09-14T08:09:16.346235Zhttp://activitystrea.ms/schema/1.0/notetag:freezepeach.xyz,2017-09-14:noticeId=3926191:objectType=commenthttps://pleroma.soykaf.com/contexts/ac9c98ee-3eca-4b4b-9620-64b5e85e2623http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/f52aad69-5828-4e0e-bb7b-f2f0869d3ff0New note by shp<a href='https://gs.smuglo.li/user/253'>@kro</a> I'll probs try some of those 2hu mangos2017-09-14T08:09:13.262835Z2017-09-14T08:09:13.262835Ztag:gs.smuglo.li,2017-09-14:objectType=thread:nonce=c4ac2016e07c4123http://activitystrea.ms/schema/1.0/favoritehttps://pleroma.soykaf.com/activities/35743658-efee-46cf-9cdf-487b95709cd5New favorite by shpshp favorited something2017-09-14T08:09:00.517534Z2017-09-14T08:09:00.517534Zhttp://activitystrea.ms/schema/1.0/notetag:gs.smuglo.li,2017-09-14:noticeId=4113226:objectType=commenttag:gs.smuglo.li,2017-09-14:objectType=thread:nonce=c4ac2016e07c4123http://activitystrea.ms/schema/1.0/favoritehttps://pleroma.soykaf.com/activities/22258ba8-58dc-4e09-b476-fe28d3307377New favorite by shpshp favorited something2017-09-14T08:08:38.087136Z2017-09-14T08:08:38.087136Zhttp://activitystrea.ms/schema/1.0/notehttps://pleroma.soykaf.com/objects/13d7809e-5dca-4117-8738-887759392f2chttps://pleroma.soykaf.com/contexts/ac9c98ee-3eca-4b4b-9620-64b5e85e2623http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/f56d640a-0dbd-48af-80b1-06d0dbd26774New note by shp<a href='https://social.sakamoto.gq/users/eal'>@eal</a> ...but neither does my phone<br><br>low brightness, very dark wallpaper (pic related, but even darker, couldn't find the actual version)<br><a href="https://pleroma.soykaf.com/media/6d1b8d57-80ae-41d6-bdea-58fea09ecdf4/phonewallpaper.png" class='attachment'>phonewallpaper.png</a>2017-09-14T08:07:23.081214Z2017-09-14T08:07:23.081214Zhttps://pleroma.soykaf.com/contexts/f4c5d56e-fc58-467b-a8a5-10515c012355http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/d313df1d-121c-4ab8-abd1-e6aedcf55cbdNew note by shp<a href='https://niu.moe/users/Pasty'>@Pasty</a> y-you too2017-09-14T07:55:26.153486Z2017-09-14T07:55:26.153486Ztag:niu.moe,2017-09-14:objectId=1660616:objectType=Conversationhttp://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/7b642424-4edb-48cc-8711-1eafb4745269New note by shp<a href='https://social.sakamoto.gq/users/eal'>@eal</a> bothers me more when sleeping, wore one for nearly 2 years2017-09-14T07:54:53.449227Z2017-09-14T07:54:53.449227Zhttps://pleroma.soykaf.com/contexts/f4c5d56e-fc58-467b-a8a5-10515c012355http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/5bc1bff1-88c3-489d-8efd-7e4755690a18New note by shpquick test2017-09-14T07:54:09.045525Z2017-09-14T07:54:09.045525Zhttps://pleroma.soykaf.com/contexts/cd770c2a-408e-4895-988c-60319298f219http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/956f1fb5-6f2f-433e-ab71-7f732b76f4beNew note by shphad some trouble getting sleep last night. only used phone to check the time a few times (v essential to have a near-black wallpaper to not blind yourself when you do that). can't rember the last time I rolled in the bed for longer than an hour like that2017-09-14T07:51:23.557775Z2017-09-14T07:51:23.557775Zhttps://pleroma.soykaf.com/contexts/f4c5d56e-fc58-467b-a8a5-10515c012355http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/d935d9f2-ebc7-4ff2-b65a-fbf418a60935New note by shp<a href='https://gs.smuglo.li/user/253'>@kro</a> doesn't sound like a bad idea at all2017-09-14T07:49:55.702555Z2017-09-14T07:49:55.702555Ztag:gs.smuglo.li,2017-09-14:objectType=thread:nonce=c4ac2016e07c4123http://activitystrea.ms/schema/1.0/favoritehttps://pleroma.soykaf.com/activities/342c8803-ee16-487d-9488-a39d763073f6New favorite by shpshp favorited something2017-09-14T07:49:41.875840Z2017-09-14T07:49:41.875840Zhttp://activitystrea.ms/schema/1.0/notetag:anticapitalist.party,2017-09-14:objectId=3322865:objectType=Statustag:anticapitalist.party,2017-09-14:objectId=1251751:objectType=Conversationhttp://activitystrea.ms/schema/1.0/favoritehttps://pleroma.soykaf.com/activities/5d98a19b-dd55-4077-9841-142937c613adNew favorite by shpshp favorited something2017-09-14T07:49:30.584265Z2017-09-14T07:49:30.584265Zhttp://activitystrea.ms/schema/1.0/notetag:gs.smuglo.li,2017-09-14:noticeId=4113170:objectType=commenttag:gs.smuglo.li,2017-09-14:objectType=thread:nonce=c4ac2016e07c4123http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/fdf3626a-50ba-458b-9bf7-b5f2cfa505fcNew note by shp<a href='https://pleroma.hjkos.com/users/hj'>@hj</a> c time2017-09-14T07:48:52.805422Z2017-09-14T07:48:52.805422Zhttps://pleroma.hjkos.com/contexts/dc4a3a3e-d366-4c0c-8789-8a9bee3537d9http://activitystrea.ms/schema/1.0/notehttp://activitystrea.ms/schema/1.0/posthttps://pleroma.soykaf.com/objects/c7c8eb17-b669-4827-9fbc-90f1fc54e4b1New note by shp<a href='https://sunshinegardens.org/users/tbny'>@tbny</a> err.. mediterranean from finnish*2017-09-14T07:46:52.764234Z2017-09-14T07:46:52.764234Zhttps://pleroma.soykaf.com/contexts/ac9c98ee-3eca-4b4b-9620-64b5e85e2623 \ No newline at end of file diff --git a/test/fixtures/tesla_mock/spc_5381.atom b/test/fixtures/tesla_mock/spc_5381.atom deleted file mode 100644 index c3288e97b..000000000 --- a/test/fixtures/tesla_mock/spc_5381.atom +++ /dev/null @@ -1,438 +0,0 @@ - - - GNU social - https://shitposter.club/api/statuses/user_timeline/5381.atom - shpuld timeline - Updates from shpuld on Shitposter Club! - https://shitposter.club/avatar/5381-96-20171230093854.png - 2018-02-23T13:42:22+00:00 - - http://activitystrea.ms/schema/1.0/person - https://shitposter.club/user/5381 - shpuld - - - - - - shpuld - shp - - - - - - - - - - - - - tag:shitposter.club,2018-02-23:fave:5381:comment:7387801:2018-02-23T13:39:40+00:00 - Favorite - shpuld favorited something by mayuutann: <p><span class="h-card"><a href="https://freezepeach.xyz/hakui" class="u-url mention">@<span>hakui</span></a></span> <span class="h-card"><a href="https://gs.smuglo.li/histoire" class="u-url mention">@<span>histoire</span></a></span> <span class="h-card"><a href="https://shitposter.club/shpuld" class="u-url mention">@<span>shpuld</span></a></span> <a href="https://mstdn.io/media/_Ee-x91XN0udpfZVO_U" rel="nofollow"><span class="invisible">https://</span><span class="ellipsis">mstdn.io/media/_Ee-x91XN0udpfZ</span><span class="invisible">VO_U</span></a></p> - - http://activitystrea.ms/schema/1.0/favorite - 2018-02-23T13:39:40+00:00 - 2018-02-23T13:39:40+00:00 - - http://activitystrea.ms/schema/1.0/comment - https://mstdn.io/users/mayuutann/statuses/99574950785668071 - New comment by mayuutann - <p><span class="h-card"><a href="https://freezepeach.xyz/hakui" class="u-url mention">@<span>hakui</span></a></span> <span class="h-card"><a href="https://gs.smuglo.li/histoire" class="u-url mention">@<span>histoire</span></a></span> <span class="h-card"><a href="https://shitposter.club/shpuld" class="u-url mention">@<span>shpuld</span></a></span> <a href="https://mstdn.io/media/_Ee-x91XN0udpfZVO_U" rel="nofollow"><span class="invisible">https://</span><span class="ellipsis">mstdn.io/media/_Ee-x91XN0udpfZ</span><span class="invisible">VO_U</span></a></p> - - - - - - - https://freezepeach.xyz/conversation/4182511 - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2018-02-23:noticeId=7387723:objectType=comment - New comment by shpuld - @<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> @<a href="https://pleroma.soykaf.com/users/lain" class="h-card mention" title="&#x2468; lain &#x2468;">lain</a> how naive~ - - - http://activitystrea.ms/schema/1.0/post - 2018-02-23T13:30:15+00:00 - 2018-02-23T13:30:15+00:00 - - - - tag:shitposter.club,2018-02-23:objectType=thread:nonce=2f09acf104aebfe3 - - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2018-02-23:noticeId=7387703:objectType=comment - New comment by shpuld - @<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> @<a href="https://pleroma.soykaf.com/users/lain" class="h-card mention" title="&#x2468; lain &#x2468;">lain</a> you expect anyone to believe that?? - - - http://activitystrea.ms/schema/1.0/post - 2018-02-23T13:28:08+00:00 - 2018-02-23T13:28:08+00:00 - - - - tag:shitposter.club,2018-02-23:objectType=thread:nonce=2f09acf104aebfe3 - - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2018-02-23:noticeId=7387639:objectType=comment - New comment by shpuld - @<a href="https://mstdn.io/users/mayuutann" class="h-card mention" title="Mayutan&#x2615;">mayuutann</a> @<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> pacyuri!! <a href="https://shitposter.club/file/eea140be45df3f993c4533026bf9a78fe8facd296d2fa0c6d02b2e347c5dc30e.jpg" title="https://shitposter.club/file/eea140be45df3f993c4533026bf9a78fe8facd296d2fa0c6d02b2e347c5dc30e.jpg" class="attachment" id="attachment-1589462" rel="nofollow external">https://shitposter.club/attachment/1589462</a> - - - http://activitystrea.ms/schema/1.0/post - 2018-02-23T13:20:38+00:00 - 2018-02-23T13:20:38+00:00 - - - - https://freezepeach.xyz/conversation/4183220 - - - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2018-02-23:noticeId=7387611:objectType=comment - New comment by shpuld - @<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> why is pacyu eating a pizza so cute - - - http://activitystrea.ms/schema/1.0/post - 2018-02-23T13:18:07+00:00 - 2018-02-23T13:18:07+00:00 - - - - https://freezepeach.xyz/conversation/4183220 - - - - - - - - tag:shitposter.club,2018-02-23:fave:5381:comment:7387600:2018-02-23T13:17:52+00:00 - Favorite - shpuld favorited something by mayuutann: <p><span class="h-card"><a href="https://shitposter.club/shpuld" class="u-url mention">@<span>shpuld</span></a></span> <span class="h-card"><a href="https://gs.smuglo.li/histoire" class="u-url mention">@<span>histoire</span></a></span> <span class="h-card"><a href="https://freezepeach.xyz/hakui" class="u-url mention">@<span>hakui</span></a></span> pichu! <a href="https://mstdn.io/media/Crv5eubz1KO0dgBEulI" rel="nofollow"><span class="invisible">https://</span><span class="ellipsis">mstdn.io/media/Crv5eubz1KO0dgB</span><span class="invisible">EulI</span></a></p> - - http://activitystrea.ms/schema/1.0/favorite - 2018-02-23T13:17:52+00:00 - 2018-02-23T13:17:52+00:00 - - http://activitystrea.ms/schema/1.0/comment - https://mstdn.io/users/mayuutann/statuses/99574863865459283 - New comment by mayuutann - <p><span class="h-card"><a href="https://shitposter.club/shpuld" class="u-url mention">@<span>shpuld</span></a></span> <span class="h-card"><a href="https://gs.smuglo.li/histoire" class="u-url mention">@<span>histoire</span></a></span> <span class="h-card"><a href="https://freezepeach.xyz/hakui" class="u-url mention">@<span>hakui</span></a></span> pichu! <a href="https://mstdn.io/media/Crv5eubz1KO0dgBEulI" rel="nofollow"><span class="invisible">https://</span><span class="ellipsis">mstdn.io/media/Crv5eubz1KO0dgB</span><span class="invisible">EulI</span></a></p> - - - - - - - https://freezepeach.xyz/conversation/4182511 - - - - - - - tag:shitposter.club,2018-02-23:fave:5381:comment:7387544:2018-02-23T13:12:43+00:00 - Favorite - shpuld favorited something by mayuutann: <p><span class="h-card"><a href="https://shitposter.club/shpuld" class="u-url mention">@<span>shpuld</span></a></span> wa~~i!! :blobcheer:</p> - - http://activitystrea.ms/schema/1.0/favorite - 2018-02-23T13:12:43+00:00 - 2018-02-23T13:12:43+00:00 - - http://activitystrea.ms/schema/1.0/comment - https://mstdn.io/users/mayuutann/statuses/99574840290947233 - New comment by mayuutann - <p><span class="h-card"><a href="https://shitposter.club/shpuld" class="u-url mention">@<span>shpuld</span></a></span> wa~~i!! :blobcheer:</p> - - - - - - - tag:shitposter.club,2018-02-23:objectType=thread:nonce=d05e2b056274c5ab - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2018-02-23:noticeId=7387555:objectType=comment - New comment by shpuld - @<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> more!! - - - http://activitystrea.ms/schema/1.0/post - 2018-02-23T13:12:23+00:00 - 2018-02-23T13:12:23+00:00 - - - - https://freezepeach.xyz/conversation/4183220 - - - - - - - - tag:shitposter.club,2018-02-23:fave:5381:note:7387537:2018-02-23T13:12:19+00:00 - Favorite - shpuld favorited something by hakui: you have pacyupacyu'd for: 45 minutes 03 seconds - - http://activitystrea.ms/schema/1.0/favorite - 2018-02-23T13:12:19+00:00 - 2018-02-23T13:12:19+00:00 - - http://activitystrea.ms/schema/1.0/note - tag:freezepeach.xyz,2018-02-23:noticeId=6451332:objectType=note - New note by hakui - you have pacyupacyu'd for: 45 minutes 03 seconds - - - - - - - https://freezepeach.xyz/conversation/4183220 - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2018-02-23:noticeId=7387539:objectType=comment - New comment by shpuld - @<a href="https://mstdn.io/users/mayuutann" class="h-card mention" title="Mayutan&#x2615;">mayuutann</a> ndndnd~ - - - http://activitystrea.ms/schema/1.0/post - 2018-02-23T13:11:04+00:00 - 2018-02-23T13:11:04+00:00 - - - - tag:shitposter.club,2018-02-23:objectType=thread:nonce=d05e2b056274c5ab - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2018-02-23:noticeId=7387518:objectType=comment - New comment by shpuld - @<a href="https://mstdn.io/users/mayuutann" class="h-card mention" title="Mayutan&#x2615;">mayuutann</a> well done! mayumayu is so energetic - - - http://activitystrea.ms/schema/1.0/post - 2018-02-23T13:08:50+00:00 - 2018-02-23T13:08:50+00:00 - - - - tag:shitposter.club,2018-02-23:objectType=thread:nonce=d05e2b056274c5ab - - - - - - - - tag:shitposter.club,2018-02-23:fave:5381:note:7387503:2018-02-23T13:08:00+00:00 - Favorite - shpuld favorited something by mayuutann: <p>done with FIGURE MAT!!<br /> (Posted with IFTTT)</p> - - http://activitystrea.ms/schema/1.0/favorite - 2018-02-23T13:08:00+00:00 - 2018-02-23T13:08:00+00:00 - - http://activitystrea.ms/schema/1.0/note - https://mstdn.io/users/mayuutann/statuses/99574825526201897 - New note by mayuutann - <p>done with FIGURE MAT!!<br /> (Posted with IFTTT)</p> - - - - - - - tag:shitposter.club,2018-02-23:objectType=thread:nonce=c6aaa9b91e8d242f - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2018-02-23:noticeId=7387486:objectType=comment - New comment by shpuld - @<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> @<a href="https://a.weirder.earth/users/mutstd" class="h-card mention" title="Mutant Standard">mutstd</a> @<a href="https://donphan.social/users/Siphonay" class="h-card mention" title="Siphonay">siphonay</a> jokes on you I'm oppressively shitposting myself - - - http://activitystrea.ms/schema/1.0/post - 2018-02-23T13:05:44+00:00 - 2018-02-23T13:05:44+00:00 - - - - tag:shitposter.club,2018-02-23:objectType=thread:nonce=5d306467336c9661 - - - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2018-02-23:noticeId=7387466:objectType=comment - New comment by shpuld - @<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> @<a href="https://a.weirder.earth/users/mutstd" class="h-card mention" title="Mutant Standard">mutstd</a> @<a href="https://donphan.social/users/Siphonay" class="h-card mention" title="Siphonay">siphonay</a> how does it feel being hostile - - - http://activitystrea.ms/schema/1.0/post - 2018-02-23T13:04:10+00:00 - 2018-02-23T13:04:10+00:00 - - - - tag:shitposter.club,2018-02-23:objectType=thread:nonce=5d306467336c9661 - - - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2018-02-23:noticeId=7387459:objectType=comment - New comment by shpuld - @<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> gorogoro - - - http://activitystrea.ms/schema/1.0/post - 2018-02-23T13:03:32+00:00 - 2018-02-23T13:03:32+00:00 - - - - https://freezepeach.xyz/conversation/4181784 - - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2018-02-23:noticeId=7387432:objectType=comment - New comment by shpuld - @<a href="https://freezepeach.xyz/user/3458" class="h-card mention" title="&#x5FA1;&#x5712;&#x306F;&#x304F;&#x3044;">hakui</a> ndnd - - - http://activitystrea.ms/schema/1.0/post - 2018-02-23T13:02:05+00:00 - 2018-02-23T13:02:05+00:00 - - - - https://freezepeach.xyz/conversation/4181784 - - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:shitposter.club,2018-02-23:noticeId=7387367:objectType=note - New note by shpuld - dear diary: I'm trying to do work but I can only think of tenshi eating a corndog - - - http://activitystrea.ms/schema/1.0/post - 2018-02-23T12:56:03+00:00 - 2018-02-23T12:56:03+00:00 - - tag:shitposter.club,2018-02-23:objectType=thread:nonce=57f316da416743fc - - - - - - - http://activitystrea.ms/schema/1.0/note - tag:shitposter.club,2018-02-23:noticeId=7387354:objectType=note - New note by shpuld - jesus christ it's such a fridey at work - - - http://activitystrea.ms/schema/1.0/post - 2018-02-23T12:53:50+00:00 - 2018-02-23T12:53:50+00:00 - - tag:shitposter.club,2018-02-23:objectType=thread:nonce=c05eb5e91bdcbdb7 - - - - - - - http://activitystrea.ms/schema/1.0/comment - tag:shitposter.club,2018-02-23:noticeId=7387343:objectType=comment - New comment by shpuld - @<a href="https://gs.smuglo.li/user/589" class="h-card mention" title="&#x16DE;&#x16A9;&#x16B3;&#x16C1;&#x16DE;&#x16A9;&#x16B3;&#x16C1;">dokidoki</a> give them free upgrades to krokodil - - - http://activitystrea.ms/schema/1.0/post - 2018-02-23T12:53:15+00:00 - 2018-02-23T12:53:15+00:00 - - - - https://gs.smuglo.li/conversation/3934774 - - - - - - - diff --git a/test/fixtures/unfollow.xml b/test/fixtures/unfollow.xml deleted file mode 100644 index 7a8f8fd2e..000000000 --- a/test/fixtures/unfollow.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - GNU social - https://social.heldscal.la/api/statuses/user_timeline/23211.atom - lambadalambda timeline - Updates from lambadalambda on social.heldscal.la! - https://social.heldscal.la/avatar/23211-96-20170416114255.jpeg - 2017-05-07T09:54:49+00:00 - - http://activitystrea.ms/schema/1.0/person - https://social.heldscal.la/user/23211 - lambadalambda - Call me Deacon Blues. - - - - - - lambadalambda - Constance Variable - Call me Deacon Blues. - - Berlin - - - homepage - https://heldscal.la - true - - - - - - - - - - - - - undo:tag:social.heldscal.la,2017-05-07:subscription:23211:person:44803:2017-05-07T09:54:48+00:00 - Constance Variable (lambadalambda@social.heldscal.la)'s status on Sunday, 07-May-2017 09:54:49 UTC - <a href="https://social.heldscal.la/lambadalambda">Constance Variable</a> stopped following <a href="https://pawoo.net/@pekorino">mono</a>. - - http://activitystrea.ms/schema/1.0/unfollow - 2017-05-07T09:54:49+00:00 - 2017-05-07T09:54:49+00:00 - - http://activitystrea.ms/schema/1.0/person - https://pawoo.net/users/pekorino - mono - http://shitposter.club/mono 孤独のグルメ - - - - - pekorino - mono - http://shitposter.club/mono 孤独のグルメ - - - tag:social.heldscal.la,2017-05-07:objectType=thread:nonce=6e80caf94e03029f - - - - - - diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index a0ebf65d9..344e27f13 100644 --- a/test/support/http_request_mock.ex +++ b/test/support/http_request_mock.ex @@ -103,14 +103,6 @@ defmodule HttpRequestMock do }} end - def get("https://mastodon.social/users/emelie.atom", _, _, _) do - {:ok, - %Tesla.Env{ - status: 200, - body: File.read!("test/fixtures/tesla_mock/emelie.atom") - }} - end - def get( "https://osada.macgirvin.com/.well-known/webfinger?resource=acct:mike@osada.macgirvin.com", _, @@ -137,14 +129,6 @@ defmodule HttpRequestMock do }} end - def get("https://pawoo.net/users/pekorino.atom", _, _, _) do - {:ok, - %Tesla.Env{ - status: 200, - body: File.read!("test/fixtures/tesla_mock/https___pawoo.net_users_pekorino.atom") - }} - end - def get( "https://pawoo.net/.well-known/webfinger?resource=acct:https://pawoo.net/users/pekorino", _, @@ -158,19 +142,6 @@ defmodule HttpRequestMock do }} end - def get( - "https://social.stopwatchingus-heidelberg.de/api/statuses/user_timeline/18330.atom", - _, - _, - _ - ) do - {:ok, - %Tesla.Env{ - status: 200, - body: File.read!("test/fixtures/tesla_mock/atarifrosch_feed.xml") - }} - end - def get( "https://social.stopwatchingus-heidelberg.de/.well-known/webfinger?resource=acct:https://social.stopwatchingus-heidelberg.de/user/18330", _, @@ -184,27 +155,6 @@ defmodule HttpRequestMock do }} end - def get("https://mamot.fr/users/Skruyb.atom", _, _, _) do - {:ok, - %Tesla.Env{ - status: 200, - body: File.read!("test/fixtures/tesla_mock/https___mamot.fr_users_Skruyb.atom") - }} - end - - def get( - "https://mamot.fr/.well-known/webfinger?resource=acct:https://mamot.fr/users/Skruyb", - _, - _, - [{"accept", "application/xrd+xml,application/jrd+json"}] - ) do - {:ok, - %Tesla.Env{ - status: 200, - body: File.read!("test/fixtures/tesla_mock/skruyb@mamot.fr.atom") - }} - end - def get( "https://social.heldscal.la/.well-known/webfinger?resource=nonexistant@social.heldscal.la", _, @@ -507,19 +457,6 @@ defmodule HttpRequestMock do }} end - def get( - "https://mamot.fr/.well-known/webfinger?resource=https://mamot.fr/users/Skruyb", - _, - _, - _ - ) do - {:ok, - %Tesla.Env{ - status: 200, - body: File.read!("test/fixtures/tesla_mock/skruyb@mamot.fr.atom") - }} - end - def get("http://pawoo.net/.well-known/host-meta", _, _, _) do {:ok, %Tesla.Env{ @@ -647,17 +584,6 @@ defmodule HttpRequestMock do }} end - def get("https://pleroma.soykaf.com/users/lain/feed.atom", _, _, _) do - {:ok, - %Tesla.Env{ - status: 200, - body: - File.read!( - "test/fixtures/tesla_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml" - ) - }} - end - def get(url, _, _, [{"accept", "application/xrd+xml,application/jrd+json"}]) when url in [ "https://pleroma.soykaf.com/.well-known/webfinger?resource=acct:https://pleroma.soykaf.com/users/lain", @@ -670,17 +596,6 @@ defmodule HttpRequestMock do }} end - def get("https://shitposter.club/api/statuses/user_timeline/1.atom", _, _, _) do - {:ok, - %Tesla.Env{ - status: 200, - body: - File.read!( - "test/fixtures/tesla_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml" - ) - }} - end - def get( "https://shitposter.club/.well-known/webfinger?resource=https://shitposter.club/user/1", _, @@ -694,37 +609,10 @@ defmodule HttpRequestMock do }} end - def get("https://shitposter.club/notice/2827873", _, _, _) do - {:ok, - %Tesla.Env{ - status: 200, - body: File.read!("test/fixtures/tesla_mock/https___shitposter.club_notice_2827873.json") - }} - end - - def get("https://shitposter.club/api/statuses/show/2827873.atom", _, _, _) do - {:ok, - %Tesla.Env{ - status: 200, - body: - File.read!( - "test/fixtures/tesla_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml" - ) - }} - end - def get("https://testing.pleroma.lol/objects/b319022a-4946-44c5-9de9-34801f95507b", _, _, _) do {:ok, %Tesla.Env{status: 200}} end - def get("https://shitposter.club/api/statuses/user_timeline/5381.atom", _, _, _) do - {:ok, - %Tesla.Env{ - status: 200, - body: File.read!("test/fixtures/tesla_mock/spc_5381.atom") - }} - end - def get( "https://shitposter.club/.well-known/webfinger?resource=https://shitposter.club/user/5381", _, @@ -746,14 +634,6 @@ defmodule HttpRequestMock do }} end - def get("https://shitposter.club/api/statuses/show/7369654.atom", _, _, _) do - {:ok, - %Tesla.Env{ - status: 200, - body: File.read!("test/fixtures/tesla_mock/7369654.atom") - }} - end - def get("https://shitposter.club/notice/4027863", _, _, _) do {:ok, %Tesla.Env{ @@ -762,14 +642,6 @@ defmodule HttpRequestMock do }} end - def get("https://social.sakamoto.gq/users/eal/feed.atom", _, _, _) do - {:ok, - %Tesla.Env{ - status: 200, - body: File.read!("test/fixtures/tesla_mock/sakamoto_eal_feed.atom") - }} - end - def get("http://social.sakamoto.gq/.well-known/host-meta", _, _, _) do {:ok, %Tesla.Env{ @@ -791,15 +663,6 @@ defmodule HttpRequestMock do }} end - def get( - "https://social.sakamoto.gq/objects/0ccc1a2c-66b0-4305-b23a-7f7f2b040056", - _, - _, - [{"accept", "application/atom+xml"}] - ) do - {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/sakamoto.atom")}} - end - def get("http://mastodon.social/.well-known/host-meta", _, _, _) do {:ok, %Tesla.Env{ @@ -853,28 +716,6 @@ defmodule HttpRequestMock do {:ok, %Tesla.Env{status: 406, body: ""}} end - def get("http://gs.example.org/index.php/api/statuses/user_timeline/1.atom", _, _, _) do - {:ok, - %Tesla.Env{ - status: 200, - body: - File.read!( - "test/fixtures/tesla_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml" - ) - }} - end - - def get("https://social.heldscal.la/api/statuses/user_timeline/29191.atom", _, _, _) do - {:ok, - %Tesla.Env{ - status: 200, - body: - File.read!( - "test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml" - ) - }} - end - def get("http://squeet.me/.well-known/host-meta", _, _, _) do {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/squeet.me_host_meta")}} @@ -996,17 +837,6 @@ defmodule HttpRequestMock do }} end - def get("https://social.heldscal.la/api/statuses/user_timeline/23211.atom", _, _, _) do - {:ok, - %Tesla.Env{ - status: 200, - body: - File.read!( - "test/fixtures/tesla_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml" - ) - }} - end - def get( "https://social.heldscal.la/.well-known/webfinger?resource=https://social.heldscal.la/user/23211", _, @@ -1036,10 +866,6 @@ defmodule HttpRequestMock do }} end - def get("https://mastodon.social/users/lambadalambda.atom", _, _, _) do - {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/lambadalambda.atom")}} - end - def get("https://mastodon.social/users/lambadalambda", _, _, _) do {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/lambadalambda.json")}} end diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 6e096e9ec..cc55a7be7 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -105,7 +105,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do object = data["object"] - |> Map.put("inReplyTo", "https://shitposter.club/notice/2827873") + |> Map.put("inReplyTo", "https://mstdn.io/users/mayuutann/statuses/99568293732299394") data = Map.put(data, "object", object) {:ok, returned_activity} = Transmogrifier.handle_incoming(data) @@ -113,11 +113,11 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do assert activity = Activity.get_create_by_object_ap_id( - "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" + "https://mstdn.io/users/mayuutann/statuses/99568293732299394" ) assert returned_object.data["inReplyTo"] == - "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" + "https://mstdn.io/users/mayuutann/statuses/99568293732299394" end test "it does not fetch reply-to activities beyond max replies depth limit" do @@ -1104,17 +1104,17 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do Map.put( data["object"], "inReplyTo", - "https://shitposter.club/notice/2827873" + "https://mstdn.io/users/mayuutann/statuses/99568293732299394" ) Pleroma.Config.put([:instance, :federation_incoming_replies_max_depth], 5) modified_object = Transmogrifier.fix_in_reply_to(object_with_reply) assert modified_object["inReplyTo"] == - "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" + "https://mstdn.io/users/mayuutann/statuses/99568293732299394" assert modified_object["context"] == - "tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26" + "tag:shitposter.club,2018-02-22:objectType=thread:nonce=e5a7c72d60a9c0e4" end end @@ -1216,7 +1216,9 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do @tag capture_log: true test "returns {:ok, %Object{}} for success case" do assert {:ok, %Object{}} = - Transmogrifier.get_obj_helper("https://shitposter.club/notice/2827873") + Transmogrifier.get_obj_helper( + "https://mstdn.io/users/mayuutann/statuses/99568293732299394" + ) end end diff --git a/test/web/mastodon_api/controllers/search_controller_test.exs b/test/web/mastodon_api/controllers/search_controller_test.exs index 24d1959f8..04dc6f445 100644 --- a/test/web/mastodon_api/controllers/search_controller_test.exs +++ b/test/web/mastodon_api/controllers/search_controller_test.exs @@ -282,18 +282,18 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do capture_log(fn -> {:ok, %{id: activity_id}} = CommonAPI.post(insert(:user), %{ - status: "check out https://shitposter.club/notice/2827873" + status: "check out http://mastodon.example.org/@admin/99541947525187367" }) results = conn - |> get("/api/v1/search?q=https://shitposter.club/notice/2827873") + |> get("/api/v1/search?q=http://mastodon.example.org/@admin/99541947525187367") |> json_response_and_validate_schema(200) - [status, %{"id" => ^activity_id}] = results["statuses"] - - assert status["uri"] == - "tag:shitposter.club,2017-05-05:noticeId=2827873:objectType=comment" + assert [ + %{"url" => "http://mastodon.example.org/@admin/99541947525187367"}, + %{"id" => ^activity_id} + ] = results["statuses"] end) end From 68a74d66596f0e35f0e080de25e4679d2c8b1b76 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Wed, 9 Sep 2020 19:30:42 +0300 Subject: [PATCH 054/182] [#2497] Added missing alias, removed legacy `:adapter` option specification for HTTP.get/_. --- lib/pleroma/helpers/media_helper.ex | 4 ++-- lib/pleroma/instances/instance.ex | 2 +- lib/pleroma/web/media_proxy/media_proxy_controller.ex | 2 +- test/web/mastodon_api/views/account_view_test.exs | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index a1205e10d..d834b4a07 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -14,7 +14,7 @@ defmodule Pleroma.Helpers.MediaHelper do def image_resize(url, options) do with executable when is_binary(executable) <- System.find_executable("convert"), {:ok, args} <- prepare_image_resize_args(options), - {:ok, env} <- HTTP.get(url, [], adapter: [pool: :media]), + {:ok, env} <- HTTP.get(url, [], pool: :media), {:ok, fifo_path} <- mkfifo() do args = List.flatten([fifo_path, args]) run_fifo(fifo_path, env, executable, args) @@ -62,7 +62,7 @@ defmodule Pleroma.Helpers.MediaHelper do def video_framegrab(url) do with executable when is_binary(executable) <- System.find_executable("ffmpeg"), - {:ok, env} <- HTTP.get(url, [], adapter: [pool: :media]), + {:ok, env} <- HTTP.get(url, [], pool: :media), {:ok, fifo_path} <- mkfifo(), args = [ "-y", diff --git a/lib/pleroma/instances/instance.ex b/lib/pleroma/instances/instance.ex index 8bf53c090..4fe4b198d 100644 --- a/lib/pleroma/instances/instance.ex +++ b/lib/pleroma/instances/instance.ex @@ -157,7 +157,7 @@ defmodule Pleroma.Instances.Instance do try do with {:ok, %Tesla.Env{body: html}} <- Pleroma.HTTP.get(to_string(instance_uri), [{"accept", "text/html"}], - adapter: [pool: :media] + pool: :media ), favicon_rel <- html diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 89f4a23bd..acb581459 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -51,7 +51,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do media_proxy_url = MediaProxy.url(url) with {:ok, %{status: status} = head_response} when status in 200..299 <- - Pleroma.HTTP.request("head", media_proxy_url, [], [], adapter: [pool: :media]) do + Pleroma.HTTP.request("head", media_proxy_url, [], [], pool: :media) do content_type = Tesla.get_header(head_response, "content-type") handle_preview(content_type, conn, media_proxy_url) else diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index 5c5aa6cee..793b44fca 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -5,6 +5,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do use Pleroma.DataCase + alias Pleroma.Config alias Pleroma.User alias Pleroma.UserRelationship alias Pleroma.Web.CommonAPI From b4860c57a63b48ded8eaa37b9f40cc0851c78882 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Wed, 9 Sep 2020 19:43:36 +0300 Subject: [PATCH 055/182] [#2497] Formatting fix. --- lib/pleroma/instances/instance.ex | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/pleroma/instances/instance.ex b/lib/pleroma/instances/instance.ex index 4fe4b198d..ad7764f05 100644 --- a/lib/pleroma/instances/instance.ex +++ b/lib/pleroma/instances/instance.ex @@ -156,9 +156,7 @@ defmodule Pleroma.Instances.Instance do defp scrape_favicon(%URI{} = instance_uri) do try do with {:ok, %Tesla.Env{body: html}} <- - Pleroma.HTTP.get(to_string(instance_uri), [{"accept", "text/html"}], - pool: :media - ), + Pleroma.HTTP.get(to_string(instance_uri), [{"accept", "text/html"}], pool: :media), favicon_rel <- html |> Floki.parse_document!() From cad69669fc692da360929a5961e96550de1f1fe1 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Wed, 9 Sep 2020 22:44:38 +0300 Subject: [PATCH 056/182] [#2130] Fixed OAuth OOB authentication for users with enabled MFA. --- lib/pleroma/web/oauth/oauth_controller.ex | 5 ++++- .../o_auth/o_auth/oob_authorization_created.html.eex | 2 +- .../web/templates/o_auth/o_auth/oob_token_exists.html.eex | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/oauth/oauth_controller.ex b/lib/pleroma/web/oauth/oauth_controller.ex index dd00600ea..06b116368 100644 --- a/lib/pleroma/web/oauth/oauth_controller.ex +++ b/lib/pleroma/web/oauth/oauth_controller.ex @@ -145,7 +145,10 @@ defmodule Pleroma.Web.OAuth.OAuthController do def after_create_authorization(%Plug.Conn{} = conn, %Authorization{} = auth, %{ "authorization" => %{"redirect_uri" => @oob_token_redirect_uri} }) do - render(conn, "oob_authorization_created.html", %{auth: auth}) + # Enforcing the view to reuse the template when calling from other controllers + conn + |> put_view(OAuthView) + |> render("oob_authorization_created.html", %{auth: auth}) end def after_create_authorization(%Plug.Conn{} = conn, %Authorization{} = auth, %{ diff --git a/lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex b/lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex index 8443d906b..ffabe29a6 100644 --- a/lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex +++ b/lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex @@ -1,2 +1,2 @@

Successfully authorized

-

Token code is <%= @auth.token %>

+

Token code is
<%= @auth.token %>

diff --git a/lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex b/lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex index 961aad976..82785c4b9 100644 --- a/lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex +++ b/lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex @@ -1,2 +1,2 @@

Authorization exists

-

Access token is <%= @token.token %>

+

Access token is
<%= @token.token %>

From ab56dd54e787eae82cf00fddc90eab4c5cbac4a9 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Thu, 10 Sep 2020 11:23:39 +0300 Subject: [PATCH 057/182] use Pleroma.HTTP in emoji packs tasks --- lib/mix/tasks/pleroma/emoji.ex | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/lib/mix/tasks/pleroma/emoji.ex b/lib/mix/tasks/pleroma/emoji.ex index 8f52ee98d..1750373f9 100644 --- a/lib/mix/tasks/pleroma/emoji.ex +++ b/lib/mix/tasks/pleroma/emoji.ex @@ -183,7 +183,7 @@ defmodule Mix.Tasks.Pleroma.Emoji do IO.puts("Downloading the pack and generating SHA256") - binary_archive = Tesla.get!(client(), src).body + {:ok, %{body: binary_archive}} = Pleroma.HTTP.get(src) archive_sha = :crypto.hash(:sha256, binary_archive) |> Base.encode16() IO.puts("SHA256 is #{archive_sha}") @@ -252,7 +252,7 @@ defmodule Mix.Tasks.Pleroma.Emoji do end defp fetch("http" <> _ = from) do - with {:ok, %{body: body}} <- Tesla.get(client(), from) do + with {:ok, %{body: body}} <- Pleroma.HTTP.get(from) do {:ok, body} end end @@ -271,13 +271,5 @@ defmodule Mix.Tasks.Pleroma.Emoji do ) end - defp client do - middleware = [ - {Tesla.Middleware.FollowRedirects, [max_redirects: 3]} - ] - - Tesla.client(middleware) - end - defp default_manifest, do: Pleroma.Config.get!([:emoji, :default_manifest]) end From 148bc244359e70c87ec2812c65da83fe87efbc68 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Thu, 10 Sep 2020 11:54:10 +0300 Subject: [PATCH 058/182] [#2497] Removed Hackney-specific code (no longer needed due to adapter options unification). --- .../activity_pub/mrf/media_proxy_warming_policy.ex | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex b/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex index 6c63fe15c..0fb05d3c4 100644 --- a/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex @@ -13,17 +13,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy do require Logger @adapter_options [ - pool: :media + pool: :media, + recv_timeout: 10_000 ] - defp adapter_options do - if Application.get_env(:tesla, :adapter) == Tesla.Adapter.Hackney do - Keyword.put(@adapter_options, :recv_timeout, 10_000) - else - @adapter_options - end - end - def perform(:prefetch, url) do # Fetching only proxiable resources if MediaProxy.enabled?() and MediaProxy.url_proxiable?(url) do @@ -32,7 +25,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy do Logger.debug("Prefetching #{inspect(url)} as #{inspect(prefetch_url)}") - HTTP.get(prefetch_url, [], adapter: adapter_options()) + HTTP.get(prefetch_url, [], @adapter_options) end end From 3ce658b93098551792a69f2455e6e9339a1722e2 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Tue, 25 Aug 2020 19:17:51 +0300 Subject: [PATCH 059/182] schedule expired oauth tokens deletion with Oban --- config/config.exs | 2 +- config/description.exs | 1 - lib/pleroma/web/oauth/token.ex | 24 ++++++++++------ lib/pleroma/web/oauth/token/clean_worker.ex | 2 -- lib/pleroma/web/oauth/token/query.ex | 6 ---- .../web/oauth/token/strategy/refresh_token.ex | 2 +- .../workers/cron/clear_oauth_token_worker.ex | 23 --------------- lib/pleroma/workers/purge_expired_token.ex | 28 +++++++++++++++++++ test/plugs/oauth_plug_test.exs | 2 +- test/web/oauth/token_test.exs | 13 --------- .../twitter_api/password_controller_test.exs | 4 +-- .../cron/clear_oauth_token_worker_test.exs | 22 --------------- .../purge_expired_oauth_token_test.exs | 27 ++++++++++++++++++ 13 files changed, 76 insertions(+), 80 deletions(-) delete mode 100644 lib/pleroma/workers/cron/clear_oauth_token_worker.ex create mode 100644 lib/pleroma/workers/purge_expired_token.ex delete mode 100644 test/workers/cron/clear_oauth_token_worker_test.exs create mode 100644 test/workers/purge_expired_oauth_token_test.exs diff --git a/config/config.exs b/config/config.exs index 1a2b312b5..fa4c96b79 100644 --- a/config/config.exs +++ b/config/config.exs @@ -530,6 +530,7 @@ config :pleroma, Oban, log: false, queues: [ activity_expiration: 10, + oauth_token_expiration: 1, federator_incoming: 50, federator_outgoing: 50, web_push: 50, @@ -543,7 +544,6 @@ config :pleroma, Oban, ], plugins: [Oban.Plugins.Pruner], crontab: [ - {"0 0 * * *", Pleroma.Workers.Cron.ClearOauthTokenWorker}, {"* * * * *", Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker}, {"0 0 * * 0", Pleroma.Workers.Cron.DigestEmailsWorker}, {"0 0 * * *", Pleroma.Workers.Cron.NewUsersDigestWorker} diff --git a/config/description.exs b/config/description.exs index eac97ad64..4c4deed30 100644 --- a/config/description.exs +++ b/config/description.exs @@ -2290,7 +2290,6 @@ config :pleroma, :config_description, [ type: {:list, :tuple}, description: "Settings for cron background jobs", suggestions: [ - {"0 0 * * *", Pleroma.Workers.Cron.ClearOauthTokenWorker}, {"* * * * *", Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker}, {"0 0 * * 0", Pleroma.Workers.Cron.DigestEmailsWorker}, {"0 0 * * *", Pleroma.Workers.Cron.NewUsersDigestWorker} diff --git a/lib/pleroma/web/oauth/token.ex b/lib/pleroma/web/oauth/token.ex index 08bb7326d..4d00fcb1c 100644 --- a/lib/pleroma/web/oauth/token.ex +++ b/lib/pleroma/web/oauth/token.ex @@ -50,7 +50,7 @@ defmodule Pleroma.Web.OAuth.Token do true <- auth.app_id == app.id do user = if auth.user_id, do: User.get_cached_by_id(auth.user_id), else: %User{} - create_token( + create( app, user, %{scopes: auth.scopes} @@ -83,8 +83,21 @@ defmodule Pleroma.Web.OAuth.Token do |> validate_required([:valid_until]) end - @spec create_token(App.t(), User.t(), map()) :: {:ok, Token} | {:error, Changeset.t()} - def create_token(%App{} = app, %User{} = user, attrs \\ %{}) do + @spec create(App.t(), User.t(), map()) :: {:ok, Token} | {:error, Changeset.t()} + def create(%App{} = app, %User{} = user, attrs \\ %{}) do + with {:ok, token} <- do_create(app, user, attrs) do + if Pleroma.Config.get([:oauth2, :clean_expired_tokens]) do + Pleroma.Workers.PurgeExpiredOAuthToken.enqueue(%{ + token_id: token.id, + valid_until: DateTime.from_naive!(token.valid_until, "Etc/UTC") + }) + end + + {:ok, token} + end + end + + defp do_create(app, user, attrs) do %__MODULE__{user_id: user.id, app_id: app.id} |> cast(%{scopes: attrs[:scopes] || app.scopes}, [:scopes]) |> validate_required([:scopes, :app_id]) @@ -105,11 +118,6 @@ defmodule Pleroma.Web.OAuth.Token do |> Repo.delete_all() end - def delete_expired_tokens do - Query.get_expired_tokens() - |> Repo.delete_all() - end - def get_user_tokens(%User{id: user_id}) do Query.get_by_user(user_id) |> Query.preload([:app]) diff --git a/lib/pleroma/web/oauth/token/clean_worker.ex b/lib/pleroma/web/oauth/token/clean_worker.ex index e3aa4eb7e..2f51bdb75 100644 --- a/lib/pleroma/web/oauth/token/clean_worker.ex +++ b/lib/pleroma/web/oauth/token/clean_worker.ex @@ -12,7 +12,6 @@ defmodule Pleroma.Web.OAuth.Token.CleanWorker do @one_day 86_400_000 alias Pleroma.MFA - alias Pleroma.Web.OAuth alias Pleroma.Workers.BackgroundWorker def start_link(_), do: GenServer.start_link(__MODULE__, %{}) @@ -32,7 +31,6 @@ defmodule Pleroma.Web.OAuth.Token.CleanWorker do end def perform(:clean) do - OAuth.Token.delete_expired_tokens() MFA.Token.delete_expired_tokens() end end diff --git a/lib/pleroma/web/oauth/token/query.ex b/lib/pleroma/web/oauth/token/query.ex index 93d6e26ed..fd6d9b112 100644 --- a/lib/pleroma/web/oauth/token/query.ex +++ b/lib/pleroma/web/oauth/token/query.ex @@ -33,12 +33,6 @@ defmodule Pleroma.Web.OAuth.Token.Query do from(q in query, where: q.id == ^id) end - @spec get_expired_tokens(query, DateTime.t() | nil) :: query - def get_expired_tokens(query \\ Token, date \\ nil) do - expired_date = date || Timex.now() - from(q in query, where: fragment("?", q.valid_until) < ^expired_date) - end - @spec get_by_user(query, String.t()) :: query def get_by_user(query \\ Token, user_id) do from(q in query, where: q.user_id == ^user_id) diff --git a/lib/pleroma/web/oauth/token/strategy/refresh_token.ex b/lib/pleroma/web/oauth/token/strategy/refresh_token.ex index debc29b0b..625b0fde2 100644 --- a/lib/pleroma/web/oauth/token/strategy/refresh_token.ex +++ b/lib/pleroma/web/oauth/token/strategy/refresh_token.ex @@ -46,7 +46,7 @@ defmodule Pleroma.Web.OAuth.Token.Strategy.RefreshToken do defp create_access_token({:error, error}, _), do: {:error, error} defp create_access_token({:ok, token}, %{app: app, user: user} = token_params) do - Token.create_token(app, user, add_refresh_token(token_params, token.refresh_token)) + Token.create(app, user, add_refresh_token(token_params, token.refresh_token)) end defp add_refresh_token(params, token) do diff --git a/lib/pleroma/workers/cron/clear_oauth_token_worker.ex b/lib/pleroma/workers/cron/clear_oauth_token_worker.ex deleted file mode 100644 index 276f47efc..000000000 --- a/lib/pleroma/workers/cron/clear_oauth_token_worker.ex +++ /dev/null @@ -1,23 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Workers.Cron.ClearOauthTokenWorker do - @moduledoc """ - The worker to cleanup expired oAuth tokens. - """ - - use Oban.Worker, queue: "background" - - alias Pleroma.Config - alias Pleroma.Web.OAuth.Token - - @impl Oban.Worker - def perform(_job) do - if Config.get([:oauth2, :clean_expired_tokens], false) do - Token.delete_expired_tokens() - end - - :ok - end -end diff --git a/lib/pleroma/workers/purge_expired_token.ex b/lib/pleroma/workers/purge_expired_token.ex new file mode 100644 index 000000000..6068e43bf --- /dev/null +++ b/lib/pleroma/workers/purge_expired_token.ex @@ -0,0 +1,28 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Workers.PurgeExpiredOAuthToken do + @moduledoc """ + Worker which purges expired OAuth tokens + """ + + use Oban.Worker, queue: :oauth_token_expiration, max_attempts: 1 + + @spec enqueue(%{token_id: integer(), valid_until: DateTime.t()}) :: + {:ok, Oban.Job.t()} | {:error, Ecto.Changeset.t()} + def enqueue(args) do + {scheduled_at, args} = Map.pop(args, :valid_until) + + args + |> __MODULE__.new(scheduled_at: scheduled_at) + |> Oban.insert() + end + + @impl true + def perform(%Oban.Job{args: %{"token_id" => id}}) do + Pleroma.Web.OAuth.Token + |> Pleroma.Repo.get(id) + |> Pleroma.Repo.delete() + end +end diff --git a/test/plugs/oauth_plug_test.exs b/test/plugs/oauth_plug_test.exs index f74c068cd..9d39d3153 100644 --- a/test/plugs/oauth_plug_test.exs +++ b/test/plugs/oauth_plug_test.exs @@ -16,7 +16,7 @@ defmodule Pleroma.Plugs.OAuthPlugTest do setup %{conn: conn} do user = insert(:user) - {:ok, %{token: token}} = Pleroma.Web.OAuth.Token.create_token(insert(:oauth_app), user) + {:ok, %{token: token}} = Pleroma.Web.OAuth.Token.create(insert(:oauth_app), user) %{user: user, token: token, conn: conn} end diff --git a/test/web/oauth/token_test.exs b/test/web/oauth/token_test.exs index 40d71eb59..c88b9cc98 100644 --- a/test/web/oauth/token_test.exs +++ b/test/web/oauth/token_test.exs @@ -69,17 +69,4 @@ defmodule Pleroma.Web.OAuth.TokenTest do assert tokens == 2 end - - test "deletes expired tokens" do - insert(:oauth_token, valid_until: Timex.shift(Timex.now(), days: -3)) - insert(:oauth_token, valid_until: Timex.shift(Timex.now(), days: -3)) - t3 = insert(:oauth_token) - t4 = insert(:oauth_token, valid_until: Timex.shift(Timex.now(), minutes: 10)) - {tokens, _} = Token.delete_expired_tokens() - assert tokens == 2 - available_tokens = Pleroma.Repo.all(Token) - - token_ids = available_tokens |> Enum.map(& &1.id) - assert token_ids == [t3.id, t4.id] - end end diff --git a/test/web/twitter_api/password_controller_test.exs b/test/web/twitter_api/password_controller_test.exs index 231a46c67..a5e9e2178 100644 --- a/test/web/twitter_api/password_controller_test.exs +++ b/test/web/twitter_api/password_controller_test.exs @@ -37,7 +37,7 @@ defmodule Pleroma.Web.TwitterAPI.PasswordControllerTest do test "it returns HTTP 200", %{conn: conn} do user = insert(:user) {:ok, token} = PasswordResetToken.create_token(user) - {:ok, _access_token} = Token.create_token(insert(:oauth_app), user, %{}) + {:ok, _access_token} = Token.create(insert(:oauth_app), user, %{}) params = %{ "password" => "test", @@ -62,7 +62,7 @@ defmodule Pleroma.Web.TwitterAPI.PasswordControllerTest do user = insert(:user, password_reset_pending: true) {:ok, token} = PasswordResetToken.create_token(user) - {:ok, _access_token} = Token.create_token(insert(:oauth_app), user, %{}) + {:ok, _access_token} = Token.create(insert(:oauth_app), user, %{}) params = %{ "password" => "test", diff --git a/test/workers/cron/clear_oauth_token_worker_test.exs b/test/workers/cron/clear_oauth_token_worker_test.exs deleted file mode 100644 index 67836f34f..000000000 --- a/test/workers/cron/clear_oauth_token_worker_test.exs +++ /dev/null @@ -1,22 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Workers.Cron.ClearOauthTokenWorkerTest do - use Pleroma.DataCase - - import Pleroma.Factory - alias Pleroma.Workers.Cron.ClearOauthTokenWorker - - setup do: clear_config([:oauth2, :clean_expired_tokens]) - - test "deletes expired tokens" do - insert(:oauth_token, - valid_until: NaiveDateTime.add(NaiveDateTime.utc_now(), -60 * 10) - ) - - Pleroma.Config.put([:oauth2, :clean_expired_tokens], true) - ClearOauthTokenWorker.perform(%Oban.Job{}) - assert Pleroma.Repo.all(Pleroma.Web.OAuth.Token) == [] - end -end diff --git a/test/workers/purge_expired_oauth_token_test.exs b/test/workers/purge_expired_oauth_token_test.exs new file mode 100644 index 000000000..3bd650d89 --- /dev/null +++ b/test/workers/purge_expired_oauth_token_test.exs @@ -0,0 +1,27 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Workers.PurgeExpiredOAuthTokenTest do + use Pleroma.DataCase, async: true + use Oban.Testing, repo: Pleroma.Repo + + import Pleroma.Factory + + setup do: clear_config([:oauth2, :clean_expired_tokens], true) + + test "purges expired token" do + user = insert(:user) + app = insert(:oauth_app) + + {:ok, %{id: id}} = Pleroma.Web.OAuth.Token.create(app, user) + + assert_enqueued( + worker: Pleroma.Workers.PurgeExpiredOAuthToken, + args: %{token_id: id} + ) + + assert {:ok, %{id: ^id}} = + perform_job(Pleroma.Workers.PurgeExpiredOAuthToken, %{token_id: id}) + end +end From 7dd986a563545cb63e8404d9b107f1d29c499940 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Sat, 5 Sep 2020 18:35:01 +0300 Subject: [PATCH 060/182] expire mfa tokens through Oban --- config/config.exs | 2 +- docs/configuration/cheatsheet.md | 10 +-- lib/pleroma/mfa/token.ex | 71 +++++++++---------- lib/pleroma/web/oauth/oauth_controller.ex | 4 +- lib/pleroma/web/oauth/token.ex | 5 +- lib/pleroma/web/oauth/token/clean_worker.ex | 36 ---------- .../controllers/remote_follow_controller.ex | 2 +- lib/pleroma/workers/purge_expired_token.ex | 11 +-- .../remote_follow_controller_test.exs | 4 +- .../purge_expired_oauth_token_test.exs | 27 ------- test/workers/purge_expired_token_test.exs | 51 +++++++++++++ 11 files changed, 106 insertions(+), 117 deletions(-) delete mode 100644 lib/pleroma/web/oauth/token/clean_worker.ex delete mode 100644 test/workers/purge_expired_oauth_token_test.exs create mode 100644 test/workers/purge_expired_token_test.exs diff --git a/config/config.exs b/config/config.exs index fa4c96b79..95a6ea9db 100644 --- a/config/config.exs +++ b/config/config.exs @@ -530,7 +530,7 @@ config :pleroma, Oban, log: false, queues: [ activity_expiration: 10, - oauth_token_expiration: 1, + token_expiration: 5, federator_incoming: 50, federator_outgoing: 50, web_push: 50, diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index ec59896ec..d0bebbd45 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -691,9 +691,8 @@ Pleroma has the following queues: Pleroma has these periodic job workers: -`Pleroma.Workers.Cron.ClearOauthTokenWorker` - a job worker to cleanup expired oauth tokens. - -Example: +* `Pleroma.Workers.Cron.DigestEmailsWorker` - digest emails for users with new mentions and follows +* `Pleroma.Workers.Cron.NewUsersDigestWorker` - digest emails for admins with new registrations ```elixir config :pleroma, Oban, @@ -705,7 +704,8 @@ config :pleroma, Oban, federator_outgoing: 50 ], crontab: [ - {"0 0 * * *", Pleroma.Workers.Cron.ClearOauthTokenWorker} + {"0 0 * * 0", Pleroma.Workers.Cron.DigestEmailsWorker}, + {"0 0 * * *", Pleroma.Workers.Cron.NewUsersDigestWorker} ] ``` @@ -972,7 +972,7 @@ Configure OAuth 2 provider capabilities: * `token_expires_in` - The lifetime in seconds of the access token. * `issue_new_refresh_token` - Keeps old refresh token or generate new refresh token when to obtain an access token. -* `clean_expired_tokens` - Enable a background job to clean expired oauth tokens. Defaults to `false`. Interval settings sets in configuration periodic jobs [`Oban.Cron`](#obancron) +* `clean_expired_tokens` - Enable a background job to clean expired oauth tokens. Defaults to `false`. ## Link parsing diff --git a/lib/pleroma/mfa/token.ex b/lib/pleroma/mfa/token.ex index 0b2449971..69b64c0e8 100644 --- a/lib/pleroma/mfa/token.ex +++ b/lib/pleroma/mfa/token.ex @@ -10,10 +10,11 @@ defmodule Pleroma.MFA.Token do alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.OAuth.Authorization - alias Pleroma.Web.OAuth.Token, as: OAuthToken @expires 300 + @type t() :: %__MODULE__{} + schema "mfa_tokens" do field(:token, :string) field(:valid_until, :naive_datetime_usec) @@ -24,6 +25,7 @@ defmodule Pleroma.MFA.Token do timestamps() end + @spec get_by_token(String.t()) :: {:ok, t()} | {:error, :not_found} def get_by_token(token) do from( t in __MODULE__, @@ -33,33 +35,40 @@ defmodule Pleroma.MFA.Token do |> Repo.find_resource() end - def validate(token) do - with {:fetch_token, {:ok, token}} <- {:fetch_token, get_by_token(token)}, - {:expired, false} <- {:expired, is_expired?(token)} do + @spec validate(String.t()) :: {:ok, t()} | {:error, :not_found} | {:error, :expired_token} + def validate(token_str) do + with {:ok, token} <- get_by_token(token_str), + false <- expired?(token) do {:ok, token} - else - {:expired, _} -> {:error, :expired_token} - {:fetch_token, _} -> {:error, :not_found} - error -> {:error, error} end end - def create_token(%User{} = user) do - %__MODULE__{} - |> change - |> assign_user(user) - |> put_token - |> put_valid_until - |> Repo.insert() + defp expired?(%__MODULE__{valid_until: valid_until}) do + with true <- NaiveDateTime.diff(NaiveDateTime.utc_now(), valid_until) > 0 do + {:error, :expired_token} + end end - def create_token(user, authorization) do + @spec create(User.t(), Authorization.t() | nil) :: {:ok, t()} | {:error, Ecto.Changeset.t()} + def create(user, authorization \\ nil) do + with {:ok, token} <- do_create(user, authorization) do + Pleroma.Workers.PurgeExpiredToken.enqueue(%{ + token_id: token.id, + valid_until: DateTime.from_naive!(token.valid_until, "Etc/UTC"), + mod: __MODULE__ + }) + + {:ok, token} + end + end + + defp do_create(user, authorization) do %__MODULE__{} - |> change + |> change() |> assign_user(user) - |> assign_authorization(authorization) - |> put_token - |> put_valid_until + |> maybe_assign_authorization(authorization) + |> put_token() + |> put_valid_until() |> Repo.insert() end @@ -69,15 +78,19 @@ defmodule Pleroma.MFA.Token do |> validate_required([:user]) end - defp assign_authorization(changeset, authorization) do + defp maybe_assign_authorization(changeset, %Authorization{} = authorization) do changeset |> put_assoc(:authorization, authorization) |> validate_required([:authorization]) end + defp maybe_assign_authorization(changeset, _), do: changeset + defp put_token(changeset) do + token = Pleroma.Web.OAuth.Token.Utils.generate_token() + changeset - |> change(%{token: OAuthToken.Utils.generate_token()}) + |> change(%{token: token}) |> validate_required([:token]) |> unique_constraint(:token) end @@ -89,18 +102,4 @@ defmodule Pleroma.MFA.Token do |> change(%{valid_until: expires_in}) |> validate_required([:valid_until]) end - - def is_expired?(%__MODULE__{valid_until: valid_until}) do - NaiveDateTime.diff(NaiveDateTime.utc_now(), valid_until) > 0 - end - - def is_expired?(_), do: false - - def delete_expired_tokens do - from( - q in __MODULE__, - where: fragment("?", q.valid_until) < ^Timex.now() - ) - |> Repo.delete_all() - end end diff --git a/lib/pleroma/web/oauth/oauth_controller.ex b/lib/pleroma/web/oauth/oauth_controller.ex index dd00600ea..bbe7aa8a0 100644 --- a/lib/pleroma/web/oauth/oauth_controller.ex +++ b/lib/pleroma/web/oauth/oauth_controller.ex @@ -197,7 +197,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do {:mfa_required, user, auth, _}, params ) do - {:ok, token} = MFA.Token.create_token(user, auth) + {:ok, token} = MFA.Token.create(user, auth) data = %{ "mfa_token" => token.token, @@ -579,7 +579,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do do: put_session(conn, :registration_id, registration_id) defp build_and_response_mfa_token(user, auth) do - with {:ok, token} <- MFA.Token.create_token(user, auth) do + with {:ok, token} <- MFA.Token.create(user, auth) do MFAView.render("mfa_response.json", %{token: token, user: user}) end end diff --git a/lib/pleroma/web/oauth/token.ex b/lib/pleroma/web/oauth/token.ex index 4d00fcb1c..de37998f2 100644 --- a/lib/pleroma/web/oauth/token.ex +++ b/lib/pleroma/web/oauth/token.ex @@ -87,9 +87,10 @@ defmodule Pleroma.Web.OAuth.Token do def create(%App{} = app, %User{} = user, attrs \\ %{}) do with {:ok, token} <- do_create(app, user, attrs) do if Pleroma.Config.get([:oauth2, :clean_expired_tokens]) do - Pleroma.Workers.PurgeExpiredOAuthToken.enqueue(%{ + Pleroma.Workers.PurgeExpiredToken.enqueue(%{ token_id: token.id, - valid_until: DateTime.from_naive!(token.valid_until, "Etc/UTC") + valid_until: DateTime.from_naive!(token.valid_until, "Etc/UTC"), + mod: __MODULE__ }) end diff --git a/lib/pleroma/web/oauth/token/clean_worker.ex b/lib/pleroma/web/oauth/token/clean_worker.ex deleted file mode 100644 index 2f51bdb75..000000000 --- a/lib/pleroma/web/oauth/token/clean_worker.ex +++ /dev/null @@ -1,36 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.OAuth.Token.CleanWorker do - @moduledoc """ - The module represents functions to clean an expired OAuth and MFA tokens. - """ - use GenServer - - @ten_seconds 10_000 - @one_day 86_400_000 - - alias Pleroma.MFA - alias Pleroma.Workers.BackgroundWorker - - def start_link(_), do: GenServer.start_link(__MODULE__, %{}) - - def init(_) do - Process.send_after(self(), :perform, @ten_seconds) - {:ok, nil} - end - - @doc false - def handle_info(:perform, state) do - BackgroundWorker.enqueue("clean_expired_tokens", %{}) - interval = Pleroma.Config.get([:oauth2, :clean_expired_tokens_interval], @one_day) - - Process.send_after(self(), :perform, interval) - {:noreply, state} - end - - def perform(:clean) do - MFA.Token.delete_expired_tokens() - end -end diff --git a/lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex b/lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex index 521dc9322..072d889e2 100644 --- a/lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex @@ -135,7 +135,7 @@ defmodule Pleroma.Web.TwitterAPI.RemoteFollowController do end defp handle_follow_error(conn, {:mfa_required, followee, user, _} = _) do - {:ok, %{token: token}} = MFA.Token.create_token(user) + {:ok, %{token: token}} = MFA.Token.create(user) render(conn, "follow_mfa.html", %{followee: followee, mfa_token: token, error: false}) end diff --git a/lib/pleroma/workers/purge_expired_token.ex b/lib/pleroma/workers/purge_expired_token.ex index 6068e43bf..a81e0cd28 100644 --- a/lib/pleroma/workers/purge_expired_token.ex +++ b/lib/pleroma/workers/purge_expired_token.ex @@ -2,14 +2,14 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Workers.PurgeExpiredOAuthToken do +defmodule Pleroma.Workers.PurgeExpiredToken do @moduledoc """ Worker which purges expired OAuth tokens """ - use Oban.Worker, queue: :oauth_token_expiration, max_attempts: 1 + use Oban.Worker, queue: :token_expiration, max_attempts: 1 - @spec enqueue(%{token_id: integer(), valid_until: DateTime.t()}) :: + @spec enqueue(%{token_id: integer(), valid_until: DateTime.t(), mod: module()}) :: {:ok, Oban.Job.t()} | {:error, Ecto.Changeset.t()} def enqueue(args) do {scheduled_at, args} = Map.pop(args, :valid_until) @@ -20,8 +20,9 @@ defmodule Pleroma.Workers.PurgeExpiredOAuthToken do end @impl true - def perform(%Oban.Job{args: %{"token_id" => id}}) do - Pleroma.Web.OAuth.Token + def perform(%Oban.Job{args: %{"token_id" => id, "mod" => module}}) do + module + |> String.to_existing_atom() |> Pleroma.Repo.get(id) |> Pleroma.Repo.delete() end diff --git a/test/web/twitter_api/remote_follow_controller_test.exs b/test/web/twitter_api/remote_follow_controller_test.exs index f7e54c26a..3852c7ce9 100644 --- a/test/web/twitter_api/remote_follow_controller_test.exs +++ b/test/web/twitter_api/remote_follow_controller_test.exs @@ -227,7 +227,7 @@ defmodule Pleroma.Web.TwitterAPI.RemoteFollowControllerTest do } ) - {:ok, %{token: token}} = MFA.Token.create_token(user) + {:ok, %{token: token}} = MFA.Token.create(user) user2 = insert(:user) otp_token = TOTP.generate_token(otp_secret) @@ -256,7 +256,7 @@ defmodule Pleroma.Web.TwitterAPI.RemoteFollowControllerTest do } ) - {:ok, %{token: token}} = MFA.Token.create_token(user) + {:ok, %{token: token}} = MFA.Token.create(user) user2 = insert(:user) otp_token = TOTP.generate_token(TOTP.generate_secret()) diff --git a/test/workers/purge_expired_oauth_token_test.exs b/test/workers/purge_expired_oauth_token_test.exs deleted file mode 100644 index 3bd650d89..000000000 --- a/test/workers/purge_expired_oauth_token_test.exs +++ /dev/null @@ -1,27 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Workers.PurgeExpiredOAuthTokenTest do - use Pleroma.DataCase, async: true - use Oban.Testing, repo: Pleroma.Repo - - import Pleroma.Factory - - setup do: clear_config([:oauth2, :clean_expired_tokens], true) - - test "purges expired token" do - user = insert(:user) - app = insert(:oauth_app) - - {:ok, %{id: id}} = Pleroma.Web.OAuth.Token.create(app, user) - - assert_enqueued( - worker: Pleroma.Workers.PurgeExpiredOAuthToken, - args: %{token_id: id} - ) - - assert {:ok, %{id: ^id}} = - perform_job(Pleroma.Workers.PurgeExpiredOAuthToken, %{token_id: id}) - end -end diff --git a/test/workers/purge_expired_token_test.exs b/test/workers/purge_expired_token_test.exs new file mode 100644 index 000000000..fb7708c3f --- /dev/null +++ b/test/workers/purge_expired_token_test.exs @@ -0,0 +1,51 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Workers.PurgeExpiredTokenTest do + use Pleroma.DataCase, async: true + use Oban.Testing, repo: Pleroma.Repo + + import Pleroma.Factory + + setup do: clear_config([:oauth2, :clean_expired_tokens], true) + + test "purges expired oauth token" do + user = insert(:user) + app = insert(:oauth_app) + + {:ok, %{id: id}} = Pleroma.Web.OAuth.Token.create(app, user) + + assert_enqueued( + worker: Pleroma.Workers.PurgeExpiredToken, + args: %{token_id: id, mod: Pleroma.Web.OAuth.Token} + ) + + assert {:ok, %{id: ^id}} = + perform_job(Pleroma.Workers.PurgeExpiredToken, %{ + token_id: id, + mod: Pleroma.Web.OAuth.Token + }) + + assert Repo.aggregate(Pleroma.Web.OAuth.Token, :count, :id) == 0 + end + + test "purges expired mfa token" do + authorization = insert(:oauth_authorization) + + {:ok, %{id: id}} = Pleroma.MFA.Token.create(authorization.user, authorization) + + assert_enqueued( + worker: Pleroma.Workers.PurgeExpiredToken, + args: %{token_id: id, mod: Pleroma.MFA.Token} + ) + + assert {:ok, %{id: ^id}} = + perform_job(Pleroma.Workers.PurgeExpiredToken, %{ + token_id: id, + mod: Pleroma.MFA.Token + }) + + assert Repo.aggregate(Pleroma.MFA.Token, :count, :id) == 0 + end +end From c6647c08e10a45aedcd77258a0e71c41d213eaa6 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Mon, 7 Sep 2020 11:54:10 +0300 Subject: [PATCH 061/182] migration and changelog --- CHANGELOG.md | 1 + ...ar_oauth_token_worker_from_oban_config.exs | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 priv/repo/migrations/20200907084956_remove_cron_clear_oauth_token_worker_from_oban_config.exs diff --git a/CHANGELOG.md b/CHANGELOG.md index 19b2596cc..14c0252f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Removed - **Breaking:** Removed `Pleroma.Workers.Cron.StatsWorker` setting from Oban `:crontab`. +- **Breaking:** Removed `Pleroma.Workers.Cron.ClearOauthTokenWorker` setting from Oban `:crontab` config. ## [2.1.1] - 2020-09-08 diff --git a/priv/repo/migrations/20200907084956_remove_cron_clear_oauth_token_worker_from_oban_config.exs b/priv/repo/migrations/20200907084956_remove_cron_clear_oauth_token_worker_from_oban_config.exs new file mode 100644 index 000000000..d9c972563 --- /dev/null +++ b/priv/repo/migrations/20200907084956_remove_cron_clear_oauth_token_worker_from_oban_config.exs @@ -0,0 +1,20 @@ +defmodule Pleroma.Repo.Migrations.RemoveCronClearOauthTokenWorkerFromObanConfig do + use Ecto.Migration + + def change do + with %Pleroma.ConfigDB{} = config <- + Pleroma.ConfigDB.get_by_params(%{group: :pleroma, key: Oban}), + crontab when is_list(crontab) <- config.value[:crontab], + index when is_integer(index) <- + Enum.find_index(crontab, fn {_, worker} -> + worker == Pleroma.Workers.Cron.ClearOauthTokenWorker + end) do + updated_value = Keyword.put(config.value, :crontab, List.delete_at(crontab, index)) + + config + |> Ecto.Changeset.change(value: updated_value) + |> Pleroma.Repo.update() + end + + end +end From e11fca88d424b394359f50646e4b4ec9b3ae1a8b Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Mon, 7 Sep 2020 13:44:42 +0300 Subject: [PATCH 062/182] migration to move tokens expiration into Oban --- ...92050_move_tokens_expiration_into_oban.exs | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 priv/repo/migrations/20200907092050_move_tokens_expiration_into_oban.exs diff --git a/priv/repo/migrations/20200907092050_move_tokens_expiration_into_oban.exs b/priv/repo/migrations/20200907092050_move_tokens_expiration_into_oban.exs new file mode 100644 index 000000000..832bd02a7 --- /dev/null +++ b/priv/repo/migrations/20200907092050_move_tokens_expiration_into_oban.exs @@ -0,0 +1,36 @@ +defmodule Pleroma.Repo.Migrations.MoveTokensExpirationIntoOban do + use Ecto.Migration + + import Ecto.Query, only: [from: 2] + + def change do + Supervisor.start_link([{Oban, Pleroma.Config.get(Oban)}], + strategy: :one_for_one, + name: Pleroma.Supervisor + ) + + if Pleroma.Config.get([:oauth2, :clean_expired_tokens]) do + from(t in Pleroma.Web.OAuth.Token, where: t.valid_until > ^NaiveDateTime.utc_now()) + |> Pleroma.Repo.stream() + |> Stream.each(fn token -> + Pleroma.Workers.PurgeExpiredToken.enqueue(%{ + token_id: token.id, + valid_until: DateTime.from_naive!(token.valid_until, "Etc/UTC"), + mod: Pleroma.Web.OAuth.Token + }) + end) + |> Stream.run() + end + + from(t in Pleroma.MFA.Token, where: t.valid_until > ^NaiveDateTime.utc_now()) + |> Pleroma.Repo.stream() + |> Stream.each(fn token -> + Pleroma.Workers.PurgeExpiredToken.enqueue(%{ + token_id: token.id, + valid_until: DateTime.from_naive!(token.valid_until, "Etc/UTC"), + mod: Pleroma.MFA.Token + }) + end) + |> Stream.run() + end +end From eca42566ba62ece75b79915f4af0c8a0f0c48a17 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Mon, 7 Sep 2020 13:54:28 +0300 Subject: [PATCH 063/182] formatting --- ...6_remove_cron_clear_oauth_token_worker_from_oban_config.exs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/priv/repo/migrations/20200907084956_remove_cron_clear_oauth_token_worker_from_oban_config.exs b/priv/repo/migrations/20200907084956_remove_cron_clear_oauth_token_worker_from_oban_config.exs index d9c972563..b5a0a0ff6 100644 --- a/priv/repo/migrations/20200907084956_remove_cron_clear_oauth_token_worker_from_oban_config.exs +++ b/priv/repo/migrations/20200907084956_remove_cron_clear_oauth_token_worker_from_oban_config.exs @@ -2,7 +2,7 @@ defmodule Pleroma.Repo.Migrations.RemoveCronClearOauthTokenWorkerFromObanConfig use Ecto.Migration def change do - with %Pleroma.ConfigDB{} = config <- + with %Pleroma.ConfigDB{} = config <- Pleroma.ConfigDB.get_by_params(%{group: :pleroma, key: Oban}), crontab when is_list(crontab) <- config.value[:crontab], index when is_integer(index) <- @@ -15,6 +15,5 @@ defmodule Pleroma.Repo.Migrations.RemoveCronClearOauthTokenWorkerFromObanConfig |> Ecto.Changeset.change(value: updated_value) |> Pleroma.Repo.update() end - end end From 8af1fd32234df7d0cdb74d78bcca9f68587b70f2 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Mon, 7 Sep 2020 20:06:28 +0300 Subject: [PATCH 064/182] oban warning --- lib/pleroma/config/oban.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/config/oban.ex b/lib/pleroma/config/oban.ex index c2d56ebab..81758c93d 100644 --- a/lib/pleroma/config/oban.ex +++ b/lib/pleroma/config/oban.ex @@ -5,7 +5,7 @@ defmodule Pleroma.Config.Oban do oban_config = Pleroma.Config.get(Oban) crontab = - [Pleroma.Workers.Cron.StatsWorker] + [Pleroma.Workers.Cron.StatsWorker, Pleroma.Workers.Cron.ClearOauthTokenWorker] |> Enum.reduce(oban_config[:crontab], fn removed_worker, acc -> with acc when is_list(acc) <- acc, setting when is_tuple(setting) <- From e8bfb50fa3c16f98845e326b153c8a89505e8a55 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Thu, 10 Sep 2020 20:09:44 +0300 Subject: [PATCH 065/182] pass options without adapter key --- lib/pleroma/reverse_proxy/client/tesla.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/reverse_proxy/client/tesla.ex b/lib/pleroma/reverse_proxy/client/tesla.ex index d5a339681..4b118eec2 100644 --- a/lib/pleroma/reverse_proxy/client/tesla.ex +++ b/lib/pleroma/reverse_proxy/client/tesla.ex @@ -28,7 +28,7 @@ defmodule Pleroma.ReverseProxy.Client.Tesla do url, body, headers, - Keyword.put(opts, :adapter, opts) + opts ) do if is_map(response.body) and method != :head do {:ok, response.status, response.headers, response.body} From cb06e98da27994ac8034f3ba387b6eeaf8a2c48f Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 10 Sep 2020 13:47:53 +0300 Subject: [PATCH 066/182] websocket handler: Do not log client ping frames as errors --- lib/pleroma/web/mastodon_api/websocket_handler.ex | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/mastodon_api/websocket_handler.ex b/lib/pleroma/web/mastodon_api/websocket_handler.ex index 94e4595d8..e6010bb4a 100644 --- a/lib/pleroma/web/mastodon_api/websocket_handler.ex +++ b/lib/pleroma/web/mastodon_api/websocket_handler.ex @@ -64,7 +64,9 @@ defmodule Pleroma.Web.MastodonAPI.WebsocketHandler do {:ok, %{state | timer: timer()}} end - # We never receive messages. + # We only receive pings for now + def websocket_handle(:ping, state), do: {:ok, state} + def websocket_handle(frame, state) do Logger.error("#{__MODULE__} received frame: #{inspect(frame)}") {:ok, state} From e16e8f98169f822416c18778abfa8495a486c8f2 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 10 Sep 2020 13:48:24 +0300 Subject: [PATCH 067/182] Websocket handler: do not raise if handler is terminated before switching protocols Closes #2131 --- lib/pleroma/web/mastodon_api/websocket_handler.ex | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/pleroma/web/mastodon_api/websocket_handler.ex b/lib/pleroma/web/mastodon_api/websocket_handler.ex index e6010bb4a..5090d9622 100644 --- a/lib/pleroma/web/mastodon_api/websocket_handler.ex +++ b/lib/pleroma/web/mastodon_api/websocket_handler.ex @@ -100,6 +100,10 @@ defmodule Pleroma.Web.MastodonAPI.WebsocketHandler do {:reply, :ping, %{state | timer: nil, count: 0}, :hibernate} end + # State can be `[]` only in case we terminate before switching to websocket, + # we already log errors for these cases in `init/1`, so just do nothing here + def terminate(_reason, _req, []), do: :ok + def terminate(reason, _req, state) do Logger.debug( "#{__MODULE__} terminating websocket connection for user #{ From 01fa68fe4542286519e3520793c6b59103b050ff Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 10 Sep 2020 21:26:52 +0300 Subject: [PATCH 068/182] Websocket handler: fix never matching code on failed auth `:cowboy_req.reply` does not return tuples since 2.0, see https://ninenines.eu/docs/en/cowboy/2.4/manual/cowboy_req.reply/ --- lib/pleroma/web/mastodon_api/websocket_handler.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/websocket_handler.ex b/lib/pleroma/web/mastodon_api/websocket_handler.ex index 5090d9622..cf923ded8 100644 --- a/lib/pleroma/web/mastodon_api/websocket_handler.ex +++ b/lib/pleroma/web/mastodon_api/websocket_handler.ex @@ -37,12 +37,12 @@ defmodule Pleroma.Web.MastodonAPI.WebsocketHandler do else {:error, :bad_topic} -> Logger.debug("#{__MODULE__} bad topic #{inspect(req)}") - {:ok, req} = :cowboy_req.reply(404, req) + req = :cowboy_req.reply(404, req) {:ok, req, state} {:error, :unauthorized} -> Logger.debug("#{__MODULE__} authentication error: #{inspect(req)}") - {:ok, req} = :cowboy_req.reply(401, req) + req = :cowboy_req.reply(401, req) {:ok, req, state} end end From dc4e06e1991379f9f1b64774c5bdaacec96639b7 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Thu, 10 Sep 2020 21:28:07 +0300 Subject: [PATCH 069/182] [#2497] Removed support for thumbnail_max_* params for media preview proxy (per https://git.pleroma.social/pleroma/pleroma/-/merge_requests/2497#note_70771) --- .../web/media_proxy/media_proxy_controller.ex | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index acb581459..5621f72dc 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -9,6 +9,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do alias Pleroma.Helpers.MediaHelper alias Pleroma.ReverseProxy alias Pleroma.Web.MediaProxy + alias Plug.Conn def remote(conn, %{"sig" => sig64, "url" => url64}) do with {_, true} <- {:enabled, MediaProxy.enabled?()}, @@ -18,29 +19,29 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do ReverseProxy.call(conn, url, media_proxy_opts()) else {:enabled, false} -> - send_resp(conn, 404, Plug.Conn.Status.reason_phrase(404)) + send_resp(conn, 404, Conn.Status.reason_phrase(404)) {:in_banned_urls, true} -> - send_resp(conn, 404, Plug.Conn.Status.reason_phrase(404)) + send_resp(conn, 404, Conn.Status.reason_phrase(404)) {:error, :invalid_signature} -> - send_resp(conn, 403, Plug.Conn.Status.reason_phrase(403)) + send_resp(conn, 403, Conn.Status.reason_phrase(403)) {:wrong_filename, filename} -> redirect(conn, external: MediaProxy.build_url(sig64, url64, filename)) end end - def preview(conn, %{"sig" => sig64, "url" => url64}) do + def preview(%Conn{} = conn, %{"sig" => sig64, "url" => url64}) do with {_, true} <- {:enabled, MediaProxy.preview_enabled?()}, {:ok, url} <- MediaProxy.decode_url(sig64, url64) do handle_preview(conn, url) else {:enabled, false} -> - send_resp(conn, 404, Plug.Conn.Status.reason_phrase(404)) + send_resp(conn, 404, Conn.Status.reason_phrase(404)) {:error, :invalid_signature} -> - send_resp(conn, 403, Plug.Conn.Status.reason_phrase(403)) + send_resp(conn, 403, Conn.Status.reason_phrase(403)) {:wrong_filename, filename} -> redirect(conn, external: MediaProxy.build_preview_url(sig64, url64, filename)) @@ -94,10 +95,10 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do send_resp(conn, :unprocessable_entity, "Unsupported content type: #{content_type}.") end - defp handle_png_preview(%{params: params} = conn, media_proxy_url) do + defp handle_png_preview(conn, media_proxy_url) do quality = Config.get!([:media_preview_proxy, :image_quality]) - with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(params), + with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(), {:ok, thumbnail_binary} <- MediaHelper.image_resize( media_proxy_url, @@ -117,10 +118,10 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end - defp handle_jpeg_preview(%{params: params} = conn, media_proxy_url) do + defp handle_jpeg_preview(conn, media_proxy_url) do quality = Config.get!([:media_preview_proxy, :image_quality]) - with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(params), + with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(), {:ok, thumbnail_binary} <- MediaHelper.image_resize( media_proxy_url, @@ -157,22 +158,11 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do |> put_resp_header("cache-control", ReverseProxy.default_cache_control_header()) end - defp thumbnail_max_dimensions(params) do + defp thumbnail_max_dimensions() do config = Config.get([:media_preview_proxy], []) - thumbnail_max_width = - if w = params["thumbnail_max_width"] do - String.to_integer(w) - else - Keyword.fetch!(config, :thumbnail_max_width) - end - - thumbnail_max_height = - if h = params["thumbnail_max_height"] do - String.to_integer(h) - else - Keyword.fetch!(config, :thumbnail_max_height) - end + thumbnail_max_width = Keyword.fetch!(config, :thumbnail_max_width) + thumbnail_max_height = Keyword.fetch!(config, :thumbnail_max_height) {thumbnail_max_width, thumbnail_max_height} end From 275602daa7c4a01dffb83759012554da2d9335fe Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 10 Sep 2020 21:28:47 +0300 Subject: [PATCH 070/182] Streaming integration tests: remove unexpected error assumption For some reason instead of fixing unexpected errors, we made tests assert they indeed trigger... Now that the errors are fixed these were failing --- test/integration/mastodon_websocket_test.exs | 26 ++++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/test/integration/mastodon_websocket_test.exs b/test/integration/mastodon_websocket_test.exs index ea17e9feb..76fbc8bda 100644 --- a/test/integration/mastodon_websocket_test.exs +++ b/test/integration/mastodon_websocket_test.exs @@ -99,30 +99,30 @@ defmodule Pleroma.Integration.MastodonWebsocketTest do test "accepts the 'user' stream", %{token: token} = _state do assert {:ok, _} = start_socket("?stream=user&access_token=#{token.token}") - assert capture_log(fn -> - assert {:error, {401, _}} = start_socket("?stream=user") - Process.sleep(30) - end) =~ ":badarg" + capture_log(fn -> + assert {:error, {401, _}} = start_socket("?stream=user") + Process.sleep(30) + end) end test "accepts the 'user:notification' stream", %{token: token} = _state do assert {:ok, _} = start_socket("?stream=user:notification&access_token=#{token.token}") - assert capture_log(fn -> - assert {:error, {401, _}} = start_socket("?stream=user:notification") - Process.sleep(30) - end) =~ ":badarg" + capture_log(fn -> + assert {:error, {401, _}} = start_socket("?stream=user:notification") + Process.sleep(30) + end) end test "accepts valid token on Sec-WebSocket-Protocol header", %{token: token} do assert {:ok, _} = start_socket("?stream=user", [{"Sec-WebSocket-Protocol", token.token}]) - assert capture_log(fn -> - assert {:error, {401, _}} = - start_socket("?stream=user", [{"Sec-WebSocket-Protocol", "I am a friend"}]) + capture_log(fn -> + assert {:error, {401, _}} = + start_socket("?stream=user", [{"Sec-WebSocket-Protocol", "I am a friend"}]) - Process.sleep(30) - end) =~ ":badarg" + Process.sleep(30) + end) end end end From 9bf1065a06837b4c753549d89afe23a636a20972 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Sat, 22 Aug 2020 20:46:01 +0300 Subject: [PATCH 071/182] schedule activity expiration in Oban --- config/config.exs | 3 +- config/description.exs | 1 - lib/mix/tasks/pleroma/database.ex | 18 ++-- lib/pleroma/activity.ex | 3 - lib/pleroma/activity_expiration.ex | 74 ---------------- lib/pleroma/web/activity_pub/activity_pub.ex | 7 +- .../mrf/activity_expiration_policy.ex | 4 +- lib/pleroma/web/activity_pub/side_effects.ex | 6 +- lib/pleroma/web/common_api/activity_draft.ex | 2 +- lib/pleroma/web/common_api/common_api.ex | 5 +- .../web/mastodon_api/views/status_view.ex | 5 +- .../cron/purge_expired_activities_worker.ex | 48 ----------- lib/pleroma/workers/purge_expired_activity.ex | 72 ++++++++++++++++ test/activity_expiration_test.exs | 55 ------------ test/activity_test.exs | 9 -- test/support/factory.ex | 19 ----- test/tasks/database_test.exs | 62 +++++++------- test/web/activity_pub/activity_pub_test.exs | 25 ++++-- .../mrf/activity_expiration_policy_test.exs | 8 +- test/web/common_api/common_api_test.exs | 14 ++-- .../controllers/status_controller_test.exs | 44 +++++----- .../purge_expired_activities_worker_test.exs | 84 ------------------- test/workers/purge_expired_activity_test.exs | 47 +++++++++++ 23 files changed, 229 insertions(+), 386 deletions(-) delete mode 100644 lib/pleroma/activity_expiration.ex delete mode 100644 lib/pleroma/workers/cron/purge_expired_activities_worker.ex create mode 100644 lib/pleroma/workers/purge_expired_activity.ex delete mode 100644 test/activity_expiration_test.exs delete mode 100644 test/workers/cron/purge_expired_activities_worker_test.exs create mode 100644 test/workers/purge_expired_activity_test.exs diff --git a/config/config.exs b/config/config.exs index 95a6ea9db..d975db31e 100644 --- a/config/config.exs +++ b/config/config.exs @@ -544,7 +544,6 @@ config :pleroma, Oban, ], plugins: [Oban.Plugins.Pruner], crontab: [ - {"* * * * *", Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker}, {"0 0 * * 0", Pleroma.Workers.Cron.DigestEmailsWorker}, {"0 0 * * *", Pleroma.Workers.Cron.NewUsersDigestWorker} ] @@ -655,7 +654,7 @@ config :pleroma, :rate_limit, account_confirmation_resend: {8_640_000, 5}, ap_routes: {60_000, 15} -config :pleroma, Pleroma.ActivityExpiration, enabled: true +config :pleroma, Pleroma.Workers.PurgeExpiredActivity, enabled: true config :pleroma, Pleroma.Plugs.RemoteIp, enabled: true diff --git a/config/description.exs b/config/description.exs index 4c4deed30..6ce27278c 100644 --- a/config/description.exs +++ b/config/description.exs @@ -2290,7 +2290,6 @@ config :pleroma, :config_description, [ type: {:list, :tuple}, description: "Settings for cron background jobs", suggestions: [ - {"* * * * *", Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker}, {"0 0 * * 0", Pleroma.Workers.Cron.DigestEmailsWorker}, {"0 0 * * *", Pleroma.Workers.Cron.NewUsersDigestWorker} ] diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index 7d8f00b08..aab4b5e9a 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -133,8 +133,7 @@ defmodule Mix.Tasks.Pleroma.Database do days = Pleroma.Config.get([:mrf_activity_expiration, :days], 365) Pleroma.Activity - |> join(:left, [a], u in assoc(a, :expiration)) - |> join(:inner, [a, _u], o in Object, + |> join(:inner, [a], o in Object, on: fragment( "(?->>'id') = COALESCE((?)->'object'->> 'id', (?)->>'object')", @@ -144,14 +143,21 @@ defmodule Mix.Tasks.Pleroma.Database do ) ) |> where(local: true) - |> where([a, u], is_nil(u)) |> where([a], fragment("(? ->> 'type'::text) = 'Create'", a.data)) - |> where([_a, _u, o], fragment("?->>'type' = 'Note'", o.data)) + |> where([_a, o], fragment("?->>'type' = 'Note'", o.data)) |> Pleroma.RepoStreamer.chunk_stream(100) |> Stream.each(fn activities -> Enum.each(activities, fn activity -> - expires_at = Timex.shift(activity.inserted_at, days: days) - Pleroma.ActivityExpiration.create(activity, expires_at, false) + expires_at = + activity.inserted_at + |> DateTime.from_naive!("Etc/UTC") + |> Timex.shift(days: days) + + Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ + activity_id: activity.id, + expires_at: expires_at, + validate: false + }) end) end) |> Stream.run() diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index 97feebeaa..03cd3b8c0 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -7,7 +7,6 @@ defmodule Pleroma.Activity do alias Pleroma.Activity alias Pleroma.Activity.Queries - alias Pleroma.ActivityExpiration alias Pleroma.Bookmark alias Pleroma.Notification alias Pleroma.Object @@ -60,8 +59,6 @@ defmodule Pleroma.Activity do # typical case. has_one(:object, Object, on_delete: :nothing, foreign_key: :id) - has_one(:expiration, ActivityExpiration, on_delete: :delete_all) - timestamps() end diff --git a/lib/pleroma/activity_expiration.ex b/lib/pleroma/activity_expiration.ex deleted file mode 100644 index 955f0578e..000000000 --- a/lib/pleroma/activity_expiration.ex +++ /dev/null @@ -1,74 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.ActivityExpiration do - use Ecto.Schema - - alias Pleroma.Activity - alias Pleroma.ActivityExpiration - alias Pleroma.Repo - - import Ecto.Changeset - import Ecto.Query - - @type t :: %__MODULE__{} - @min_activity_lifetime :timer.hours(1) - - schema "activity_expirations" do - belongs_to(:activity, Activity, type: FlakeId.Ecto.CompatType) - field(:scheduled_at, :naive_datetime) - end - - def changeset(%ActivityExpiration{} = expiration, attrs, validate_scheduled_at) do - expiration - |> cast(attrs, [:scheduled_at]) - |> validate_required([:scheduled_at]) - |> validate_scheduled_at(validate_scheduled_at) - end - - def get_by_activity_id(activity_id) do - ActivityExpiration - |> where([exp], exp.activity_id == ^activity_id) - |> Repo.one() - end - - def create(%Activity{} = activity, scheduled_at, validate_scheduled_at \\ true) do - %ActivityExpiration{activity_id: activity.id} - |> changeset(%{scheduled_at: scheduled_at}, validate_scheduled_at) - |> Repo.insert() - end - - def due_expirations(offset \\ 0) do - naive_datetime = - NaiveDateTime.utc_now() - |> NaiveDateTime.add(offset, :millisecond) - - ActivityExpiration - |> where([exp], exp.scheduled_at < ^naive_datetime) - |> limit(50) - |> preload(:activity) - |> Repo.all() - |> Enum.reject(fn %{activity: activity} -> - Activity.pinned_by_actor?(activity) - end) - end - - def validate_scheduled_at(changeset, false), do: changeset - - def validate_scheduled_at(changeset, true) do - validate_change(changeset, :scheduled_at, fn _, scheduled_at -> - if not expires_late_enough?(scheduled_at) do - [scheduled_at: "an ephemeral activity must live for at least one hour"] - else - [] - end - end) - end - - def expires_late_enough?(scheduled_at) do - now = NaiveDateTime.utc_now() - diff = NaiveDateTime.diff(scheduled_at, now, :millisecond) - diff > @min_activity_lifetime - end -end diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 333621413..c33848277 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -5,7 +5,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do alias Pleroma.Activity alias Pleroma.Activity.Ir.Topics - alias Pleroma.ActivityExpiration alias Pleroma.Config alias Pleroma.Constants alias Pleroma.Conversation @@ -165,7 +164,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end defp maybe_create_activity_expiration({:ok, %{data: %{"expires_at" => expires_at}} = activity}) do - with {:ok, _} <- ActivityExpiration.create(activity, expires_at) do + with {:ok, _job} <- + Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ + activity_id: activity.id, + expires_at: expires_at + }) do {:ok, activity} end end diff --git a/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex index 7b4c78e0f..bee47b4ed 100644 --- a/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex @@ -31,10 +31,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy do defp maybe_add_expiration(activity) do days = Pleroma.Config.get([:mrf_activity_expiration, :days], 365) - expires_at = NaiveDateTime.utc_now() |> Timex.shift(days: days) + expires_at = DateTime.utc_now() |> Timex.shift(days: days) with %{"expires_at" => existing_expires_at} <- activity, - :lt <- NaiveDateTime.compare(existing_expires_at, expires_at) do + :lt <- DateTime.compare(existing_expires_at, expires_at) do activity else _ -> Map.put(activity, "expires_at", expires_at) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index a5e2323bd..b30ca1bd7 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -7,7 +7,6 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do """ alias Pleroma.Activity alias Pleroma.Activity.Ir.Topics - alias Pleroma.ActivityExpiration alias Pleroma.Chat alias Pleroma.Chat.MessageReference alias Pleroma.FollowingRelationship @@ -189,7 +188,10 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do end if expires_at = activity.data["expires_at"] do - ActivityExpiration.create(activity, expires_at) + Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ + activity_id: activity.id, + expires_at: expires_at + }) end BackgroundWorker.enqueue("fetch_data_for_activity", %{"activity_id" => activity.id}) diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex index f849b2e01..548f76609 100644 --- a/lib/pleroma/web/common_api/activity_draft.ex +++ b/lib/pleroma/web/common_api/activity_draft.ex @@ -202,7 +202,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do additional = case draft.expires_at do - %NaiveDateTime{} = expires_at -> Map.put(additional, "expires_at", expires_at) + %DateTime{} = expires_at -> Map.put(additional, "expires_at", expires_at) _ -> additional end diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 4ab533658..500c3883e 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -4,7 +4,6 @@ defmodule Pleroma.Web.CommonAPI do alias Pleroma.Activity - alias Pleroma.ActivityExpiration alias Pleroma.Conversation.Participation alias Pleroma.Formatter alias Pleroma.Object @@ -381,9 +380,9 @@ defmodule Pleroma.Web.CommonAPI do def check_expiry_date({:ok, nil} = res), do: res def check_expiry_date({:ok, in_seconds}) do - expiry = NaiveDateTime.utc_now() |> NaiveDateTime.add(in_seconds) + expiry = DateTime.add(DateTime.utc_now(), in_seconds) - if ActivityExpiration.expires_late_enough?(expiry) do + if Pleroma.Workers.PurgeExpiredActivity.expires_late_enough?(expiry) do {:ok, expiry} else {:error, "Expiry date is too soon"} diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index 3fe1967be..ca42917fc 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -8,7 +8,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do require Pleroma.Constants alias Pleroma.Activity - alias Pleroma.ActivityExpiration alias Pleroma.HTML alias Pleroma.Object alias Pleroma.Repo @@ -245,8 +244,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do expires_at = with true <- client_posted_this_activity, - %ActivityExpiration{scheduled_at: scheduled_at} <- - ActivityExpiration.get_by_activity_id(activity.id) do + %Oban.Job{scheduled_at: scheduled_at} <- + Pleroma.Workers.PurgeExpiredActivity.get_expiration(activity.id) do scheduled_at else _ -> nil diff --git a/lib/pleroma/workers/cron/purge_expired_activities_worker.ex b/lib/pleroma/workers/cron/purge_expired_activities_worker.ex deleted file mode 100644 index 6549207fc..000000000 --- a/lib/pleroma/workers/cron/purge_expired_activities_worker.ex +++ /dev/null @@ -1,48 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker do - @moduledoc """ - The worker to purge expired activities. - """ - - use Oban.Worker, queue: "activity_expiration" - - alias Pleroma.Activity - alias Pleroma.ActivityExpiration - alias Pleroma.Config - alias Pleroma.User - alias Pleroma.Web.CommonAPI - - require Logger - - @interval :timer.minutes(1) - - @impl Oban.Worker - def perform(_job) do - if Config.get([ActivityExpiration, :enabled]) do - Enum.each(ActivityExpiration.due_expirations(@interval), &delete_activity/1) - end - after - :ok - end - - def delete_activity(%ActivityExpiration{activity_id: activity_id}) do - with {:activity, %Activity{} = activity} <- - {:activity, Activity.get_by_id_with_object(activity_id)}, - {:user, %User{} = user} <- {:user, User.get_by_ap_id(activity.object.data["actor"])} do - CommonAPI.delete(activity.id, user) - else - {:activity, _} -> - Logger.error( - "#{__MODULE__} Couldn't delete expired activity: not found activity ##{activity_id}" - ) - - {:user, _} -> - Logger.error( - "#{__MODULE__} Couldn't delete expired activity: not found actor of ##{activity_id}" - ) - end - end -end diff --git a/lib/pleroma/workers/purge_expired_activity.ex b/lib/pleroma/workers/purge_expired_activity.ex new file mode 100644 index 000000000..016b000c1 --- /dev/null +++ b/lib/pleroma/workers/purge_expired_activity.ex @@ -0,0 +1,72 @@ +defmodule Pleroma.Workers.PurgeExpiredActivity do + @moduledoc """ + Worker which purges expired activity. + """ + + use Oban.Worker, queue: :activity_expiration, max_attempts: 1 + + import Ecto.Query + + def enqueue(args) do + with true <- enabled?(), + args when is_map(args) <- validate_expires_at(args) do + {scheduled_at, args} = Map.pop(args, :expires_at) + + args + |> __MODULE__.new(scheduled_at: scheduled_at) + |> Oban.insert() + end + end + + @impl true + def perform(%Oban.Job{args: %{"activity_id" => id}}) do + with %Pleroma.Activity{} = activity <- find_activity(id), + %Pleroma.User{} = user <- find_user(activity.object.data["actor"]) do + Pleroma.Web.CommonAPI.delete(activity.id, user) + end + end + + defp enabled? do + with false <- Pleroma.Config.get([__MODULE__, :enabled], false) do + {:error, :expired_activities_disabled} + end + end + + defp validate_expires_at(%{validate: false} = args), do: Map.delete(args, :validate) + + defp validate_expires_at(args) do + if expires_late_enough?(args[:expires_at]) do + args + else + {:error, :expiration_too_close} + end + end + + defp find_activity(id) do + with nil <- Pleroma.Activity.get_by_id_with_object(id) do + {:error, :activity_not_found} + end + end + + defp find_user(ap_id) do + with nil <- Pleroma.User.get_by_ap_id(ap_id) do + {:error, :user_not_found} + end + end + + def get_expiration(id) do + from(j in Oban.Job, + where: j.state == "scheduled", + where: j.queue == "activity_expiration", + where: fragment("?->>'activity_id' = ?", j.args, ^id) + ) + |> Pleroma.Repo.one() + end + + @spec expires_late_enough?(DateTime.t()) :: boolean() + def expires_late_enough?(scheduled_at) do + now = DateTime.utc_now() + diff = DateTime.diff(scheduled_at, now, :millisecond) + diff > :timer.hours(1) + end +end diff --git a/test/activity_expiration_test.exs b/test/activity_expiration_test.exs deleted file mode 100644 index f86d79826..000000000 --- a/test/activity_expiration_test.exs +++ /dev/null @@ -1,55 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.ActivityExpirationTest do - use Pleroma.DataCase - alias Pleroma.ActivityExpiration - import Pleroma.Factory - - setup do: clear_config([ActivityExpiration, :enabled]) - - test "finds activities due to be deleted only" do - activity = insert(:note_activity) - - expiration_due = - insert(:expiration_in_the_past, %{activity_id: activity.id}) |> Repo.preload(:activity) - - activity2 = insert(:note_activity) - insert(:expiration_in_the_future, %{activity_id: activity2.id}) - - expirations = ActivityExpiration.due_expirations() - - assert length(expirations) == 1 - assert hd(expirations) == expiration_due - end - - test "denies expirations that don't live long enough" do - activity = insert(:note_activity) - now = NaiveDateTime.utc_now() - assert {:error, _} = ActivityExpiration.create(activity, now) - end - - test "deletes an expiration activity" do - Pleroma.Config.put([ActivityExpiration, :enabled], true) - activity = insert(:note_activity) - - naive_datetime = - NaiveDateTime.add( - NaiveDateTime.utc_now(), - -:timer.minutes(2), - :millisecond - ) - - expiration = - insert( - :expiration_in_the_past, - %{activity_id: activity.id, scheduled_at: naive_datetime} - ) - - Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker.perform(%Oban.Job{}) - - refute Pleroma.Repo.get(Pleroma.Activity, activity.id) - refute Pleroma.Repo.get(Pleroma.ActivityExpiration, expiration.id) - end -end diff --git a/test/activity_test.exs b/test/activity_test.exs index 2a92327d1..ee6a99cc3 100644 --- a/test/activity_test.exs +++ b/test/activity_test.exs @@ -185,15 +185,6 @@ defmodule Pleroma.ActivityTest do end end - test "add an activity with an expiration" do - activity = insert(:note_activity) - insert(:expiration_in_the_future, %{activity_id: activity.id}) - - Pleroma.ActivityExpiration - |> where([a], a.activity_id == ^activity.id) - |> Repo.one!() - end - test "all_by_ids_with_object/1" do %{id: id1} = insert(:note_activity) %{id: id2} = insert(:note_activity) diff --git a/test/support/factory.ex b/test/support/factory.ex index 486eda8da..2fdfabbc5 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -200,25 +200,6 @@ defmodule Pleroma.Factory do |> Map.merge(attrs) end - defp expiration_offset_by_minutes(attrs, minutes) do - scheduled_at = - NaiveDateTime.utc_now() - |> NaiveDateTime.add(:timer.minutes(minutes), :millisecond) - |> NaiveDateTime.truncate(:second) - - %Pleroma.ActivityExpiration{} - |> Map.merge(attrs) - |> Map.put(:scheduled_at, scheduled_at) - end - - def expiration_in_the_past_factory(attrs \\ %{}) do - expiration_offset_by_minutes(attrs, -60) - end - - def expiration_in_the_future_factory(attrs \\ %{}) do - expiration_offset_by_minutes(attrs, 61) - end - def article_activity_factory do article = insert(:article) diff --git a/test/tasks/database_test.exs b/test/tasks/database_test.exs index 3a28aa133..292a5ef5f 100644 --- a/test/tasks/database_test.exs +++ b/test/tasks/database_test.exs @@ -3,14 +3,15 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Mix.Tasks.Pleroma.DatabaseTest do + use Pleroma.DataCase + use Oban.Testing, repo: Pleroma.Repo + alias Pleroma.Activity alias Pleroma.Object alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.CommonAPI - use Pleroma.DataCase - import Pleroma.Factory setup_all do @@ -130,40 +131,45 @@ defmodule Mix.Tasks.Pleroma.DatabaseTest do describe "ensure_expiration" do test "it adds to expiration old statuses" do - %{id: activity_id1} = insert(:note_activity) + activity1 = insert(:note_activity) - %{id: activity_id2} = - insert(:note_activity, %{inserted_at: NaiveDateTime.from_iso8601!("2015-01-23 23:50:07")}) + {:ok, inserted_at, 0} = DateTime.from_iso8601("2015-01-23T23:50:07Z") + activity2 = insert(:note_activity, %{inserted_at: inserted_at}) - %{id: activity_id3} = activity3 = insert(:note_activity) + %{id: activity_id3} = insert(:note_activity) - expires_at = - NaiveDateTime.utc_now() - |> NaiveDateTime.add(60 * 61, :second) - |> NaiveDateTime.truncate(:second) + expires_at = DateTime.add(DateTime.utc_now(), 60 * 61) - Pleroma.ActivityExpiration.create(activity3, expires_at) + Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ + activity_id: activity_id3, + expires_at: expires_at + }) Mix.Tasks.Pleroma.Database.run(["ensure_expiration"]) - expirations = - Pleroma.ActivityExpiration - |> order_by(:activity_id) - |> Repo.all() + assert_enqueued( + worker: Pleroma.Workers.PurgeExpiredActivity, + args: %{activity_id: activity1.id}, + scheduled_at: + activity1.inserted_at + |> DateTime.from_naive!("Etc/UTC") + |> Timex.shift(days: 365) + ) - assert [ - %Pleroma.ActivityExpiration{ - activity_id: ^activity_id1 - }, - %Pleroma.ActivityExpiration{ - activity_id: ^activity_id2, - scheduled_at: ~N[2016-01-23 23:50:07] - }, - %Pleroma.ActivityExpiration{ - activity_id: ^activity_id3, - scheduled_at: ^expires_at - } - ] = expirations + assert_enqueued( + worker: Pleroma.Workers.PurgeExpiredActivity, + args: %{activity_id: activity2.id}, + scheduled_at: + activity2.inserted_at + |> DateTime.from_naive!("Etc/UTC") + |> Timex.shift(days: 365) + ) + + assert_enqueued( + worker: Pleroma.Workers.PurgeExpiredActivity, + args: %{activity_id: activity_id3}, + scheduled_at: expires_at + ) end end end diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 03f968aaf..9af573924 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -2069,18 +2069,25 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do end describe "global activity expiration" do - setup do: clear_config([:mrf, :policies]) - test "creates an activity expiration for local Create activities" do - Pleroma.Config.put( - [:mrf, :policies], - Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy + clear_config([:mrf, :policies], Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy) + + {:ok, activity} = ActivityBuilder.insert(%{"type" => "Create", "context" => "3hu"}) + {:ok, follow} = ActivityBuilder.insert(%{"type" => "Follow", "context" => "3hu"}) + + assert_enqueued( + worker: Pleroma.Workers.PurgeExpiredActivity, + args: %{activity_id: activity.id}, + scheduled_at: + activity.inserted_at + |> DateTime.from_naive!("Etc/UTC") + |> Timex.shift(days: 365) ) - {:ok, %{id: id_create}} = ActivityBuilder.insert(%{"type" => "Create", "context" => "3hu"}) - {:ok, _follow} = ActivityBuilder.insert(%{"type" => "Follow", "context" => "3hu"}) - - assert [%{activity_id: ^id_create}] = Pleroma.ActivityExpiration |> Repo.all() + refute_enqueued( + worker: Pleroma.Workers.PurgeExpiredActivity, + args: %{activity_id: follow.id} + ) end end diff --git a/test/web/activity_pub/mrf/activity_expiration_policy_test.exs b/test/web/activity_pub/mrf/activity_expiration_policy_test.exs index f25cf8b12..e7370d4ef 100644 --- a/test/web/activity_pub/mrf/activity_expiration_policy_test.exs +++ b/test/web/activity_pub/mrf/activity_expiration_policy_test.exs @@ -18,11 +18,11 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicyTest do "object" => %{"type" => "Note"} }) - assert Timex.diff(expires_at, NaiveDateTime.utc_now(), :days) == 364 + assert Timex.diff(expires_at, DateTime.utc_now(), :days) == 364 end test "keeps existing `expires_at` if it less than the config setting" do - expires_at = NaiveDateTime.utc_now() |> Timex.shift(days: 1) + expires_at = DateTime.utc_now() |> Timex.shift(days: 1) assert {:ok, %{"type" => "Create", "expires_at" => ^expires_at}} = ActivityExpirationPolicy.filter(%{ @@ -35,7 +35,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicyTest do end test "overwrites existing `expires_at` if it greater than the config setting" do - too_distant_future = NaiveDateTime.utc_now() |> Timex.shift(years: 2) + too_distant_future = DateTime.utc_now() |> Timex.shift(years: 2) assert {:ok, %{"type" => "Create", "expires_at" => expires_at}} = ActivityExpirationPolicy.filter(%{ @@ -46,7 +46,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicyTest do "object" => %{"type" => "Note"} }) - assert Timex.diff(expires_at, NaiveDateTime.utc_now(), :days) == 364 + assert Timex.diff(expires_at, DateTime.utc_now(), :days) == 364 end test "ignores remote activities" do diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 800db9a20..5afb0a6dc 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -4,6 +4,8 @@ defmodule Pleroma.Web.CommonAPITest do use Pleroma.DataCase + use Oban.Testing, repo: Pleroma.Repo + alias Pleroma.Activity alias Pleroma.Chat alias Pleroma.Conversation.Participation @@ -598,15 +600,15 @@ defmodule Pleroma.Web.CommonAPITest do test "it can handle activities that expire" do user = insert(:user) - expires_at = - NaiveDateTime.utc_now() - |> NaiveDateTime.truncate(:second) - |> NaiveDateTime.add(1_000_000, :second) + expires_at = DateTime.add(DateTime.utc_now(), 1_000_000) assert {:ok, activity} = CommonAPI.post(user, %{status: "chai", expires_in: 1_000_000}) - assert expiration = Pleroma.ActivityExpiration.get_by_activity_id(activity.id) - assert expiration.scheduled_at == expires_at + assert_enqueued( + worker: Pleroma.Workers.PurgeExpiredActivity, + args: %{activity_id: activity.id}, + scheduled_at: expires_at + ) end end diff --git a/test/web/mastodon_api/controllers/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index f221884e7..17a156be8 100644 --- a/test/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/web/mastodon_api/controllers/status_controller_test.exs @@ -4,9 +4,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do use Pleroma.Web.ConnCase + use Oban.Testing, repo: Pleroma.Repo alias Pleroma.Activity - alias Pleroma.ActivityExpiration alias Pleroma.Config alias Pleroma.Conversation.Participation alias Pleroma.Object @@ -29,8 +29,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do setup do: oauth_access(["write:statuses"]) test "posting a status does not increment reblog_count when relaying", %{conn: conn} do - Pleroma.Config.put([:instance, :federating], true) - Pleroma.Config.get([:instance, :allow_relay], true) + Config.put([:instance, :federating], true) + Config.get([:instance, :allow_relay], true) response = conn @@ -103,7 +103,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do # An activity that will expire: # 2 hours - expires_in = 120 * 60 + expires_in = 2 * 60 * 60 + + expires_at = DateTime.add(DateTime.utc_now(), expires_in) conn_four = conn @@ -116,19 +118,13 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do assert fourth_response = %{"id" => fourth_id} = json_response_and_validate_schema(conn_four, 200) - assert activity = Activity.get_by_id(fourth_id) - assert expiration = ActivityExpiration.get_by_activity_id(fourth_id) + assert Activity.get_by_id(fourth_id) - estimated_expires_at = - NaiveDateTime.utc_now() - |> NaiveDateTime.add(expires_in) - |> NaiveDateTime.truncate(:second) - - # This assert will fail if the test takes longer than a minute. I sure hope it never does: - assert abs(NaiveDateTime.diff(expiration.scheduled_at, estimated_expires_at, :second)) < 60 - - assert fourth_response["pleroma"]["expires_at"] == - NaiveDateTime.to_iso8601(expiration.scheduled_at) + assert_enqueued( + worker: Pleroma.Workers.PurgeExpiredActivity, + args: %{activity_id: fourth_id}, + scheduled_at: expires_at + ) end test "it fails to create a status if `expires_in` is less or equal than an hour", %{ @@ -160,8 +156,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do end test "Get MRF reason when posting a status is rejected by one", %{conn: conn} do - Pleroma.Config.put([:mrf_keyword, :reject], ["GNO"]) - Pleroma.Config.put([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.KeywordPolicy]) + Config.put([:mrf_keyword, :reject], ["GNO"]) + Config.put([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.KeywordPolicy]) assert %{"error" => "[KeywordPolicy] Matches with rejected keyword"} = conn @@ -1681,19 +1677,17 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do test "expires_at is nil for another user" do %{conn: conn, user: user} = oauth_access(["read:statuses"]) + expires_at = DateTime.add(DateTime.utc_now(), 1_000_000) {:ok, activity} = CommonAPI.post(user, %{status: "foobar", expires_in: 1_000_000}) - expires_at = - activity.id - |> ActivityExpiration.get_by_activity_id() - |> Map.get(:scheduled_at) - |> NaiveDateTime.to_iso8601() - - assert %{"pleroma" => %{"expires_at" => ^expires_at}} = + assert %{"pleroma" => %{"expires_at" => a_expires_at}} = conn |> get("/api/v1/statuses/#{activity.id}") |> json_response_and_validate_schema(:ok) + {:ok, a_expires_at, 0} = DateTime.from_iso8601(a_expires_at) + assert DateTime.diff(expires_at, a_expires_at) == 0 + %{conn: conn} = oauth_access(["read:statuses"]) assert %{"pleroma" => %{"expires_at" => nil}} = diff --git a/test/workers/cron/purge_expired_activities_worker_test.exs b/test/workers/cron/purge_expired_activities_worker_test.exs deleted file mode 100644 index d1acd9ae6..000000000 --- a/test/workers/cron/purge_expired_activities_worker_test.exs +++ /dev/null @@ -1,84 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Workers.Cron.PurgeExpiredActivitiesWorkerTest do - use Pleroma.DataCase - - alias Pleroma.ActivityExpiration - alias Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker - - import Pleroma.Factory - import ExUnit.CaptureLog - - setup do - clear_config([ActivityExpiration, :enabled]) - end - - test "deletes an expiration activity" do - Pleroma.Config.put([ActivityExpiration, :enabled], true) - activity = insert(:note_activity) - - naive_datetime = - NaiveDateTime.add( - NaiveDateTime.utc_now(), - -:timer.minutes(2), - :millisecond - ) - - expiration = - insert( - :expiration_in_the_past, - %{activity_id: activity.id, scheduled_at: naive_datetime} - ) - - Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker.perform(%Oban.Job{}) - - refute Pleroma.Repo.get(Pleroma.Activity, activity.id) - refute Pleroma.Repo.get(Pleroma.ActivityExpiration, expiration.id) - end - - test "works with ActivityExpirationPolicy" do - Pleroma.Config.put([ActivityExpiration, :enabled], true) - - clear_config([:mrf, :policies], Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy) - - user = insert(:user) - - days = Pleroma.Config.get([:mrf_activity_expiration, :days], 365) - - {:ok, %{id: id} = activity} = Pleroma.Web.CommonAPI.post(user, %{status: "cofe"}) - - past_date = - NaiveDateTime.utc_now() |> Timex.shift(days: -days) |> NaiveDateTime.truncate(:second) - - activity - |> Repo.preload(:expiration) - |> Map.get(:expiration) - |> Ecto.Changeset.change(%{scheduled_at: past_date}) - |> Repo.update!() - - Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker.perform(%Oban.Job{}) - - assert [%{data: %{"type" => "Delete", "deleted_activity_id" => ^id}}] = - Pleroma.Repo.all(Pleroma.Activity) - end - - describe "delete_activity/1" do - test "adds log message if activity isn't find" do - assert capture_log([level: :error], fn -> - PurgeExpiredActivitiesWorker.delete_activity(%ActivityExpiration{ - activity_id: "test-activity" - }) - end) =~ "Couldn't delete expired activity: not found activity" - end - - test "adds log message if actor isn't find" do - assert capture_log([level: :error], fn -> - PurgeExpiredActivitiesWorker.delete_activity(%ActivityExpiration{ - activity_id: "test-activity" - }) - end) =~ "Couldn't delete expired activity: not found activity" - end - end -end diff --git a/test/workers/purge_expired_activity_test.exs b/test/workers/purge_expired_activity_test.exs new file mode 100644 index 000000000..8b5dc9fd2 --- /dev/null +++ b/test/workers/purge_expired_activity_test.exs @@ -0,0 +1,47 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Workers.PurgeExpiredActivityTest do + use Pleroma.DataCase, async: true + use Oban.Testing, repo: Pleroma.Repo + + import Pleroma.Factory + + alias Pleroma.Workers.PurgeExpiredActivity + + test "denies expirations that don't live long enough" do + activity = insert(:note_activity) + + assert {:error, :expiration_too_close} = + PurgeExpiredActivity.enqueue(%{ + activity_id: activity.id, + expires_at: DateTime.utc_now() + }) + + refute_enqueued( + worker: Pleroma.Workers.PurgeExpiredActivity, + args: %{activity_id: activity.id} + ) + end + + test "enqueue job" do + activity = insert(:note_activity) + + assert {:ok, _} = + PurgeExpiredActivity.enqueue(%{ + activity_id: activity.id, + expires_at: DateTime.add(DateTime.utc_now(), 3601) + }) + + assert_enqueued( + worker: Pleroma.Workers.PurgeExpiredActivity, + args: %{activity_id: activity.id} + ) + + assert {:ok, _} = + perform_job(Pleroma.Workers.PurgeExpiredActivity, %{activity_id: activity.id}) + + assert %Oban.Job{} = Pleroma.Workers.PurgeExpiredActivity.get_expiration(activity.id) + end +end From de4c935071a47c78d873484b202e09dce5399570 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Mon, 24 Aug 2020 13:43:02 +0300 Subject: [PATCH 072/182] don't expire pinned posts --- lib/pleroma/activity.ex | 9 ++++++-- lib/pleroma/workers/purge_expired_activity.ex | 18 +++++++++++++++- test/workers/purge_expired_activity_test.exs | 21 +++++++++++++++++++ 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index 03cd3b8c0..84aba9572 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -301,14 +301,14 @@ defmodule Pleroma.Activity do |> Repo.all() end - def follow_requests_for_actor(%Pleroma.User{ap_id: ap_id}) do + def follow_requests_for_actor(%User{ap_id: ap_id}) do ap_id |> Queries.by_object_id() |> Queries.by_type("Follow") |> where([a], fragment("? ->> 'state' = 'pending'", a.data)) end - def following_requests_for_actor(%Pleroma.User{ap_id: ap_id}) do + def following_requests_for_actor(%User{ap_id: ap_id}) do Queries.by_type("Follow") |> where([a], fragment("?->>'state' = 'pending'", a.data)) |> where([a], a.actor == ^ap_id) @@ -343,4 +343,9 @@ defmodule Pleroma.Activity do actor = user_actor(activity) activity.id in actor.pinned_activities end + + @spec pinned_by_actor?(Activity.t(), User.t()) :: boolean() + def pinned_by_actor?(%Activity{id: id}, %User{} = user) do + id in user.pinned_activities + end end diff --git a/lib/pleroma/workers/purge_expired_activity.ex b/lib/pleroma/workers/purge_expired_activity.ex index 016b000c1..ba0053008 100644 --- a/lib/pleroma/workers/purge_expired_activity.ex +++ b/lib/pleroma/workers/purge_expired_activity.ex @@ -21,8 +21,18 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do @impl true def perform(%Oban.Job{args: %{"activity_id" => id}}) do with %Pleroma.Activity{} = activity <- find_activity(id), - %Pleroma.User{} = user <- find_user(activity.object.data["actor"]) do + %Pleroma.User{} = user <- find_user(activity.object.data["actor"]), + false <- pinned_by_actor?(activity, user) do Pleroma.Web.CommonAPI.delete(activity.id, user) + else + :pinned_by_actor -> + # if activity is pinned, schedule deletion on next day + enqueue(%{activity_id: id, expires_at: DateTime.add(DateTime.utc_now(), 24 * 3600)}) + + :ok + + error -> + error end end @@ -54,6 +64,12 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do end end + defp pinned_by_actor?(activity, user) do + with true <- Pleroma.Activity.pinned_by_actor?(activity, user) do + :pinned_by_actor + end + end + def get_expiration(id) do from(j in Oban.Job, where: j.state == "scheduled", diff --git a/test/workers/purge_expired_activity_test.exs b/test/workers/purge_expired_activity_test.exs index 8b5dc9fd2..736d7d567 100644 --- a/test/workers/purge_expired_activity_test.exs +++ b/test/workers/purge_expired_activity_test.exs @@ -44,4 +44,25 @@ defmodule Pleroma.Workers.PurgeExpiredActivityTest do assert %Oban.Job{} = Pleroma.Workers.PurgeExpiredActivity.get_expiration(activity.id) end + + test "don't delete pinned posts, schedule deletion on next day" do + activity = insert(:note_activity) + + assert {:ok, _} = + PurgeExpiredActivity.enqueue(%{ + activity_id: activity.id, + expires_at: DateTime.utc_now(), + validate: false + }) + + user = Pleroma.User.get_by_ap_id(activity.actor) + {:ok, activity} = Pleroma.Web.CommonAPI.pin(activity.id, user) + + assert %{success: 1, failure: 0} == + Oban.drain_queue(queue: :activity_expiration, with_scheduled: true) + + job = Pleroma.Workers.PurgeExpiredActivity.get_expiration(activity.id) + + assert DateTime.diff(job.scheduled_at, DateTime.add(DateTime.utc_now(), 24 * 3600)) in [0, 1] + end end From 629a8de9cb2ba2cc2d09679862a24031f34abc2f Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Tue, 25 Aug 2020 09:10:45 +0300 Subject: [PATCH 073/182] deprecation warning changed namespace for activity expiration configuration --- config/description.exs | 6 +++--- lib/pleroma/config/deprecation_warnings.ex | 19 ++++++++++++++++++- lib/pleroma/workers/purge_expired_activity.ex | 8 +++++--- ...541_rename_activity_expiration_setting.exs | 13 +++++++++++++ 4 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 priv/repo/migrations/20200824115541_rename_activity_expiration_setting.exs diff --git a/config/description.exs b/config/description.exs index 6ce27278c..1253944de 100644 --- a/config/description.exs +++ b/config/description.exs @@ -2472,14 +2472,14 @@ config :pleroma, :config_description, [ }, %{ group: :pleroma, - key: Pleroma.ActivityExpiration, + key: Pleroma.Workers.PurgeExpiredActivity, type: :group, - description: "Expired activity settings", + description: "Expired activities settings", children: [ %{ key: :enabled, type: :boolean, - description: "Whether expired activities will be sent to the job queue to be deleted" + description: "Enables expired activities addition & deletion" } ] }, diff --git a/lib/pleroma/config/deprecation_warnings.ex b/lib/pleroma/config/deprecation_warnings.ex index 2bfe4ddba..412d55a77 100644 --- a/lib/pleroma/config/deprecation_warnings.ex +++ b/lib/pleroma/config/deprecation_warnings.ex @@ -8,7 +8,7 @@ defmodule Pleroma.Config.DeprecationWarnings do require Logger alias Pleroma.Config - @type config_namespace() :: [atom()] + @type config_namespace() :: atom() | [atom()] @type config_map() :: {config_namespace(), config_namespace(), String.t()} @mrf_config_map [ @@ -57,6 +57,7 @@ defmodule Pleroma.Config.DeprecationWarnings do check_media_proxy_whitelist_config() check_welcome_message_config() check_gun_pool_options() + check_activity_expiration_config() end def check_welcome_message_config do @@ -158,4 +159,20 @@ defmodule Pleroma.Config.DeprecationWarnings do Config.put(:pools, updated_config) end end + + @spec check_activity_expiration_config() :: :ok | nil + def check_activity_expiration_config do + warning_preface = """ + !!!DEPRECATION WARNING!!! + Your config is using old namespace for activity expiration configuration. Setting should work for now, but you are advised to change to new namespace to prevent possible issues later: + """ + + move_namespace_and_warn( + [ + {Pleroma.ActivityExpiration, Pleroma.Workers.PurgeExpiredActivity, + "\n* `config :pleroma, Pleroma.ActivityExpiration` is now `config :pleroma, Pleroma.Workers.PurgeExpiredActivity`"} + ], + warning_preface + ) + end end diff --git a/lib/pleroma/workers/purge_expired_activity.ex b/lib/pleroma/workers/purge_expired_activity.ex index ba0053008..44a8ad0b9 100644 --- a/lib/pleroma/workers/purge_expired_activity.ex +++ b/lib/pleroma/workers/purge_expired_activity.ex @@ -7,6 +7,8 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do import Ecto.Query + alias Pleroma.Activity + def enqueue(args) do with true <- enabled?(), args when is_map(args) <- validate_expires_at(args) do @@ -20,7 +22,7 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do @impl true def perform(%Oban.Job{args: %{"activity_id" => id}}) do - with %Pleroma.Activity{} = activity <- find_activity(id), + with %Activity{} = activity <- find_activity(id), %Pleroma.User{} = user <- find_user(activity.object.data["actor"]), false <- pinned_by_actor?(activity, user) do Pleroma.Web.CommonAPI.delete(activity.id, user) @@ -53,7 +55,7 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do end defp find_activity(id) do - with nil <- Pleroma.Activity.get_by_id_with_object(id) do + with nil <- Activity.get_by_id_with_object(id) do {:error, :activity_not_found} end end @@ -65,7 +67,7 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do end defp pinned_by_actor?(activity, user) do - with true <- Pleroma.Activity.pinned_by_actor?(activity, user) do + with true <- Activity.pinned_by_actor?(activity, user) do :pinned_by_actor end end diff --git a/priv/repo/migrations/20200824115541_rename_activity_expiration_setting.exs b/priv/repo/migrations/20200824115541_rename_activity_expiration_setting.exs new file mode 100644 index 000000000..241882ef6 --- /dev/null +++ b/priv/repo/migrations/20200824115541_rename_activity_expiration_setting.exs @@ -0,0 +1,13 @@ +defmodule Pleroma.Repo.Migrations.RenameActivityExpirationSetting do + use Ecto.Migration + + def change do + config = Pleroma.ConfigDB.get_by_params(%{group: :pleroma, key: Pleroma.ActivityExpiration}) + + if config do + config + |> Ecto.Changeset.change(key: Pleroma.Workers.PurgeExpiredActivity) + |> Pleroma.Repo.update() + end + end +end From 5ad0cc4c863f7f8a1e6fdfa40eb884a5c94ebf67 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Tue, 25 Aug 2020 12:30:00 +0300 Subject: [PATCH 074/182] move old expirations into Oban --- ...1316_move_activity_expirations_to_oban.exs | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs diff --git a/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs b/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs new file mode 100644 index 000000000..585d1a600 --- /dev/null +++ b/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs @@ -0,0 +1,29 @@ +defmodule Pleroma.Repo.Migrations.MoveActivityExpirationsToOban do + use Ecto.Migration + + import Ecto.Query, only: [from: 2] + + def change do + Supervisor.start_link([{Oban, Pleroma.Config.get(Oban)}], + strategy: :one_for_one, + name: Pleroma.Supervisor + ) + + from(e in "activity_expirations", + select: %{id: e.id, activity_id: e.activity_id, scheduled_at: e.scheduled_at} + ) + |> Pleroma.RepoStreamer.chunk_stream(500) + |> Stream.each(fn expirations -> + Enum.each(expirations, fn expiration -> + with {:ok, expires_at} <- DateTime.from_naive(expiration.scheduled_at, "Etc/UTC") do + Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ + activity_id: FlakeId.to_string(expiration.activity_id), + expires_at: expires_at, + validate: false + }) + end + end) + end) + |> Stream.run() + end +end From 5381d4b78b6ed550102008cbae7f578dab06f22f Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Tue, 25 Aug 2020 12:33:38 +0300 Subject: [PATCH 075/182] drop activity_expirations table --- .../20200825093037_drop_activity_expirations_table.exs | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 priv/repo/migrations/20200825093037_drop_activity_expirations_table.exs diff --git a/priv/repo/migrations/20200825093037_drop_activity_expirations_table.exs b/priv/repo/migrations/20200825093037_drop_activity_expirations_table.exs new file mode 100644 index 000000000..11c461427 --- /dev/null +++ b/priv/repo/migrations/20200825093037_drop_activity_expirations_table.exs @@ -0,0 +1,7 @@ +defmodule Pleroma.Repo.Migrations.DropActivityExpirationsTable do + use Ecto.Migration + + def change do + drop(table("activity_expirations")) + end +end From 4981b5a1a3c097ca849552c3c6f650efd22c7451 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Tue, 25 Aug 2020 12:45:06 +0300 Subject: [PATCH 076/182] copyright header --- lib/pleroma/workers/purge_expired_activity.ex | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/pleroma/workers/purge_expired_activity.ex b/lib/pleroma/workers/purge_expired_activity.ex index 44a8ad0b9..42e2ae79c 100644 --- a/lib/pleroma/workers/purge_expired_activity.ex +++ b/lib/pleroma/workers/purge_expired_activity.ex @@ -1,3 +1,7 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + defmodule Pleroma.Workers.PurgeExpiredActivity do @moduledoc """ Worker which purges expired activity. From 93e1c8df9dca697e7bdb822a8a5b3848b7870f53 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Thu, 3 Sep 2020 13:30:39 +0300 Subject: [PATCH 077/182] reject activity creation if passed expires_at option and expiring activities are not configured --- lib/pleroma/web/activity_pub/activity_pub.ex | 44 +++++++++----- lib/pleroma/workers/purge_expired_activity.ex | 4 ++ test/web/activity_pub/activity_pub_test.exs | 57 +++++++++++++++---- 3 files changed, 80 insertions(+), 25 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index c33848277..ee6dcf58a 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -110,23 +110,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do def insert(map, local \\ true, fake \\ false, bypass_actor_check \\ false) when is_map(map) do with nil <- Activity.normalize(map), map <- lazy_put_activity_defaults(map, fake), - true <- bypass_actor_check || check_actor_is_active(map["actor"]), - {_, true} <- {:remote_limit_error, check_remote_limit(map)}, + {_, true} <- {:actor_check, bypass_actor_check || check_actor_is_active(map["actor"])}, + {_, true} <- {:remote_limit_pass, check_remote_limit(map)}, {:ok, map} <- MRF.filter(map), {recipients, _, _} = get_recipients(map), {:fake, false, map, recipients} <- {:fake, fake, map, recipients}, {:containment, :ok} <- {:containment, Containment.contain_child(map)}, - {:ok, map, object} <- insert_full_object(map) do - {:ok, activity} = - %Activity{ - data: map, - local: local, - actor: map["actor"], - recipients: recipients - } - |> Repo.insert() - |> maybe_create_activity_expiration() - + {:ok, map, object} <- insert_full_object(map), + {:ok, activity} <- insert_activity_with_expiration(map, local, recipients) do # Splice in the child object if we have one. activity = Maps.put_if_present(activity, :object, object) @@ -137,6 +128,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do %Activity{} = activity -> {:ok, activity} + {:actor_check, _} -> + {:error, false} + + {:containment, _} = error -> + error + + {:error, _} = error -> + error + {:fake, true, map, recipients} -> activity = %Activity{ data: map, @@ -149,11 +149,25 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity) {:ok, activity} - error -> - {:error, error} + {:remote_limit_pass, _} -> + {:error, :remote_limit} + + {:reject, reason} -> + {:error, reason} end end + defp insert_activity_with_expiration(data, local, recipients) do + %Activity{ + data: data, + local: local, + actor: data["actor"], + recipients: recipients + } + |> Repo.insert() + |> maybe_create_activity_expiration() + end + def notify_and_stream(activity) do Notification.create_notifications(activity) diff --git a/lib/pleroma/workers/purge_expired_activity.ex b/lib/pleroma/workers/purge_expired_activity.ex index 42e2ae79c..c70587b47 100644 --- a/lib/pleroma/workers/purge_expired_activity.ex +++ b/lib/pleroma/workers/purge_expired_activity.ex @@ -13,6 +13,10 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do alias Pleroma.Activity + @spec enqueue(map()) :: + {:ok, Oban.Job.t()} + | {:error, :expired_activities_disabled} + | {:error, :expiration_too_close} def enqueue(args) do with true <- enabled?(), args when is_map(args) <- validate_expires_at(args) do diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 9af573924..d8caa0b00 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -239,7 +239,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do } } - assert {:error, {:remote_limit_error, _}} = ActivityPub.insert(data) + assert {:error, :remote_limit} = ActivityPub.insert(data) end test "doesn't drop activities with content being null" do @@ -386,9 +386,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do end describe "create activities" do - test "it reverts create" do - user = insert(:user) + setup do + [user: insert(:user)] + end + test "it reverts create", %{user: user} do with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do assert {:error, :reverted} = ActivityPub.create(%{ @@ -407,9 +409,47 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do assert Repo.aggregate(Object, :count, :id) == 0 end - test "removes doubled 'to' recipients" do - user = insert(:user) + test "creates activity if expiration is not configured and expires_at is not passed", %{ + user: user + } do + clear_config([Pleroma.Workers.PurgeExpiredActivity, :enabled], false) + assert {:ok, _} = + ActivityPub.create(%{ + to: ["user1", "user2"], + actor: user, + context: "", + object: %{ + "to" => ["user1", "user2"], + "type" => "Note", + "content" => "testing" + } + }) + end + + test "rejects activity if expires_at present but expiration is not configured", %{user: user} do + clear_config([Pleroma.Workers.PurgeExpiredActivity, :enabled], false) + + assert {:error, :expired_activities_disabled} = + ActivityPub.create(%{ + to: ["user1", "user2"], + actor: user, + context: "", + object: %{ + "to" => ["user1", "user2"], + "type" => "Note", + "content" => "testing" + }, + additional: %{ + "expires_at" => DateTime.utc_now() + } + }) + + assert Repo.aggregate(Activity, :count, :id) == 0 + assert Repo.aggregate(Object, :count, :id) == 0 + end + + test "removes doubled 'to' recipients", %{user: user} do {:ok, activity} = ActivityPub.create(%{ to: ["user1", "user1", "user2"], @@ -427,9 +467,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do assert activity.recipients == ["user1", "user2", user.ap_id] end - test "increases user note count only for public activities" do - user = insert(:user) - + test "increases user note count only for public activities", %{user: user} do {:ok, _} = CommonAPI.post(User.get_cached_by_id(user.id), %{ status: "1", @@ -458,8 +496,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do assert user.note_count == 2 end - test "increases replies count" do - user = insert(:user) + test "increases replies count", %{user: user} do user2 = insert(:user) {:ok, activity} = CommonAPI.post(user, %{status: "1", visibility: "public"}) From 357d971a10c28780795af4d19b37b0ac80d6ad09 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Thu, 3 Sep 2020 17:56:20 +0300 Subject: [PATCH 078/182] expiration for new pipeline --- lib/pleroma/web/activity_pub/activity_pub.ex | 18 ++++++++++++------ lib/pleroma/web/activity_pub/side_effects.ex | 7 ------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index ee6dcf58a..66a9f78a3 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -101,7 +101,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do local: local, recipients: recipients, actor: object["actor"] - }) do + }), + # TODO: add tests for expired activities, when Note type will be supported in new pipeline + {:ok, _} <- maybe_create_activity_expiration(activity) do {:ok, activity, meta} end end @@ -158,14 +160,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end defp insert_activity_with_expiration(data, local, recipients) do - %Activity{ + struct = %Activity{ data: data, local: local, actor: data["actor"], recipients: recipients } - |> Repo.insert() - |> maybe_create_activity_expiration() + + with {:ok, activity} <- Repo.insert(struct) do + maybe_create_activity_expiration(activity) + end end def notify_and_stream(activity) do @@ -177,7 +181,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do stream_out_participations(participations) end - defp maybe_create_activity_expiration({:ok, %{data: %{"expires_at" => expires_at}} = activity}) do + defp maybe_create_activity_expiration( + %{data: %{"expires_at" => %DateTime{} = expires_at}} = activity + ) do with {:ok, _job} <- Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ activity_id: activity.id, @@ -187,7 +193,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end end - defp maybe_create_activity_expiration(result), do: result + defp maybe_create_activity_expiration(activity), do: {:ok, activity} defp create_or_bump_conversation(activity, actor) do with {:ok, conversation} <- Conversation.create_or_bump_for(activity), diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index b30ca1bd7..46a8be767 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -187,13 +187,6 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do Object.increase_replies_count(in_reply_to) end - if expires_at = activity.data["expires_at"] do - Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ - activity_id: activity.id, - expires_at: expires_at - }) - end - BackgroundWorker.enqueue("fetch_data_for_activity", %{"activity_id" => activity.id}) meta = From 6f2d1145183389c415e4d5a915e0c3965c00a3fb Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Thu, 3 Sep 2020 18:08:19 +0300 Subject: [PATCH 079/182] use another stream function in migration --- ...1316_move_activity_expirations_to_oban.exs | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs b/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs index 585d1a600..2bfefceb0 100644 --- a/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs +++ b/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs @@ -12,17 +12,15 @@ defmodule Pleroma.Repo.Migrations.MoveActivityExpirationsToOban do from(e in "activity_expirations", select: %{id: e.id, activity_id: e.activity_id, scheduled_at: e.scheduled_at} ) - |> Pleroma.RepoStreamer.chunk_stream(500) - |> Stream.each(fn expirations -> - Enum.each(expirations, fn expiration -> - with {:ok, expires_at} <- DateTime.from_naive(expiration.scheduled_at, "Etc/UTC") do - Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ - activity_id: FlakeId.to_string(expiration.activity_id), - expires_at: expires_at, - validate: false - }) - end - end) + |> Pleroma.Repo.stream() + |> Enum.each(fn expiration -> + with {:ok, expires_at} <- DateTime.from_naive(expiration.scheduled_at, "Etc/UTC") do + Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ + activity_id: FlakeId.to_string(expiration.activity_id), + expires_at: expires_at, + validate: false + }) + end end) |> Stream.run() end From b3485a6dbfb1a16dd5604294074ef5139fbf3ce9 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Thu, 3 Sep 2020 19:02:22 +0300 Subject: [PATCH 080/182] little clean up --- lib/pleroma/workers/purge_expired_activity.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/workers/purge_expired_activity.ex b/lib/pleroma/workers/purge_expired_activity.ex index c70587b47..4be146194 100644 --- a/lib/pleroma/workers/purge_expired_activity.ex +++ b/lib/pleroma/workers/purge_expired_activity.ex @@ -23,7 +23,7 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do {scheduled_at, args} = Map.pop(args, :expires_at) args - |> __MODULE__.new(scheduled_at: scheduled_at) + |> new(scheduled_at: scheduled_at) |> Oban.insert() end end From eb5ff715f7917e174b9ae104a5d82779ff925301 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Fri, 4 Sep 2020 11:40:32 +0300 Subject: [PATCH 081/182] pin/unpin for activities with expires_at option --- lib/pleroma/activity.ex | 5 -- lib/pleroma/user.ex | 17 ++++++- lib/pleroma/workers/purge_expired_activity.ex | 18 +------ .../controllers/status_controller_test.exs | 49 ++++++++++++++++++- test/workers/purge_expired_activity_test.exs | 21 -------- 5 files changed, 64 insertions(+), 46 deletions(-) diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index 84aba9572..17af04257 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -343,9 +343,4 @@ defmodule Pleroma.Activity do actor = user_actor(activity) activity.id in actor.pinned_activities end - - @spec pinned_by_actor?(Activity.t(), User.t()) :: boolean() - def pinned_by_actor?(%Activity{id: id}, %User{} = user) do - id in user.pinned_activities - end end diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index f323fc6ed..e73d19964 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -2315,6 +2315,11 @@ defmodule Pleroma.User do max_pinned_statuses = Config.get([:instance, :max_pinned_statuses], 0) params = %{pinned_activities: user.pinned_activities ++ [id]} + # if pinned activity was scheduled for deletion, we remove job + if expiration = Pleroma.Workers.PurgeExpiredActivity.get_expiration(id) do + Oban.cancel_job(expiration.id) + end + user |> cast(params, [:pinned_activities]) |> validate_length(:pinned_activities, @@ -2327,9 +2332,19 @@ defmodule Pleroma.User do |> update_and_set_cache() end - def remove_pinnned_activity(user, %Pleroma.Activity{id: id}) do + def remove_pinnned_activity(user, %Pleroma.Activity{id: id, data: data}) do params = %{pinned_activities: List.delete(user.pinned_activities, id)} + # if pinned activity was scheduled for deletion, we reschedule it for deletion + if data["expires_at"] do + {:ok, expires_at, _} = DateTime.from_iso8601(data["expires_at"]) + + Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ + activity_id: id, + expires_at: expires_at + }) + end + user |> cast(params, [:pinned_activities]) |> update_and_set_cache() diff --git a/lib/pleroma/workers/purge_expired_activity.ex b/lib/pleroma/workers/purge_expired_activity.ex index 4be146194..f981eda8e 100644 --- a/lib/pleroma/workers/purge_expired_activity.ex +++ b/lib/pleroma/workers/purge_expired_activity.ex @@ -31,18 +31,8 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do @impl true def perform(%Oban.Job{args: %{"activity_id" => id}}) do with %Activity{} = activity <- find_activity(id), - %Pleroma.User{} = user <- find_user(activity.object.data["actor"]), - false <- pinned_by_actor?(activity, user) do + %Pleroma.User{} = user <- find_user(activity.object.data["actor"]) do Pleroma.Web.CommonAPI.delete(activity.id, user) - else - :pinned_by_actor -> - # if activity is pinned, schedule deletion on next day - enqueue(%{activity_id: id, expires_at: DateTime.add(DateTime.utc_now(), 24 * 3600)}) - - :ok - - error -> - error end end @@ -74,12 +64,6 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do end end - defp pinned_by_actor?(activity, user) do - with true <- Activity.pinned_by_actor?(activity, user) do - :pinned_by_actor - end - end - def get_expiration(id) do from(j in Oban.Job, where: j.state == "scheduled", diff --git a/test/web/mastodon_api/controllers/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index 17a156be8..82ea73898 100644 --- a/test/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/web/mastodon_api/controllers/status_controller_test.exs @@ -115,8 +115,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do "expires_in" => expires_in }) - assert fourth_response = - %{"id" => fourth_id} = json_response_and_validate_schema(conn_four, 200) + assert %{"id" => fourth_id} = json_response_and_validate_schema(conn_four, 200) assert Activity.get_by_id(fourth_id) @@ -1142,6 +1141,52 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do |> post("/api/v1/statuses/#{activity_two.id}/pin") |> json_response_and_validate_schema(400) end + + test "on pin removes deletion job, on unpin reschedule deletion" do + %{conn: conn} = oauth_access(["write:accounts", "write:statuses"]) + expires_in = 2 * 60 * 60 + + expires_at = DateTime.add(DateTime.utc_now(), expires_in) + + assert %{"id" => id} = + conn + |> put_req_header("content-type", "application/json") + |> post("api/v1/statuses", %{ + "status" => "oolong", + "expires_in" => expires_in + }) + |> json_response_and_validate_schema(200) + + assert_enqueued( + worker: Pleroma.Workers.PurgeExpiredActivity, + args: %{activity_id: id}, + scheduled_at: expires_at + ) + + assert %{"id" => ^id, "pinned" => true} = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/#{id}/pin") + |> json_response_and_validate_schema(200) + + refute_enqueued( + worker: Pleroma.Workers.PurgeExpiredActivity, + args: %{activity_id: id}, + scheduled_at: expires_at + ) + + assert %{"id" => ^id, "pinned" => false} = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/statuses/#{id}/unpin") + |> json_response_and_validate_schema(200) + + assert_enqueued( + worker: Pleroma.Workers.PurgeExpiredActivity, + args: %{activity_id: id}, + scheduled_at: expires_at + ) + end end describe "cards" do diff --git a/test/workers/purge_expired_activity_test.exs b/test/workers/purge_expired_activity_test.exs index 736d7d567..8b5dc9fd2 100644 --- a/test/workers/purge_expired_activity_test.exs +++ b/test/workers/purge_expired_activity_test.exs @@ -44,25 +44,4 @@ defmodule Pleroma.Workers.PurgeExpiredActivityTest do assert %Oban.Job{} = Pleroma.Workers.PurgeExpiredActivity.get_expiration(activity.id) end - - test "don't delete pinned posts, schedule deletion on next day" do - activity = insert(:note_activity) - - assert {:ok, _} = - PurgeExpiredActivity.enqueue(%{ - activity_id: activity.id, - expires_at: DateTime.utc_now(), - validate: false - }) - - user = Pleroma.User.get_by_ap_id(activity.actor) - {:ok, activity} = Pleroma.Web.CommonAPI.pin(activity.id, user) - - assert %{success: 1, failure: 0} == - Oban.drain_queue(queue: :activity_expiration, with_scheduled: true) - - job = Pleroma.Workers.PurgeExpiredActivity.get_expiration(activity.id) - - assert DateTime.diff(job.scheduled_at, DateTime.add(DateTime.utc_now(), 24 * 3600)) in [0, 1] - end end From 29c1178c2b20eb1b389c7e1d35b58af05f48e8a2 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Fri, 4 Sep 2020 12:05:17 +0300 Subject: [PATCH 082/182] migration fix --- .../20200825061316_move_activity_expirations_to_oban.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs b/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs index 2bfefceb0..137933368 100644 --- a/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs +++ b/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs @@ -13,7 +13,7 @@ defmodule Pleroma.Repo.Migrations.MoveActivityExpirationsToOban do select: %{id: e.id, activity_id: e.activity_id, scheduled_at: e.scheduled_at} ) |> Pleroma.Repo.stream() - |> Enum.each(fn expiration -> + |> Stream.each(fn expiration -> with {:ok, expires_at} <- DateTime.from_naive(expiration.scheduled_at, "Etc/UTC") do Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ activity_id: FlakeId.to_string(expiration.activity_id), From f24828a3e848e6ce3bcdd254e8c6e451898cfdf7 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Mon, 7 Sep 2020 20:21:32 +0300 Subject: [PATCH 083/182] oban warning --- lib/pleroma/config/oban.ex | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/config/oban.ex b/lib/pleroma/config/oban.ex index 81758c93d..9f601b1a3 100644 --- a/lib/pleroma/config/oban.ex +++ b/lib/pleroma/config/oban.ex @@ -5,7 +5,11 @@ defmodule Pleroma.Config.Oban do oban_config = Pleroma.Config.get(Oban) crontab = - [Pleroma.Workers.Cron.StatsWorker, Pleroma.Workers.Cron.ClearOauthTokenWorker] + [ + Pleroma.Workers.Cron.StatsWorker, + Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker, + Pleroma.Workers.Cron.ClearOauthTokenWorker + ] |> Enum.reduce(oban_config[:crontab], fn removed_worker, acc -> with acc when is_list(acc) <- acc, setting when is_tuple(setting) <- From 4954667fb24ee6ab7b1bf3b676f7e88a582130cf Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Mon, 7 Sep 2020 20:22:14 +0300 Subject: [PATCH 084/182] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14c0252f7..79cf02c96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **Breaking:** Removed `Pleroma.Workers.Cron.StatsWorker` setting from Oban `:crontab`. - **Breaking:** Removed `Pleroma.Workers.Cron.ClearOauthTokenWorker` setting from Oban `:crontab` config. +- **Breaking:** Removed `Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker` setting from Oban `:crontab`. ## [2.1.1] - 2020-09-08 From 2c2094d4b2722cf511e3db8288c3754a48038f05 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Mon, 7 Sep 2020 20:57:38 +0300 Subject: [PATCH 085/182] configurable lifetime for ephemeral activities --- config/config.exs | 2 +- config/description.exs | 6 ++++++ docs/configuration/cheatsheet.md | 13 +++++++++++++ lib/pleroma/workers/purge_expired_activity.ex | 3 ++- .../controllers/status_controller_test.exs | 8 ++++---- 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/config/config.exs b/config/config.exs index d975db31e..88c47fd03 100644 --- a/config/config.exs +++ b/config/config.exs @@ -654,7 +654,7 @@ config :pleroma, :rate_limit, account_confirmation_resend: {8_640_000, 5}, ap_routes: {60_000, 15} -config :pleroma, Pleroma.Workers.PurgeExpiredActivity, enabled: true +config :pleroma, Pleroma.Workers.PurgeExpiredActivity, enabled: true, min_lifetime: 600 config :pleroma, Pleroma.Plugs.RemoteIp, enabled: true diff --git a/config/description.exs b/config/description.exs index 1253944de..82c7bc6a7 100644 --- a/config/description.exs +++ b/config/description.exs @@ -2480,6 +2480,12 @@ config :pleroma, :config_description, [ key: :enabled, type: :boolean, description: "Enables expired activities addition & deletion" + }, + %{ + key: :min_lifetime, + type: :integer, + description: "Minimum lifetime for ephemeral activity (in seconds)", + suggestions: [600] } ] }, diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index d0bebbd45..8f2425384 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -1091,3 +1091,16 @@ config :pleroma, :frontends, ``` This would serve the frontend from the the folder at `$instance_static/frontends/pleroma/stable`. You have to copy the frontend into this folder yourself. You can choose the name and ref any way you like, but they will be used by mix tasks to automate installation in the future, the name referring to the project and the ref referring to a commit. + +## Ephemeral activities + +Settings to enable and configure expiration for ephemeral activities + +* `:enabled` - enables ephemeral activities creation +* `:min_lifetime` - minimum lifetime for ephemeral activities (in seconds). Default: 10 minutes. + +Example: + +```elixir + config :pleroma, Pleroma.Workers.PurgeExpiredActivity, enabled: true, min_lifetime: 600 +``` diff --git a/lib/pleroma/workers/purge_expired_activity.ex b/lib/pleroma/workers/purge_expired_activity.ex index f981eda8e..ffcb89dc3 100644 --- a/lib/pleroma/workers/purge_expired_activity.ex +++ b/lib/pleroma/workers/purge_expired_activity.ex @@ -77,6 +77,7 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do def expires_late_enough?(scheduled_at) do now = DateTime.utc_now() diff = DateTime.diff(scheduled_at, now, :millisecond) - diff > :timer.hours(1) + min_lifetime = Pleroma.Config.get([__MODULE__, :min_lifetime], 600) + diff > :timer.seconds(min_lifetime) end end diff --git a/test/web/mastodon_api/controllers/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index 82ea73898..633a25e50 100644 --- a/test/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/web/mastodon_api/controllers/status_controller_test.exs @@ -129,8 +129,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do test "it fails to create a status if `expires_in` is less or equal than an hour", %{ conn: conn } do - # 1 hour - expires_in = 60 * 60 + # 1 minute + expires_in = 1 * 60 assert %{"error" => "Expiry date is too soon"} = conn @@ -141,8 +141,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do }) |> json_response_and_validate_schema(422) - # 30 minutes - expires_in = 30 * 60 + # 5 minutes + expires_in = 5 * 60 assert %{"error" => "Expiry date is too soon"} = conn From a098e10fd6d9f3b6573e2fb6333335d40a9bf330 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Tue, 8 Sep 2020 12:07:33 +0300 Subject: [PATCH 086/182] Document ephemeral activity changes better Also remove the example from the cheatsheet, there is no need for it when the types are simple --- CHANGELOG.md | 3 +++ docs/configuration/cheatsheet.md | 8 +------- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79cf02c96..a58a18c8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **Breaking:** Removed `Pleroma.Workers.Cron.ClearOauthTokenWorker` setting from Oban `:crontab` config. - **Breaking:** Removed `Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker` setting from Oban `:crontab`. +### Changed +- Minimum lifetime for ephmeral activities changed to 10 minutes and made configurable (`:min_lifetime` option). + ## [2.1.1] - 2020-09-08 ### Security diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 8f2425384..7cf1d1ce7 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -1092,15 +1092,9 @@ config :pleroma, :frontends, This would serve the frontend from the the folder at `$instance_static/frontends/pleroma/stable`. You have to copy the frontend into this folder yourself. You can choose the name and ref any way you like, but they will be used by mix tasks to automate installation in the future, the name referring to the project and the ref referring to a commit. -## Ephemeral activities +## Ephemeral activities (Pleroma.Workers.PurgeExpiredActivity) Settings to enable and configure expiration for ephemeral activities * `:enabled` - enables ephemeral activities creation * `:min_lifetime` - minimum lifetime for ephemeral activities (in seconds). Default: 10 minutes. - -Example: - -```elixir - config :pleroma, Pleroma.Workers.PurgeExpiredActivity, enabled: true, min_lifetime: 600 -``` From 15aece72382fe1862a58728b9d02990147f91365 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Tue, 8 Sep 2020 15:11:18 +0300 Subject: [PATCH 087/182] remove validate_expires_at from enqueue method --- lib/mix/tasks/pleroma/database.ex | 3 +- lib/pleroma/workers/purge_expired_activity.ex | 13 +----- ...1316_move_activity_expirations_to_oban.exs | 3 +- test/workers/purge_expired_activity_test.exs | 42 ++++++++++++------- 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index aab4b5e9a..7f1108dcf 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -155,8 +155,7 @@ defmodule Mix.Tasks.Pleroma.Database do Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ activity_id: activity.id, - expires_at: expires_at, - validate: false + expires_at: expires_at }) end) end) diff --git a/lib/pleroma/workers/purge_expired_activity.ex b/lib/pleroma/workers/purge_expired_activity.ex index ffcb89dc3..c168890a2 100644 --- a/lib/pleroma/workers/purge_expired_activity.ex +++ b/lib/pleroma/workers/purge_expired_activity.ex @@ -18,8 +18,7 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do | {:error, :expired_activities_disabled} | {:error, :expiration_too_close} def enqueue(args) do - with true <- enabled?(), - args when is_map(args) <- validate_expires_at(args) do + with true <- enabled?() do {scheduled_at, args} = Map.pop(args, :expires_at) args @@ -42,16 +41,6 @@ defmodule Pleroma.Workers.PurgeExpiredActivity do end end - defp validate_expires_at(%{validate: false} = args), do: Map.delete(args, :validate) - - defp validate_expires_at(args) do - if expires_late_enough?(args[:expires_at]) do - args - else - {:error, :expiration_too_close} - end - end - defp find_activity(id) do with nil <- Activity.get_by_id_with_object(id) do {:error, :activity_not_found} diff --git a/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs b/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs index 137933368..cdc00d20b 100644 --- a/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs +++ b/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs @@ -17,8 +17,7 @@ defmodule Pleroma.Repo.Migrations.MoveActivityExpirationsToOban do with {:ok, expires_at} <- DateTime.from_naive(expiration.scheduled_at, "Etc/UTC") do Pleroma.Workers.PurgeExpiredActivity.enqueue(%{ activity_id: FlakeId.to_string(expiration.activity_id), - expires_at: expires_at, - validate: false + expires_at: expires_at }) end end) diff --git a/test/workers/purge_expired_activity_test.exs b/test/workers/purge_expired_activity_test.exs index 8b5dc9fd2..b5938776d 100644 --- a/test/workers/purge_expired_activity_test.exs +++ b/test/workers/purge_expired_activity_test.exs @@ -10,21 +10,6 @@ defmodule Pleroma.Workers.PurgeExpiredActivityTest do alias Pleroma.Workers.PurgeExpiredActivity - test "denies expirations that don't live long enough" do - activity = insert(:note_activity) - - assert {:error, :expiration_too_close} = - PurgeExpiredActivity.enqueue(%{ - activity_id: activity.id, - expires_at: DateTime.utc_now() - }) - - refute_enqueued( - worker: Pleroma.Workers.PurgeExpiredActivity, - args: %{activity_id: activity.id} - ) - end - test "enqueue job" do activity = insert(:note_activity) @@ -44,4 +29,31 @@ defmodule Pleroma.Workers.PurgeExpiredActivityTest do assert %Oban.Job{} = Pleroma.Workers.PurgeExpiredActivity.get_expiration(activity.id) end + + test "error if user was not found" do + activity = insert(:note_activity) + + assert {:ok, _} = + PurgeExpiredActivity.enqueue(%{ + activity_id: activity.id, + expires_at: DateTime.add(DateTime.utc_now(), 3601) + }) + + user = Pleroma.User.get_by_ap_id(activity.actor) + Pleroma.Repo.delete(user) + + assert {:error, :user_not_found} = + perform_job(Pleroma.Workers.PurgeExpiredActivity, %{activity_id: activity.id}) + end + + test "error if actiivity was not found" do + assert {:ok, _} = + PurgeExpiredActivity.enqueue(%{ + activity_id: "some_id", + expires_at: DateTime.add(DateTime.utc_now(), 3601) + }) + + assert {:error, :activity_not_found} = + perform_job(Pleroma.Workers.PurgeExpiredActivity, %{activity_id: "some_if"}) + end end From 82b56cdb9bc01dcf4dbd2ac0c06103af0900787d Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 10 Sep 2020 21:53:58 +0300 Subject: [PATCH 088/182] CHANGELOG.md: clarify that the functionality is not removed, just the config options --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a58a18c8c..75357f05e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,9 +12,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Removed -- **Breaking:** Removed `Pleroma.Workers.Cron.StatsWorker` setting from Oban `:crontab`. -- **Breaking:** Removed `Pleroma.Workers.Cron.ClearOauthTokenWorker` setting from Oban `:crontab` config. -- **Breaking:** Removed `Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker` setting from Oban `:crontab`. +- **Breaking:** `Pleroma.Workers.Cron.StatsWorker` setting from Oban `:crontab` (moved to a simpler implementation). +- **Breaking:** `Pleroma.Workers.Cron.ClearOauthTokenWorker` setting from Oban `:crontab` (moved to scheduled jobs). +- **Breaking:** `Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker` setting from Oban `:crontab` (moved to scheduled jobs). ### Changed - Minimum lifetime for ephmeral activities changed to 10 minutes and made configurable (`:min_lifetime` option). From 4d18a50f3c4b6654339a6a8df71160e23b45cac0 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Thu, 10 Sep 2020 21:54:26 +0300 Subject: [PATCH 089/182] [#2497] Formatting fix. --- lib/pleroma/web/media_proxy/media_proxy_controller.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 5621f72dc..ff7fd2409 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -158,7 +158,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do |> put_resp_header("cache-control", ReverseProxy.default_cache_control_header()) end - defp thumbnail_max_dimensions() do + defp thumbnail_max_dimensions do config = Config.get([:media_preview_proxy], []) thumbnail_max_width = Keyword.fetch!(config, :thumbnail_max_width) From da876d09e89bcfec6f2d1eaddb396f68ce48e12a Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Thu, 10 Sep 2020 23:13:51 +0200 Subject: [PATCH 090/182] federator: normalize only actor, catch actor error --- lib/pleroma/web/federator/federator.ex | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/web/federator/federator.ex b/lib/pleroma/web/federator/federator.ex index f5803578d..e4ab9ba32 100644 --- a/lib/pleroma/web/federator/federator.ex +++ b/lib/pleroma/web/federator/federator.ex @@ -66,14 +66,17 @@ defmodule Pleroma.Web.Federator do def perform(:incoming_ap_doc, params) do Logger.debug("Handling incoming AP activity") - params = Utils.normalize_params(params) + actor = + params + |> Map.get("actor") + |> Utils.get_ap_id() # NOTE: we use the actor ID to do the containment, this is fine because an # actor shouldn't be acting on objects outside their own AP server. - with {:ok, _user} <- ap_enabled_actor(params["actor"]), + with {_, {:ok, _user}} <- {:actor, ap_enabled_actor(actor)}, nil <- Activity.normalize(params["id"]), {_, :ok} <- - {:correct_origin?, Containment.contain_origin_from_id(params["actor"], params)}, + {:correct_origin?, Containment.contain_origin_from_id(actor, params)}, {:ok, activity} <- Transmogrifier.handle_incoming(params) do {:ok, activity} else @@ -85,10 +88,13 @@ defmodule Pleroma.Web.Federator do Logger.debug("Already had #{params["id"]}") {:error, :already_present} + {:actor, e} -> + Logger.debug("Unhandled actor #{actor}, #{inspect(e)}") + {:error, e} + e -> # Just drop those for now - Logger.debug("Unhandled activity") - Logger.debug(Jason.encode!(params, pretty: true)) + Logger.debug("Unhandled activity\n" <> Jason.encode!(params, pretty: true)) {:error, e} end end From b73e9ef68689a7094e80e2affa0af9b05e86effb Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 25 Aug 2020 09:19:53 +0200 Subject: [PATCH 091/182] transmogrifier: Call strip_internal_fields on pipeline ingestion --- lib/pleroma/web/activity_pub/transmogrifier.ex | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index af4384213..ec3b24206 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -550,6 +550,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do _options ) when objtype in ~w{Question Answer ChatMessage Audio Event} do + data = Map.put(data, "object", strip_internal_fields(data["object"])) + with {:ok, %User{}} <- ObjectValidator.fetch_actor(data), {:ok, activity, _} <- Pipeline.common_pipeline(data, local: false) do {:ok, activity} From 846b59ccb09681bda0f54bed43f5b82883228e33 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Thu, 20 Aug 2020 02:00:04 +0200 Subject: [PATCH 092/182] Pipeline Ingestion: Video --- lib/pleroma/web/activity_pub/activity_pub.ex | 2 +- .../web/activity_pub/object_validator.ex | 16 +- ..._validator.ex => audio_video_validator.ex} | 43 ++++- .../object_validators/common_fixes.ex | 9 ++ .../create_generic_validator.ex | 8 +- lib/pleroma/web/activity_pub/side_effects.ex | 2 +- .../web/activity_pub/transmogrifier.ex | 37 +---- .../tesla_mock/framatube.org-video.json | 2 +- .../transmogrifier/video_handling_test.exs | 93 +++++++++++ test/web/activity_pub/transmogrifier_test.exs | 148 +----------------- 10 files changed, 158 insertions(+), 202 deletions(-) rename lib/pleroma/web/activity_pub/object_validators/{audio_validator.ex => audio_video_validator.ex} (75%) create mode 100644 test/web/activity_pub/transmogrifier/video_handling_test.exs diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 66a9f78a3..bceec8bd1 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -84,7 +84,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp increase_replies_count_if_reply(_create_data), do: :noop - @object_types ~w[ChatMessage Question Answer Audio Event] + @object_types ~w[ChatMessage Question Answer Audio Video Event] @spec persist(map(), keyword()) :: {:ok, Activity.t() | Object.t()} def persist(%{"type" => type} = object, meta) when type in @object_types do with {:ok, object} <- Object.create(object) do diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index b77c06395..081f96389 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -12,11 +12,12 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do alias Pleroma.Activity alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Object + alias Pleroma.Object.Containment alias Pleroma.User alias Pleroma.Web.ActivityPub.ObjectValidators.AcceptRejectValidator alias Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator alias Pleroma.Web.ActivityPub.ObjectValidators.AnswerValidator - alias Pleroma.Web.ActivityPub.ObjectValidators.AudioValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.AudioVideoValidator alias Pleroma.Web.ActivityPub.ObjectValidators.BlockValidator alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator alias Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator @@ -149,10 +150,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do end end - def validate(%{"type" => "Audio"} = object, meta) do + def validate(%{"type" => type} = object, meta) when type in ~w[Audio Video] do with {:ok, object} <- object - |> AudioValidator.cast_and_validate() + |> AudioVideoValidator.cast_and_validate() |> Ecto.Changeset.apply_action(:insert) do object = stringify_keys(object) {:ok, object, meta} @@ -198,7 +199,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do %{"type" => "Create", "object" => %{"type" => objtype} = object} = create_activity, meta ) - when objtype in ~w[Question Answer Audio Event] do + when objtype in ~w[Question Answer Audio Video Event] do with {:ok, object_data} <- cast_and_apply(object), meta = Keyword.put(meta, :object_data, object_data |> stringify_keys), {:ok, create_activity} <- @@ -232,8 +233,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do AnswerValidator.cast_and_apply(object) end - def cast_and_apply(%{"type" => "Audio"} = object) do - AudioValidator.cast_and_apply(object) + def cast_and_apply(%{"type" => type} = object) when type in ~w[Audio Video] do + AudioVideoValidator.cast_and_apply(object) end def cast_and_apply(%{"type" => "Event"} = object) do @@ -262,7 +263,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do def stringify_keys(object), do: object def fetch_actor(object) do - with {:ok, actor} <- ObjectValidators.ObjectID.cast(object["actor"]) do + with actor <- Containment.get_actor(object), + {:ok, actor} <- ObjectValidators.ObjectID.cast(actor) do User.get_or_fetch_by_ap_id(actor) end end diff --git a/lib/pleroma/web/activity_pub/object_validators/audio_validator.ex b/lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex similarity index 75% rename from lib/pleroma/web/activity_pub/object_validators/audio_validator.ex rename to lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex index 1a97c504a..a6119e627 100644 --- a/lib/pleroma/web/activity_pub/object_validators/audio_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex @@ -2,9 +2,10 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioValidator do +defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioVideoValidator do use Ecto.Schema + alias Pleroma.EarmarkRenderer alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator alias Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes @@ -25,14 +26,19 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioValidator do # TODO: Write type field(:tag, {:array, :map}, default: []) field(:type, :string) + + field(:name, :string) + field(:summary, :string) field(:content, :string) + field(:context, :string) + # short identifier for PleromaFE to group statuses by context + field(:context_id, :integer) # TODO: Remove actor on objects field(:actor, ObjectValidators.ObjectID) field(:attributedTo, ObjectValidators.ObjectID) - field(:summary, :string) field(:published, ObjectValidators.DateTime) field(:emoji, ObjectValidators.Emoji, default: %{}) field(:sensitive, :boolean, default: false) @@ -40,10 +46,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioValidator do field(:replies_count, :integer, default: 0) field(:like_count, :integer, default: 0) field(:announcement_count, :integer, default: 0) - field(:inReplyTo, :string) + field(:inReplyTo, ObjectValidators.ObjectID) field(:url, ObjectValidators.Uri) - # short identifier for PleromaFE to group statuses by context - field(:context_id, :integer) field(:likes, {:array, :string}, default: []) field(:announcements, {:array, :string}, default: []) @@ -68,9 +72,18 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioValidator do defp fix_url(%{"url" => url} = data) when is_list(url) do attachment = - Enum.find(url, fn x -> is_map(x) and String.starts_with?(x["mimeType"], "audio/") end) + Enum.find(url, fn x -> + mime_type = x["mimeType"] || x["mediaType"] || "" - link_element = Enum.find(url, fn x -> is_map(x) and x["mimeType"] == "text/html" end) + is_map(x) and String.starts_with?(mime_type, ["video/", "audio/"]) + end) + + link_element = + Enum.find(url, fn x -> + mime_type = x["mimeType"] || x["mediaType"] || "" + + is_map(x) and mime_type == "text/html" + end) data |> Map.put("attachment", [attachment]) @@ -79,12 +92,26 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioValidator do defp fix_url(data), do: data + defp fix_content(%{"mediaType" => "text/markdown", "content" => content} = data) + when is_binary(content) do + content = + content + |> Earmark.as_html!(%Earmark.Options{renderer: EarmarkRenderer}) + |> Pleroma.HTML.filter_tags() + + Map.put(data, "content", content) + end + + defp fix_content(data), do: data + defp fix(data) do data |> CommonFixes.fix_defaults() |> CommonFixes.fix_attribution() + |> CommonFixes.fix_actor() |> Transmogrifier.fix_emoji() |> fix_url() + |> fix_content() end def changeset(struct, data) do @@ -97,7 +124,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioValidator do def validate_data(data_cng) do data_cng - |> validate_inclusion(:type, ["Audio"]) + |> validate_inclusion(:type, ["Audio", "Video"]) |> validate_required([:id, :actor, :attributedTo, :type, :context, :attachment]) |> CommonValidations.validate_any_presence([:cc, :to]) |> CommonValidations.validate_fields_match([:actor, :attributedTo]) diff --git a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex index 720213d73..b3638cfc7 100644 --- a/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex +++ b/lib/pleroma/web/activity_pub/object_validators/common_fixes.ex @@ -3,6 +3,7 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes do + alias Pleroma.Object.Containment alias Pleroma.Web.ActivityPub.Utils # based on Pleroma.Web.ActivityPub.Utils.lazy_put_objects_defaults @@ -19,4 +20,12 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes do data |> Map.put_new("actor", data["attributedTo"]) end + + def fix_actor(data) do + actor = Containment.get_actor(data) + + data + |> Map.put("actor", actor) + |> Map.put("attributedTo", actor) + end end diff --git a/lib/pleroma/web/activity_pub/object_validators/create_generic_validator.ex b/lib/pleroma/web/activity_pub/object_validators/create_generic_validator.ex index b3dbeea57..422ee07be 100644 --- a/lib/pleroma/web/activity_pub/object_validators/create_generic_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/create_generic_validator.ex @@ -10,9 +10,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CreateGenericValidator do alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Object + alias Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes + alias Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations import Ecto.Changeset - import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations @primary_key false @@ -75,14 +76,15 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CreateGenericValidator do data |> fix_context(meta) |> fix_addressing(meta) + |> CommonFixes.fix_actor() end def validate_data(cng, meta \\ []) do cng |> validate_required([:actor, :type, :object]) |> validate_inclusion(:type, ["Create"]) - |> validate_actor_presence() - |> validate_any_presence([:to, :cc]) + |> CommonValidations.validate_actor_presence() + |> CommonValidations.validate_any_presence([:to, :cc]) |> validate_actors_match(meta) |> validate_context_match(meta) |> validate_object_nonexistence() diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 46a8be767..b5c720c7a 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -336,7 +336,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do end def handle_object_creation(%{"type" => objtype} = object, meta) - when objtype in ~w[Audio Question Event] do + when objtype in ~w[Audio Video Question Event] do with {:ok, object, meta} <- Pipeline.common_pipeline(object, meta) do {:ok, object, meta} end diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index ec3b24206..e14936c10 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -7,7 +7,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do A module to handle coding from internal to wire ActivityPub and back. """ alias Pleroma.Activity - alias Pleroma.EarmarkRenderer alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Maps alias Pleroma.Object @@ -45,7 +44,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do |> fix_addressing |> fix_summary |> fix_type(options) - |> fix_content end def fix_summary(%{"summary" => nil} = object) do @@ -274,24 +272,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do Map.put(object, "url", url["href"]) end - def fix_url(%{"type" => "Video", "url" => url} = object) when is_list(url) do - attachment = - Enum.find(url, fn x -> - media_type = x["mediaType"] || x["mimeType"] || "" - - is_map(x) and String.starts_with?(media_type, "video/") - end) - - link_element = - Enum.find(url, fn x -> is_map(x) and (x["mediaType"] || x["mimeType"]) == "text/html" end) - - object - |> Map.put("attachment", [attachment]) - |> Map.put("url", link_element["href"]) - end - - def fix_url(%{"type" => object_type, "url" => url} = object) - when object_type != "Video" and is_list(url) do + def fix_url(%{"url" => url} = object) when is_list(url) do first_element = Enum.at(url, 0) url_string = @@ -371,18 +352,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do def fix_type(object, _), do: object - defp fix_content(%{"mediaType" => "text/markdown", "content" => content} = object) - when is_binary(content) do - html_content = - content - |> Earmark.as_html!(%Earmark.Options{renderer: EarmarkRenderer}) - |> Pleroma.HTML.filter_tags() - - Map.merge(object, %{"content" => html_content, "mediaType" => "text/html"}) - end - - defp fix_content(object), do: object - # Reduce the object list to find the reported user. defp get_reported(objects) do Enum.reduce_while(objects, nil, fn ap_id, _ -> @@ -455,7 +424,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do %{"type" => "Create", "object" => %{"type" => objtype} = object} = data, options ) - when objtype in ~w{Article Note Video Page} do + when objtype in ~w{Article Note Page} do actor = Containment.get_actor(data) with nil <- Activity.get_create_by_object_ap_id(object["id"]), @@ -549,7 +518,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do %{"type" => "Create", "object" => %{"type" => objtype}} = data, _options ) - when objtype in ~w{Question Answer ChatMessage Audio Event} do + when objtype in ~w{Question Answer ChatMessage Audio Video Event} do data = Map.put(data, "object", strip_internal_fields(data["object"])) with {:ok, %User{}} <- ObjectValidator.fetch_actor(data), diff --git a/test/fixtures/tesla_mock/framatube.org-video.json b/test/fixtures/tesla_mock/framatube.org-video.json index 3d53f0c97..1fa529886 100644 --- a/test/fixtures/tesla_mock/framatube.org-video.json +++ b/test/fixtures/tesla_mock/framatube.org-video.json @@ -1 +1 @@ -{"type":"Video","id":"https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206","name":"Déframasoftisons Internet [Framasoft]","duration":"PT3622S","uuid":"6050732a-8a7a-43d4-a6cd-809525a1d206","tag":[{"type":"Hashtag","name":"déframasoftisons"},{"type":"Hashtag","name":"EPN23"},{"type":"Hashtag","name":"framaconf"},{"type":"Hashtag","name":"Framasoft"},{"type":"Hashtag","name":"pyg"}],"category":{"identifier":"15","name":"Science & Technology"},"views":122,"sensitive":false,"waitTranscoding":false,"state":1,"commentsEnabled":true,"downloadEnabled":true,"published":"2020-05-24T18:34:31.569Z","originallyPublishedAt":"2019-11-30T23:00:00.000Z","updated":"2020-07-05T09:01:01.720Z","mediaType":"text/markdown","content":"Après avoir mené avec un certain succès la campagne « Dégooglisons Internet » en 2014, l’association Framasoft annonce fin 2019 arrêter progressivement un certain nombre de ses services alternatifs aux GAFAM. Pourquoi ?\r\n\r\nTranscription par @april...","support":null,"subtitleLanguage":[],"icon":{"type":"Image","url":"https://framatube.org/static/thumbnails/6050732a-8a7a-43d4-a6cd-809525a1d206.jpg","mediaType":"image/jpeg","width":223,"height":122},"url":[{"type":"Link","mediaType":"text/html","href":"https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206"},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4","height":1080,"size":1157359410,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309939","height":1080,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-1080.torrent","height":1080},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-1080.torrent&xt=urn:btih:381c9429900552e23a4eb506318f1fa01e4d63a8&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fwebseed%2F6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4&ws=https%3A%2F%2Fpeertube.iselfhost.com%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4&ws=https%3A%2F%2Ftube.privacytools.io%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4&ws=https%3A%2F%2Fpeertube.live%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4","height":1080},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-480.mp4","height":480,"size":250095131,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309941","height":480,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-480.torrent","height":480},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-480.torrent&xt=urn:btih:a181dcbb5368ab5c31cc9ff07634becb72c344ee&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fwebseed%2F6050732a-8a7a-43d4-a6cd-809525a1d206-480.mp4&ws=https%3A%2F%2Fpeertube.iselfhost.com%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-480.mp4&ws=https%3A%2F%2Ftube.privacytools.io%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-480.mp4&ws=https%3A%2F%2Fpeertube.live%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-480.mp4","height":480},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-360.mp4","height":360,"size":171357733,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309942","height":360,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-360.torrent","height":360},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-360.torrent&xt=urn:btih:aedfa9479ea04a175eee0b0bd0bda64076308746&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fwebseed%2F6050732a-8a7a-43d4-a6cd-809525a1d206-360.mp4&ws=https%3A%2F%2Fpeertube.iselfhost.com%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-360.mp4&ws=https%3A%2F%2Ftube.privacytools.io%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-360.mp4&ws=https%3A%2F%2Fpeertube.live%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-360.mp4","height":360},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-720.mp4","height":720,"size":497100839,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309943","height":720,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-720.torrent","height":720},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-720.torrent&xt=urn:btih:71971668f82a3b24ac71bc3a982848dd8dc5a5f5&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fwebseed%2F6050732a-8a7a-43d4-a6cd-809525a1d206-720.mp4&ws=https%3A%2F%2Fpeertube.iselfhost.com%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-720.mp4&ws=https%3A%2F%2Ftube.privacytools.io%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-720.mp4&ws=https%3A%2F%2Fpeertube.live%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-720.mp4","height":720},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-240.mp4","height":240,"size":113038439,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309944","height":240,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-240.torrent","height":240},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-240.torrent&xt=urn:btih:c42aa6c95efb28d9f114ebd98537f7b00fa72246&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fwebseed%2F6050732a-8a7a-43d4-a6cd-809525a1d206-240.mp4&ws=https%3A%2F%2Fpeertube.iselfhost.com%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-240.mp4&ws=https%3A%2F%2Ftube.privacytools.io%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-240.mp4","height":240},{"type":"Link","mediaType":"application/x-mpegURL","href":"https://framatube.org/static/streaming-playlists/hls/6050732a-8a7a-43d4-a6cd-809525a1d206/master.m3u8","tag":[{"type":"Infohash","name":"f7428214539626e062f300f2ca4cf9154575144e"},{"type":"Infohash","name":"46e236dffb1ea6b9123a5396cbe88e97dd94cc6c"},{"type":"Infohash","name":"11f1045830b5d786c788f2594d19f128764e7d87"},{"type":"Infohash","name":"4327ad3e0d84de100130a27e9ab6fe40c4284f0e"},{"type":"Infohash","name":"41e2eee8e7b23a63c23a77c40a46de11492a4831"},{"type":"Link","name":"sha256","mediaType":"application/json","href":"https://framatube.org/static/streaming-playlists/hls/6050732a-8a7a-43d4-a6cd-809525a1d206/segments-sha256.json"},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/streaming-playlists/hls/6050732a-8a7a-43d4-a6cd-809525a1d206/6050732a-8a7a-43d4-a6cd-809525a1d206-1080-fragmented.mp4","height":1080,"size":1156777472,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309940","height":1080,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-1080-hls.torrent","height":1080},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-1080-hls.torrent&xt=urn:btih:0204d780ebfab0d5d9d3476a038e812ad792deeb&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fstreaming-playlists%2Fhls%2F6050732a-8a7a-43d4-a6cd-809525a1d206%2F6050732a-8a7a-43d4-a6cd-809525a1d206-1080-fragmented.mp4","height":1080},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/streaming-playlists/hls/6050732a-8a7a-43d4-a6cd-809525a1d206/6050732a-8a7a-43d4-a6cd-809525a1d206-480-fragmented.mp4","height":480,"size":249562889,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309945","height":480,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-480-hls.torrent","height":480},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-480-hls.torrent&xt=urn:btih:5d14f38ded29de629668fe1cfc61a75f4cce2628&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fstreaming-playlists%2Fhls%2F6050732a-8a7a-43d4-a6cd-809525a1d206%2F6050732a-8a7a-43d4-a6cd-809525a1d206-480-fragmented.mp4","height":480},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/streaming-playlists/hls/6050732a-8a7a-43d4-a6cd-809525a1d206/6050732a-8a7a-43d4-a6cd-809525a1d206-360-fragmented.mp4","height":360,"size":170836415,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309946","height":360,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-360-hls.torrent","height":360},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-360-hls.torrent&xt=urn:btih:30125488789080ad405ebcee6c214945f31b8f30&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fstreaming-playlists%2Fhls%2F6050732a-8a7a-43d4-a6cd-809525a1d206%2F6050732a-8a7a-43d4-a6cd-809525a1d206-360-fragmented.mp4","height":360},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/streaming-playlists/hls/6050732a-8a7a-43d4-a6cd-809525a1d206/6050732a-8a7a-43d4-a6cd-809525a1d206-720-fragmented.mp4","height":720,"size":496533741,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309947","height":720,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-720-hls.torrent","height":720},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-720-hls.torrent&xt=urn:btih:8ed1e8bccde709901c26e315fc8f53bfd26d1ba6&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fstreaming-playlists%2Fhls%2F6050732a-8a7a-43d4-a6cd-809525a1d206%2F6050732a-8a7a-43d4-a6cd-809525a1d206-720-fragmented.mp4","height":720},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/streaming-playlists/hls/6050732a-8a7a-43d4-a6cd-809525a1d206/6050732a-8a7a-43d4-a6cd-809525a1d206-240-fragmented.mp4","height":240,"size":112529249,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309948","height":240,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-240-hls.torrent","height":240},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-240-hls.torrent&xt=urn:btih:8b452bf4e70b9078d4e74ca8b5523cc9dc70d10a&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fstreaming-playlists%2Fhls%2F6050732a-8a7a-43d4-a6cd-809525a1d206%2F6050732a-8a7a-43d4-a6cd-809525a1d206-240-fragmented.mp4","height":240}]}],"likes":"https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206/likes","dislikes":"https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206/dislikes","shares":"https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206/announces","comments":"https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206/comments","attributedTo":[{"type":"Person","id":"https://framatube.org/accounts/framasoft"},{"type":"Group","id":"https://framatube.org/video-channels/bf54d359-cfad-4935-9d45-9d6be93f63e8"}],"to":["https://www.w3.org/ns/activitystreams#Public"],"cc":["https://framatube.org/accounts/framasoft/followers"],"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"RsaSignature2017":"https://w3id.org/security#RsaSignature2017"},{"pt":"https://joinpeertube.org/ns#","sc":"http://schema.org#","Hashtag":"as:Hashtag","uuid":"sc:identifier","category":"sc:category","licence":"sc:license","subtitleLanguage":"sc:subtitleLanguage","sensitive":"as:sensitive","language":"sc:inLanguage","Infohash":"pt:Infohash","Playlist":"pt:Playlist","PlaylistElement":"pt:PlaylistElement","originallyPublishedAt":"sc:datePublished","views":{"@type":"sc:Number","@id":"pt:views"},"state":{"@type":"sc:Number","@id":"pt:state"},"size":{"@type":"sc:Number","@id":"pt:size"},"fps":{"@type":"sc:Number","@id":"pt:fps"},"startTimestamp":{"@type":"sc:Number","@id":"pt:startTimestamp"},"stopTimestamp":{"@type":"sc:Number","@id":"pt:stopTimestamp"},"position":{"@type":"sc:Number","@id":"pt:position"},"commentsEnabled":{"@type":"sc:Boolean","@id":"pt:commentsEnabled"},"downloadEnabled":{"@type":"sc:Boolean","@id":"pt:downloadEnabled"},"waitTranscoding":{"@type":"sc:Boolean","@id":"pt:waitTranscoding"},"support":{"@type":"sc:Text","@id":"pt:support"},"likes":{"@id":"as:likes","@type":"@id"},"dislikes":{"@id":"as:dislikes","@type":"@id"},"playlists":{"@id":"pt:playlists","@type":"@id"},"shares":{"@id":"as:shares","@type":"@id"},"comments":{"@id":"as:comments","@type":"@id"}}]} \ No newline at end of file +{"type":"Create","id":"https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206/activity","actor":"https://framatube.org/accounts/framasoft","object":{"type":"Video","id":"https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206","name":"Déframasoftisons Internet [Framasoft]","duration":"PT3622S","uuid":"6050732a-8a7a-43d4-a6cd-809525a1d206","tag":[{"type":"Hashtag","name":"déframasoftisons"},{"type":"Hashtag","name":"EPN23"},{"type":"Hashtag","name":"framaconf"},{"type":"Hashtag","name":"Framasoft"},{"type":"Hashtag","name":"pyg"}],"category":{"identifier":"15","name":"Science & Technology"},"views":154,"sensitive":false,"waitTranscoding":false,"state":1,"commentsEnabled":true,"downloadEnabled":true,"published":"2020-05-24T18:34:31.569Z","originallyPublishedAt":"2019-11-30T23:00:00.000Z","updated":"2020-08-17T11:01:02.994Z","mediaType":"text/markdown","content":"Après avoir mené avec un certain succès la campagne « Dégooglisons Internet » en 2014, l’association Framasoft annonce fin 2019 arrêter progressivement un certain nombre de ses services alternatifs aux GAFAM. Pourquoi ?\r\n\r\nTranscription par @aprilorg ici : https://www.april.org/deframasoftisons-internet-pierre-yves-gosset-framasoft","support":null,"subtitleLanguage":[],"icon":[{"type":"Image","url":"https://framatube.org/static/thumbnails/6050732a-8a7a-43d4-a6cd-809525a1d206.jpg","mediaType":"image/jpeg","width":223,"height":122},{"type":"Image","url":"https://framatube.org/static/previews/6050732a-8a7a-43d4-a6cd-809525a1d206.jpg","mediaType":"image/jpeg","width":850,"height":480}],"url":[{"type":"Link","mediaType":"text/html","href":"https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206"},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4","height":1080,"size":1157359410,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309939","height":1080,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-1080.torrent","height":1080},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-1080.torrent&xt=urn:btih:381c9429900552e23a4eb506318f1fa01e4d63a8&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fwebseed%2F6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4&ws=https%3A%2F%2Fpeertube.iselfhost.com%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4&ws=https%3A%2F%2Ftube.privacytools.io%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4&ws=https%3A%2F%2Fpeertube.live%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4","height":1080},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-720.mp4","height":720,"size":497100839,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309943","height":720,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-720.torrent","height":720},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-720.torrent&xt=urn:btih:71971668f82a3b24ac71bc3a982848dd8dc5a5f5&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fwebseed%2F6050732a-8a7a-43d4-a6cd-809525a1d206-720.mp4&ws=https%3A%2F%2Ftube.privacytools.io%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-720.mp4&ws=https%3A%2F%2Fpeertube.iselfhost.com%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-720.mp4&ws=https%3A%2F%2Fpeertube.live%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-720.mp4","height":720},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-480.mp4","height":480,"size":250095131,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309941","height":480,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-480.torrent","height":480},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-480.torrent&xt=urn:btih:a181dcbb5368ab5c31cc9ff07634becb72c344ee&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fwebseed%2F6050732a-8a7a-43d4-a6cd-809525a1d206-480.mp4&ws=https%3A%2F%2Fpeertube.iselfhost.com%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-480.mp4&ws=https%3A%2F%2Ftube.privacytools.io%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-480.mp4&ws=https%3A%2F%2Fpeertube.live%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-480.mp4","height":480},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-360.mp4","height":360,"size":171357733,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309942","height":360,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-360.torrent","height":360},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-360.torrent&xt=urn:btih:aedfa9479ea04a175eee0b0bd0bda64076308746&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fwebseed%2F6050732a-8a7a-43d4-a6cd-809525a1d206-360.mp4&ws=https%3A%2F%2Fpeertube.iselfhost.com%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-360.mp4&ws=https%3A%2F%2Ftube.privacytools.io%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-360.mp4&ws=https%3A%2F%2Fpeertube.live%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-360.mp4","height":360},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-240.mp4","height":240,"size":113038439,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309944","height":240,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-240.torrent","height":240},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-240.torrent&xt=urn:btih:c42aa6c95efb28d9f114ebd98537f7b00fa72246&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fwebseed%2F6050732a-8a7a-43d4-a6cd-809525a1d206-240.mp4&ws=https%3A%2F%2Fpeertube.iselfhost.com%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-240.mp4&ws=https%3A%2F%2Ftube.privacytools.io%2Fstatic%2Fredundancy%2F6050732a-8a7a-43d4-a6cd-809525a1d206-240.mp4","height":240},{"type":"Link","mediaType":"application/x-mpegURL","href":"https://framatube.org/static/streaming-playlists/hls/6050732a-8a7a-43d4-a6cd-809525a1d206/master.m3u8","tag":[{"type":"Infohash","name":"f7428214539626e062f300f2ca4cf9154575144e"},{"type":"Infohash","name":"46e236dffb1ea6b9123a5396cbe88e97dd94cc6c"},{"type":"Infohash","name":"11f1045830b5d786c788f2594d19f128764e7d87"},{"type":"Infohash","name":"4327ad3e0d84de100130a27e9ab6fe40c4284f0e"},{"type":"Infohash","name":"41e2eee8e7b23a63c23a77c40a46de11492a4831"},{"type":"Link","name":"sha256","mediaType":"application/json","href":"https://framatube.org/static/streaming-playlists/hls/6050732a-8a7a-43d4-a6cd-809525a1d206/segments-sha256.json"},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/streaming-playlists/hls/6050732a-8a7a-43d4-a6cd-809525a1d206/6050732a-8a7a-43d4-a6cd-809525a1d206-1080-fragmented.mp4","height":1080,"size":1156777472,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309940","height":1080,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-1080-hls.torrent","height":1080},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-1080-hls.torrent&xt=urn:btih:0204d780ebfab0d5d9d3476a038e812ad792deeb&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fstreaming-playlists%2Fhls%2F6050732a-8a7a-43d4-a6cd-809525a1d206%2F6050732a-8a7a-43d4-a6cd-809525a1d206-1080-fragmented.mp4","height":1080},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/streaming-playlists/hls/6050732a-8a7a-43d4-a6cd-809525a1d206/6050732a-8a7a-43d4-a6cd-809525a1d206-720-fragmented.mp4","height":720,"size":496533741,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309947","height":720,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-720-hls.torrent","height":720},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-720-hls.torrent&xt=urn:btih:8ed1e8bccde709901c26e315fc8f53bfd26d1ba6&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fstreaming-playlists%2Fhls%2F6050732a-8a7a-43d4-a6cd-809525a1d206%2F6050732a-8a7a-43d4-a6cd-809525a1d206-720-fragmented.mp4","height":720},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/streaming-playlists/hls/6050732a-8a7a-43d4-a6cd-809525a1d206/6050732a-8a7a-43d4-a6cd-809525a1d206-480-fragmented.mp4","height":480,"size":249562889,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309945","height":480,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-480-hls.torrent","height":480},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-480-hls.torrent&xt=urn:btih:5d14f38ded29de629668fe1cfc61a75f4cce2628&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fstreaming-playlists%2Fhls%2F6050732a-8a7a-43d4-a6cd-809525a1d206%2F6050732a-8a7a-43d4-a6cd-809525a1d206-480-fragmented.mp4","height":480},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/streaming-playlists/hls/6050732a-8a7a-43d4-a6cd-809525a1d206/6050732a-8a7a-43d4-a6cd-809525a1d206-360-fragmented.mp4","height":360,"size":170836415,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309946","height":360,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-360-hls.torrent","height":360},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-360-hls.torrent&xt=urn:btih:30125488789080ad405ebcee6c214945f31b8f30&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fstreaming-playlists%2Fhls%2F6050732a-8a7a-43d4-a6cd-809525a1d206%2F6050732a-8a7a-43d4-a6cd-809525a1d206-360-fragmented.mp4","height":360},{"type":"Link","mediaType":"video/mp4","href":"https://framatube.org/static/streaming-playlists/hls/6050732a-8a7a-43d4-a6cd-809525a1d206/6050732a-8a7a-43d4-a6cd-809525a1d206-240-fragmented.mp4","height":240,"size":112529249,"fps":25},{"type":"Link","rel":["metadata","video/mp4"],"mediaType":"application/json","href":"https://framatube.org/api/v1/videos/6050732a-8a7a-43d4-a6cd-809525a1d206/metadata/1309948","height":240,"fps":25},{"type":"Link","mediaType":"application/x-bittorrent","href":"https://framatube.org/static/torrents/6050732a-8a7a-43d4-a6cd-809525a1d206-240-hls.torrent","height":240},{"type":"Link","mediaType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fframatube.org%2Fstatic%2Ftorrents%2F6050732a-8a7a-43d4-a6cd-809525a1d206-240-hls.torrent&xt=urn:btih:8b452bf4e70b9078d4e74ca8b5523cc9dc70d10a&dn=D%C3%A9framasoftisons+Internet+%5BFramasoft%5D&tr=wss%3A%2F%2Fframatube.org%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fframatube.org%2Ftracker%2Fannounce&ws=https%3A%2F%2Fframatube.org%2Fstatic%2Fstreaming-playlists%2Fhls%2F6050732a-8a7a-43d4-a6cd-809525a1d206%2F6050732a-8a7a-43d4-a6cd-809525a1d206-240-fragmented.mp4","height":240}]}],"likes":"https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206/likes","dislikes":"https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206/dislikes","shares":"https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206/announces","comments":"https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206/comments","attributedTo":[{"type":"Person","id":"https://framatube.org/accounts/framasoft"},{"type":"Group","id":"https://framatube.org/video-channels/bf54d359-cfad-4935-9d45-9d6be93f63e8"}],"to":["https://www.w3.org/ns/activitystreams#Public"],"cc":["https://framatube.org/accounts/framasoft/followers"]},"to":["https://www.w3.org/ns/activitystreams#Public"],"cc":["https://framatube.org/accounts/framasoft/followers"],"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"RsaSignature2017":"https://w3id.org/security#RsaSignature2017"},{"pt":"https://joinpeertube.org/ns#","sc":"http://schema.org#","Hashtag":"as:Hashtag","uuid":"sc:identifier","category":"sc:category","licence":"sc:license","subtitleLanguage":"sc:subtitleLanguage","sensitive":"as:sensitive","language":"sc:inLanguage","Infohash":"pt:Infohash","Playlist":"pt:Playlist","PlaylistElement":"pt:PlaylistElement","originallyPublishedAt":"sc:datePublished","views":{"@type":"sc:Number","@id":"pt:views"},"state":{"@type":"sc:Number","@id":"pt:state"},"size":{"@type":"sc:Number","@id":"pt:size"},"fps":{"@type":"sc:Number","@id":"pt:fps"},"startTimestamp":{"@type":"sc:Number","@id":"pt:startTimestamp"},"stopTimestamp":{"@type":"sc:Number","@id":"pt:stopTimestamp"},"position":{"@type":"sc:Number","@id":"pt:position"},"commentsEnabled":{"@type":"sc:Boolean","@id":"pt:commentsEnabled"},"downloadEnabled":{"@type":"sc:Boolean","@id":"pt:downloadEnabled"},"waitTranscoding":{"@type":"sc:Boolean","@id":"pt:waitTranscoding"},"support":{"@type":"sc:Text","@id":"pt:support"},"likes":{"@id":"as:likes","@type":"@id"},"dislikes":{"@id":"as:dislikes","@type":"@id"},"playlists":{"@id":"pt:playlists","@type":"@id"},"shares":{"@id":"as:shares","@type":"@id"},"comments":{"@id":"as:comments","@type":"@id"}}]} \ No newline at end of file diff --git a/test/web/activity_pub/transmogrifier/video_handling_test.exs b/test/web/activity_pub/transmogrifier/video_handling_test.exs new file mode 100644 index 000000000..69c953a2e --- /dev/null +++ b/test/web/activity_pub/transmogrifier/video_handling_test.exs @@ -0,0 +1,93 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.Transmogrifier.VideoHandlingTest do + use Oban.Testing, repo: Pleroma.Repo + use Pleroma.DataCase + + alias Pleroma.Activity + alias Pleroma.Object + alias Pleroma.Object.Fetcher + alias Pleroma.Web.ActivityPub.Transmogrifier + + setup_all do + Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) + :ok + end + + test "skip converting the content when it is nil" do + data = + File.read!("test/fixtures/tesla_mock/framatube.org-video.json") + |> Jason.decode!() + |> Kernel.put_in(["object", "content"], nil) + + {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data) + + assert object = Object.normalize(activity, false) + + assert object.data["content"] == nil + end + + test "it converts content of object to html" do + data = File.read!("test/fixtures/tesla_mock/framatube.org-video.json") |> Jason.decode!() + + {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data) + + assert object = Object.normalize(activity, false) + + assert object.data["content"] == + "

Après avoir mené avec un certain succès la campagne « Dégooglisons Internet » en 2014, l’association Framasoft annonce fin 2019 arrêter progressivement un certain nombre de ses services alternatifs aux GAFAM. Pourquoi ?

Transcription par @aprilorg ici : https://www.april.org/deframasoftisons-internet-pierre-yves-gosset-framasoft

" + end + + test "it remaps video URLs as attachments if necessary" do + {:ok, object} = + Fetcher.fetch_object_from_id( + "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3" + ) + + assert object.data["url"] == + "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3" + + assert object.data["attachment"] == [ + %{ + "type" => "Link", + "mediaType" => "video/mp4", + "name" => nil, + "url" => [ + %{ + "href" => + "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4", + "mediaType" => "video/mp4", + "type" => "Link" + } + ] + } + ] + + data = File.read!("test/fixtures/tesla_mock/framatube.org-video.json") |> Jason.decode!() + + {:ok, %Activity{local: false} = activity} = Transmogrifier.handle_incoming(data) + + assert object = Object.normalize(activity, false) + + assert object.data["attachment"] == [ + %{ + "type" => "Link", + "mediaType" => "video/mp4", + "name" => nil, + "url" => [ + %{ + "href" => + "https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4", + "mediaType" => "video/mp4", + "type" => "Link" + } + ] + } + ] + + assert object.data["url"] == + "https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206" + end +end diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index cc55a7be7..0a3291d49 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -8,7 +8,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do alias Pleroma.Activity alias Pleroma.Object - alias Pleroma.Object.Fetcher alias Pleroma.Tests.ObanHelpers alias Pleroma.User alias Pleroma.Web.ActivityPub.Transmogrifier @@ -355,83 +354,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do refute User.following?(User.get_cached_by_ap_id(data["actor"]), user) end - test "skip converting the content when it is nil" do - object_id = "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe" - - {:ok, object} = Fetcher.fetch_and_contain_remote_object_from_id(object_id) - - result = - Pleroma.Web.ActivityPub.Transmogrifier.fix_object(Map.merge(object, %{"content" => nil})) - - assert result["content"] == nil - end - - test "it converts content of object to html" do - object_id = "https://peertube.social/videos/watch/278d2b7c-0f38-4aaa-afe6-9ecc0c4a34fe" - - {:ok, %{"content" => content_markdown}} = - Fetcher.fetch_and_contain_remote_object_from_id(object_id) - - {:ok, %Pleroma.Object{data: %{"content" => content}} = object} = - Fetcher.fetch_object_from_id(object_id) - - assert content_markdown == - "Support this and our other Michigan!/usr/group videos and meetings. Learn more at http://mug.org/membership\n\nTwenty Years in Jail: FreeBSD's Jails, Then and Now\n\nJails started as a limited virtualization system, but over the last two years they've..." - - assert content == - "

Support this and our other Michigan!/usr/group videos and meetings. Learn more at http://mug.org/membership

Twenty Years in Jail: FreeBSD’s Jails, Then and Now

Jails started as a limited virtualization system, but over the last two years they’ve…

" - - assert object.data["mediaType"] == "text/html" - end - - test "it remaps video URLs as attachments if necessary" do - {:ok, object} = - Fetcher.fetch_object_from_id( - "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3" - ) - - assert object.data["url"] == - "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3" - - assert object.data["attachment"] == [ - %{ - "type" => "Link", - "mediaType" => "video/mp4", - "url" => [ - %{ - "href" => - "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4", - "mediaType" => "video/mp4", - "type" => "Link" - } - ] - } - ] - - {:ok, object} = - Fetcher.fetch_object_from_id( - "https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206" - ) - - assert object.data["attachment"] == [ - %{ - "type" => "Link", - "mediaType" => "video/mp4", - "url" => [ - %{ - "href" => - "https://framatube.org/static/webseed/6050732a-8a7a-43d4-a6cd-809525a1d206-1080.mp4", - "mediaType" => "video/mp4", - "type" => "Link" - } - ] - } - ] - - assert object.data["url"] == - "https://framatube.org/videos/watch/6050732a-8a7a-43d4-a6cd-809525a1d206" - end - test "it accepts Flag activities" do user = insert(:user) other_user = insert(:user) @@ -1133,75 +1055,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do } end - test "fixes data for video object" do - object = %{ - "type" => "Video", - "url" => [ - %{ - "type" => "Link", - "mimeType" => "video/mp4", - "href" => "https://peede8d-46fb-ad81-2d4c2d1630e3-480.mp4" - }, - %{ - "type" => "Link", - "mimeType" => "video/mp4", - "href" => "https://peertube46fb-ad81-2d4c2d1630e3-240.mp4" - }, - %{ - "type" => "Link", - "mimeType" => "text/html", - "href" => "https://peertube.-2d4c2d1630e3" - }, - %{ - "type" => "Link", - "mimeType" => "text/html", - "href" => "https://peertube.-2d4c2d16377-42" - } - ] - } - - assert Transmogrifier.fix_url(object) == %{ - "attachment" => [ - %{ - "href" => "https://peede8d-46fb-ad81-2d4c2d1630e3-480.mp4", - "mimeType" => "video/mp4", - "type" => "Link" - } - ], - "type" => "Video", - "url" => "https://peertube.-2d4c2d1630e3" - } - end - - test "fixes url for not Video object" do - object = %{ - "type" => "Text", - "url" => [ - %{ - "type" => "Link", - "mimeType" => "text/html", - "href" => "https://peertube.-2d4c2d1630e3" - }, - %{ - "type" => "Link", - "mimeType" => "text/html", - "href" => "https://peertube.-2d4c2d16377-42" - } - ] - } - - assert Transmogrifier.fix_url(object) == %{ - "type" => "Text", - "url" => "https://peertube.-2d4c2d1630e3" - } - - assert Transmogrifier.fix_url(%{"type" => "Text", "url" => []}) == %{ - "type" => "Text", - "url" => "" - } - end - - test "retunrs not modified object" do + test "returns non-modified object" do assert Transmogrifier.fix_url(%{"type" => "Text"}) == %{"type" => "Text"} end end From 2132b24a9df8116e12abc8c458cff4c3850aeda0 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Thu, 20 Aug 2020 04:27:59 +0200 Subject: [PATCH 093/182] object_validators: likes & announcements as [ObjectID] --- .../activity_pub/object_validators/audio_video_validator.ex | 4 ++-- .../web/activity_pub/object_validators/note_validator.ex | 4 ++-- .../web/activity_pub/object_validators/question_validator.ex | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex b/lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex index a6119e627..16973e5db 100644 --- a/lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/audio_video_validator.ex @@ -49,8 +49,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AudioVideoValidator do field(:inReplyTo, ObjectValidators.ObjectID) field(:url, ObjectValidators.Uri) - field(:likes, {:array, :string}, default: []) - field(:announcements, {:array, :string}, default: []) + field(:likes, {:array, ObjectValidators.ObjectID}, default: []) + field(:announcements, {:array, ObjectValidators.ObjectID}, default: []) end def cast_and_apply(data) do diff --git a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex b/lib/pleroma/web/activity_pub/object_validators/note_validator.ex index ab4469a59..e47cbaaea 100644 --- a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/note_validator.ex @@ -43,8 +43,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do field(:inReplyTo, ObjectValidators.ObjectID) field(:url, ObjectValidators.Uri) - field(:likes, {:array, :string}, default: []) - field(:announcements, {:array, :string}, default: []) + field(:likes, {:array, ObjectValidators.ObjectID}, default: []) + field(:announcements, {:array, ObjectValidators.ObjectID}, default: []) end def cast_and_validate(data) do diff --git a/lib/pleroma/web/activity_pub/object_validators/question_validator.ex b/lib/pleroma/web/activity_pub/object_validators/question_validator.ex index 934d3c1ea..9310485dc 100644 --- a/lib/pleroma/web/activity_pub/object_validators/question_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/question_validator.ex @@ -47,8 +47,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.QuestionValidator do # short identifier for PleromaFE to group statuses by context field(:context_id, :integer) - field(:likes, {:array, :string}, default: []) - field(:announcements, {:array, :string}, default: []) + field(:likes, {:array, ObjectValidators.ObjectID}, default: []) + field(:announcements, {:array, ObjectValidators.ObjectID}, default: []) field(:closed, ObjectValidators.DateTime) field(:voters, {:array, ObjectValidators.ObjectID}, default: []) From 1b3d5956b1be7faac4e1230d788307650acce991 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Thu, 20 Aug 2020 20:03:07 +0200 Subject: [PATCH 094/182] Pipeline Ingestion: Article --- lib/pleroma/web/activity_pub/activity_pub.ex | 2 +- .../web/activity_pub/object_validator.ex | 17 ++++- ...validator.ex => article_note_validator.ex} | 55 +++++++++++--- lib/pleroma/web/activity_pub/side_effects.ex | 2 +- .../web/activity_pub/transmogrifier.ex | 4 +- .../wedistribute-create-article.json | 1 + ...st.exs => article_note_validator_test.exs} | 6 +- .../transmogrifier/article_handling_test.exs | 75 +++++++++++++++++++ test/web/activity_pub/transmogrifier_test.exs | 9 --- 9 files changed, 143 insertions(+), 28 deletions(-) rename lib/pleroma/web/activity_pub/object_validators/{note_validator.ex => article_note_validator.ex} (59%) create mode 100644 test/fixtures/tesla_mock/wedistribute-create-article.json rename test/web/activity_pub/object_validators/{note_validator_test.exs => article_note_validator_test.exs} (76%) create mode 100644 test/web/activity_pub/transmogrifier/article_handling_test.exs diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index bceec8bd1..3ab045737 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -84,7 +84,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp increase_replies_count_if_reply(_create_data), do: :noop - @object_types ~w[ChatMessage Question Answer Audio Video Event] + @object_types ~w[ChatMessage Question Answer Audio Video Event Article] @spec persist(map(), keyword()) :: {:ok, Activity.t() | Object.t()} def persist(%{"type" => type} = object, meta) when type in @object_types do with {:ok, object} <- Object.create(object) do diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 081f96389..bd0a2a8dc 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -17,6 +17,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do alias Pleroma.Web.ActivityPub.ObjectValidators.AcceptRejectValidator alias Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator alias Pleroma.Web.ActivityPub.ObjectValidators.AnswerValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.ArticleNoteValidator alias Pleroma.Web.ActivityPub.ObjectValidators.AudioVideoValidator alias Pleroma.Web.ActivityPub.ObjectValidators.BlockValidator alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator @@ -160,6 +161,16 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do end end + def validate(%{"type" => "Article"} = object, meta) do + with {:ok, object} <- + object + |> ArticleNoteValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) do + object = stringify_keys(object) + {:ok, object, meta} + end + end + def validate(%{"type" => "Answer"} = object, meta) do with {:ok, object} <- object @@ -199,7 +210,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do %{"type" => "Create", "object" => %{"type" => objtype} = object} = create_activity, meta ) - when objtype in ~w[Question Answer Audio Video Event] do + when objtype in ~w[Question Answer Audio Video Event Article] do with {:ok, object_data} <- cast_and_apply(object), meta = Keyword.put(meta, :object_data, object_data |> stringify_keys), {:ok, create_activity} <- @@ -241,6 +252,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do EventValidator.cast_and_apply(object) end + def cast_and_apply(%{"type" => "Article"} = object) do + ArticleNoteValidator.cast_and_apply(object) + end + def cast_and_apply(o), do: {:error, {:validator_not_set, o}} # is_struct/1 isn't present in Elixir 1.8.x diff --git a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex b/lib/pleroma/web/activity_pub/object_validators/article_note_validator.ex similarity index 59% rename from lib/pleroma/web/activity_pub/object_validators/note_validator.ex rename to lib/pleroma/web/activity_pub/object_validators/article_note_validator.ex index e47cbaaea..5b7dad517 100644 --- a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/article_note_validator.ex @@ -2,15 +2,19 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do +defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNoteValidator do use Ecto.Schema alias Pleroma.EctoType.ActivityPub.ObjectValidators + alias Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.CommonFixes + alias Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations alias Pleroma.Web.ActivityPub.Transmogrifier import Ecto.Changeset @primary_key false + @derive Jason.Encoder embedded_schema do field(:id, ObjectValidators.ObjectID, primary_key: true) @@ -30,13 +34,14 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do # short identifier for PleromaFE to group statuses by context field(:context_id, :integer) + # TODO: Remove actor on objects field(:actor, ObjectValidators.ObjectID) + field(:attributedTo, ObjectValidators.ObjectID) field(:published, ObjectValidators.DateTime) field(:emoji, ObjectValidators.Emoji, default: %{}) field(:sensitive, :boolean, default: false) - # TODO: Write type - field(:attachment, {:array, :map}, default: []) + embeds_many(:attachment, AttachmentValidator) field(:replies_count, :integer, default: 0) field(:like_count, :integer, default: 0) field(:announcement_count, :integer, default: 0) @@ -47,27 +52,55 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do field(:announcements, {:array, ObjectValidators.ObjectID}, default: []) end + def cast_and_apply(data) do + data + |> cast_data + |> apply_action(:insert) + end + def cast_and_validate(data) do data |> cast_data() |> validate_data() end - defp fix(data) do - data - |> Transmogrifier.fix_emoji() - end - def cast_data(data) do data = fix(data) %__MODULE__{} - |> cast(data, __schema__(:fields)) + |> changeset(data) + end + + defp fix_url(%{"url" => url} = data) when is_map(url) do + Map.put(data, "url", url["href"]) + end + + defp fix_url(data), do: data + + defp fix(data) do + data + |> CommonFixes.fix_defaults() + |> CommonFixes.fix_attribution() + |> CommonFixes.fix_actor() + |> fix_url() + |> Transmogrifier.fix_emoji() + end + + def changeset(struct, data) do + data = fix(data) + + struct + |> cast(data, __schema__(:fields) -- [:attachment]) + |> cast_embed(:attachment) end def validate_data(data_cng) do data_cng - |> validate_inclusion(:type, ["Note"]) - |> validate_required([:id, :actor, :to, :cc, :type, :content, :context]) + |> validate_inclusion(:type, ["Article", "Note"]) + |> validate_required([:id, :actor, :attributedTo, :type, :context, :context_id]) + |> CommonValidations.validate_any_presence([:cc, :to]) + |> CommonValidations.validate_fields_match([:actor, :attributedTo]) + |> CommonValidations.validate_actor_presence() + |> CommonValidations.validate_host_match() end end diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index b5c720c7a..b9a83a544 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -336,7 +336,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do end def handle_object_creation(%{"type" => objtype} = object, meta) - when objtype in ~w[Audio Video Question Event] do + when objtype in ~w[Audio Video Question Event Article] do with {:ok, object, meta} <- Pipeline.common_pipeline(object, meta) do {:ok, object, meta} end diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index e14936c10..80f529704 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -424,7 +424,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do %{"type" => "Create", "object" => %{"type" => objtype} = object} = data, options ) - when objtype in ~w{Article Note Page} do + when objtype in ~w{Note Page} do actor = Containment.get_actor(data) with nil <- Activity.get_create_by_object_ap_id(object["id"]), @@ -518,7 +518,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do %{"type" => "Create", "object" => %{"type" => objtype}} = data, _options ) - when objtype in ~w{Question Answer ChatMessage Audio Video Event} do + when objtype in ~w{Question Answer ChatMessage Audio Video Event Article} do data = Map.put(data, "object", strip_internal_fields(data["object"])) with {:ok, %User{}} <- ObjectValidator.fetch_actor(data), diff --git a/test/fixtures/tesla_mock/wedistribute-create-article.json b/test/fixtures/tesla_mock/wedistribute-create-article.json new file mode 100644 index 000000000..3cfef8b99 --- /dev/null +++ b/test/fixtures/tesla_mock/wedistribute-create-article.json @@ -0,0 +1 @@ +{"@context":["https:\/\/www.w3.org\/ns\/activitystreams"],"type":"Create","actor":"https:\/\/wedistribute.org\/wp-json\/pterotype\/v1\/actor\/-blog","object":{"@context":["https:\/\/www.w3.org\/ns\/activitystreams"],"type":"Article","name":"The end is near: Mastodon plans to drop OStatus support","content":"\n

The days of OStatus are numbered. The venerable protocol has served as a glue between many different types of servers since the early days of the Fediverse, connecting StatusNet (now GNU Social) to Friendica, Hubzilla, Mastodon, and Pleroma.<\/p>\n\n\n\n

Now that many fediverse platforms support ActivityPub as a successor protocol, Mastodon appears to be drawing a line in the sand. In a Patreon update<\/a>, Eugen Rochko writes:<\/p>\n\n\n\n

...OStatus...has overstayed its welcome in the code...and now that most of the network uses ActivityPub, it's time for it to go. <\/p>Eugen Rochko, Mastodon creator<\/cite><\/blockquote>\n\n\n\n

The pull request<\/a> to remove Pubsubhubbub and Salmon, two of the main components of OStatus, has already been merged into Mastodon's master branch.<\/p>\n\n\n\n

Some projects will be left in the dark as a side effect of this. GNU Social and PostActiv, for example, both only communicate using OStatus. While some discussion<\/a> exists regarding adopting ActivityPub for GNU Social, and a plugin is in development<\/a>, it hasn't been formally adopted yet. We just hope that the Free Software Foundation's instance<\/a> gets updated in time!<\/p>\n","summary":"One of the largest platforms in the federated social web is dropping the protocol that it started with.","attributedTo":"https:\/\/wedistribute.org\/wp-json\/pterotype\/v1\/actor\/-blog","url":"https:\/\/wedistribute.org\/2019\/07\/mastodon-drops-ostatus\/","to":["https:\/\/www.w3.org\/ns\/activitystreams#Public","https:\/\/wedistribute.org\/wp-json\/pterotype\/v1\/actor\/-blog\/followers"],"id":"https:\/\/wedistribute.org\/wp-json\/pterotype\/v1\/object\/85810","likes":"https:\/\/wedistribute.org\/wp-json\/pterotype\/v1\/object\/85810\/likes","shares":"https:\/\/wedistribute.org\/wp-json\/pterotype\/v1\/object\/85810\/shares"},"to":["https:\/\/www.w3.org\/ns\/activitystreams#Public","https:\/\/wedistribute.org\/wp-json\/pterotype\/v1\/actor\/-blog\/followers"],"id":"https:\/\/wedistribute.org\/wp-json\/pterotype\/v1\/object\/85809"} \ No newline at end of file diff --git a/test/web/activity_pub/object_validators/note_validator_test.exs b/test/web/activity_pub/object_validators/article_note_validator_test.exs similarity index 76% rename from test/web/activity_pub/object_validators/note_validator_test.exs rename to test/web/activity_pub/object_validators/article_note_validator_test.exs index 30c481ffb..cc6dab872 100644 --- a/test/web/activity_pub/object_validators/note_validator_test.exs +++ b/test/web/activity_pub/object_validators/article_note_validator_test.exs @@ -2,10 +2,10 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidatorTest do +defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNoteValidatorTest do use Pleroma.DataCase - alias Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.ArticleNoteValidator alias Pleroma.Web.ActivityPub.Utils import Pleroma.Factory @@ -29,7 +29,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidatorTest do end test "a basic note validates", %{note: note} do - %{valid?: true} = NoteValidator.cast_and_validate(note) + %{valid?: true} = ArticleNoteValidator.cast_and_validate(note) end end end diff --git a/test/web/activity_pub/transmogrifier/article_handling_test.exs b/test/web/activity_pub/transmogrifier/article_handling_test.exs new file mode 100644 index 000000000..9b12a470a --- /dev/null +++ b/test/web/activity_pub/transmogrifier/article_handling_test.exs @@ -0,0 +1,75 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.Transmogrifier.ArticleHandlingTest do + use Oban.Testing, repo: Pleroma.Repo + use Pleroma.DataCase + + alias Pleroma.Activity + alias Pleroma.Object + alias Pleroma.Object.Fetcher + alias Pleroma.Web.ActivityPub.Transmogrifier + + test "Pterotype (Wordpress Plugin) Article" do + Tesla.Mock.mock(fn %{url: "https://wedistribute.org/wp-json/pterotype/v1/actor/-blog"} -> + %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/wedistribute-user.json")} + end) + + data = + File.read!("test/fixtures/tesla_mock/wedistribute-create-article.json") |> Jason.decode!() + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + object = Object.normalize(data["object"]) + + assert object.data["name"] == "The end is near: Mastodon plans to drop OStatus support" + + assert object.data["summary"] == + "One of the largest platforms in the federated social web is dropping the protocol that it started with." + + assert object.data["url"] == "https://wedistribute.org/2019/07/mastodon-drops-ostatus/" + end + + test "Plume Article" do + Tesla.Mock.mock(fn + %{url: "https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/"} -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/tesla_mock/baptiste.gelex.xyz-article.json") + } + + %{url: "https://baptiste.gelez.xyz/@/BaptisteGelez"} -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/tesla_mock/baptiste.gelex.xyz-user.json") + } + end) + + {:ok, object} = + Fetcher.fetch_object_from_id( + "https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/" + ) + + assert object.data["name"] == "This Month in Plume: June 2018" + + assert object.data["url"] == + "https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/" + end + + test "Prismo Article" do + Tesla.Mock.mock(fn %{url: "https://prismo.news/@mxb"} -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/tesla_mock/https___prismo.news__mxb.json") + } + end) + + data = File.read!("test/fixtures/prismo-url-map.json") |> Jason.decode!() + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + object = Object.normalize(data["object"]) + + assert object.data["url"] == "https://prismo.news/posts/83" + end +end diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 0a3291d49..561674f01 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -44,15 +44,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do assert "test" in object.data["tag"] end - test "it works for incoming notices with url not being a string (prismo)" do - data = File.read!("test/fixtures/prismo-url-map.json") |> Poison.decode!() - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - object = Object.normalize(data["object"]) - - assert object.data["url"] == "https://prismo.news/posts/83" - end - test "it cleans up incoming notices which are not really DMs" do user = insert(:user) other_user = insert(:user) From f18178cb096b9a00ed12ff0fe36893f118ec6649 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Sat, 22 Aug 2020 02:01:33 +0200 Subject: [PATCH 095/182] AttachmentValidator: directly embed url schema and pass it fix_media_type --- .../object_validators/attachment_validator.ex | 21 ++++++++++++++-- .../object_validators/url_object_validator.ex | 24 ------------------- 2 files changed, 19 insertions(+), 26 deletions(-) delete mode 100644 lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex diff --git a/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex index c8b148280..df102a134 100644 --- a/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex @@ -5,6 +5,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator do use Ecto.Schema + alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Web.ActivityPub.ObjectValidators.UrlObjectValidator import Ecto.Changeset @@ -15,7 +16,11 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator do field(:mediaType, :string, default: "application/octet-stream") field(:name, :string) - embeds_many(:url, UrlObjectValidator) + embeds_many :url, UrlObjectValidator, primary_key: false do + field(:type, :string) + field(:href, ObjectValidators.Uri) + field(:mediaType, :string, default: "application/octet-stream") + end end def cast_and_validate(data) do @@ -37,7 +42,18 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator do struct |> cast(data, [:type, :mediaType, :name]) - |> cast_embed(:url, required: true) + |> cast_embed(:url, with: &url_changeset/2) + |> validate_inclusion(:type, ~w[Link Document Audio Image Video]) + |> validate_required([:type, :mediaType, :url]) + end + + def url_changeset(struct, data) do + data = fix_media_type(data) + + struct + |> cast(data, [:type, :href, :mediaType]) + |> validate_inclusion(:type, ["Link"]) + |> validate_required([:type, :href, :mediaType]) end def fix_media_type(data) do @@ -75,6 +91,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator do def validate_data(cng) do cng + |> validate_inclusion(:type, ~w[Document Audio Image Video]) |> validate_required([:mediaType, :url, :type]) end end diff --git a/lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex b/lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex deleted file mode 100644 index 881030f38..000000000 --- a/lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex +++ /dev/null @@ -1,24 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.ActivityPub.ObjectValidators.UrlObjectValidator do - use Ecto.Schema - - alias Pleroma.EctoType.ActivityPub.ObjectValidators - - import Ecto.Changeset - @primary_key false - - embedded_schema do - field(:type, :string) - field(:href, ObjectValidators.Uri) - field(:mediaType, :string, default: "application/octet-stream") - end - - def changeset(struct, data) do - struct - |> cast(data, __schema__(:fields)) - |> validate_required([:type, :href, :mediaType]) - end -end From e3ca0a7e2d18ca9b3c809282678456d4517d39bc Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Fri, 11 Sep 2020 09:09:28 +0300 Subject: [PATCH 096/182] migration to remove old cron jobs --- .../20200911055909_remove_cron_jobs.exs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 priv/repo/migrations/20200911055909_remove_cron_jobs.exs diff --git a/priv/repo/migrations/20200911055909_remove_cron_jobs.exs b/priv/repo/migrations/20200911055909_remove_cron_jobs.exs new file mode 100644 index 000000000..33897d128 --- /dev/null +++ b/priv/repo/migrations/20200911055909_remove_cron_jobs.exs @@ -0,0 +1,20 @@ +defmodule Pleroma.Repo.Migrations.RemoveCronJobs do + use Ecto.Migration + + import Ecto.Query, only: [from: 2] + + def up do + from(j in "oban_jobs", + where: + j.worker in ^[ + "Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker", + "Pleroma.Workers.Cron.StatsWorker", + "Pleroma.Workers.Cron.ClearOauthTokenWorker" + ], + select: [:id] + ) + |> Pleroma.Repo.delete_all() + end + + def down, do: :ok +end From dbc013f24c3885960714425f201e372335d22345 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 11 Sep 2020 11:22:50 +0200 Subject: [PATCH 097/182] instance: Handle not getting a favicon --- lib/pleroma/instances/instance.ex | 12 ++--- test/web/instances/instance_test.exs | 71 ++++++++++++++++++---------- 2 files changed, 50 insertions(+), 33 deletions(-) diff --git a/lib/pleroma/instances/instance.ex b/lib/pleroma/instances/instance.ex index 8bf53c090..6948651c7 100644 --- a/lib/pleroma/instances/instance.ex +++ b/lib/pleroma/instances/instance.ex @@ -159,13 +159,11 @@ defmodule Pleroma.Instances.Instance do Pleroma.HTTP.get(to_string(instance_uri), [{"accept", "text/html"}], adapter: [pool: :media] ), - favicon_rel <- - html - |> Floki.parse_document!() - |> Floki.attribute("link[rel=icon]", "href") - |> List.first(), - favicon <- URI.merge(instance_uri, favicon_rel) |> to_string(), - true <- is_binary(favicon) do + {_, [favicon_rel | _]} when is_binary(favicon_rel) <- + {:parse, + html |> Floki.parse_document!() |> Floki.attribute("link[rel=icon]", "href")}, + {_, favicon} when is_binary(favicon) <- + {:merge, URI.merge(instance_uri, favicon_rel) |> to_string()} do favicon else _ -> nil diff --git a/test/web/instances/instance_test.exs b/test/web/instances/instance_test.exs index dc6ace843..4f0805100 100644 --- a/test/web/instances/instance_test.exs +++ b/test/web/instances/instance_test.exs @@ -99,35 +99,54 @@ defmodule Pleroma.Instances.InstanceTest do end end - test "Scrapes favicon URLs" do - Tesla.Mock.mock(fn %{url: "https://favicon.example.org/"} -> - %Tesla.Env{ - status: 200, - body: ~s[] - } - end) + describe "get_or_update_favicon/1" do + test "Scrapes favicon URLs" do + Tesla.Mock.mock(fn %{url: "https://favicon.example.org/"} -> + %Tesla.Env{ + status: 200, + body: ~s[] + } + end) - assert "https://favicon.example.org/favicon.png" == - Instance.get_or_update_favicon(URI.parse("https://favicon.example.org/")) - end + assert "https://favicon.example.org/favicon.png" == + Instance.get_or_update_favicon(URI.parse("https://favicon.example.org/")) + end - test "Returns nil on too long favicon URLs" do - long_favicon_url = - "https://Lorem.ipsum.dolor.sit.amet/consecteturadipiscingelit/Praesentpharetrapurusutaliquamtempus/Mauriseulaoreetarcu/atfacilisisorci/Nullamporttitor/nequesedfeugiatmollis/dolormagnaefficiturlorem/nonpretiumsapienorcieurisus/Nullamveleratsem/Maecenassedaccumsanexnam/favicon.png" + test "Returns nil on too long favicon URLs" do + long_favicon_url = + "https://Lorem.ipsum.dolor.sit.amet/consecteturadipiscingelit/Praesentpharetrapurusutaliquamtempus/Mauriseulaoreetarcu/atfacilisisorci/Nullamporttitor/nequesedfeugiatmollis/dolormagnaefficiturlorem/nonpretiumsapienorcieurisus/Nullamveleratsem/Maecenassedaccumsanexnam/favicon.png" - Tesla.Mock.mock(fn %{url: "https://long-favicon.example.org/"} -> - %Tesla.Env{ - status: 200, - body: ~s[] - } - end) + Tesla.Mock.mock(fn %{url: "https://long-favicon.example.org/"} -> + %Tesla.Env{ + status: 200, + body: + ~s[] + } + end) - assert capture_log(fn -> - assert nil == - Instance.get_or_update_favicon( - URI.parse("https://long-favicon.example.org/") - ) - end) =~ - "Instance.get_or_update_favicon(\"long-favicon.example.org\") error: %Postgrex.Error{" + assert capture_log(fn -> + assert nil == + Instance.get_or_update_favicon( + URI.parse("https://long-favicon.example.org/") + ) + end) =~ + "Instance.get_or_update_favicon(\"long-favicon.example.org\") error: %Postgrex.Error{" + end + + test "Handles not getting a favicon URL properly" do + Tesla.Mock.mock(fn %{url: "https://no-favicon.example.org/"} -> + %Tesla.Env{ + status: 200, + body: ~s[

I wil look down and whisper "GNO.."

] + } + end) + + refute capture_log(fn -> + assert nil == + Instance.get_or_update_favicon( + URI.parse("https://no-favicon.example.org/") + ) + end) =~ "Instance.scrape_favicon(\"https://no-favicon.example.org/\") error: " + end end end From 36c9197ac36707cdfe3d679bbd64972b4b03ea84 Mon Sep 17 00:00:00 2001 From: Haelwenn Date: Fri, 11 Sep 2020 10:46:16 +0000 Subject: [PATCH 098/182] Apply 1 suggestion(s) to 1 file(s) --- lib/pleroma/web/federator/federator.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/federator/federator.ex b/lib/pleroma/web/federator/federator.ex index e4ab9ba32..130654145 100644 --- a/lib/pleroma/web/federator/federator.ex +++ b/lib/pleroma/web/federator/federator.ex @@ -94,7 +94,7 @@ defmodule Pleroma.Web.Federator do e -> # Just drop those for now - Logger.debug("Unhandled activity\n" <> Jason.encode!(params, pretty: true)) + Logger.debug(fn -> "Unhandled activity\n" <> Jason.encode!(params, pretty: true) end) {:error, e} end end From 89a7efab69d905cc3521388b1e1cf43851848627 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Fri, 11 Sep 2020 14:22:54 +0300 Subject: [PATCH 099/182] ConnectionPool: Log possible HTTP1 blocks --- lib/pleroma/gun/conn.ex | 12 ++++++------ lib/pleroma/gun/connection_pool/worker.ex | 22 ++++++++++++++++------ lib/pleroma/telemetry/logger.ex | 18 ++++++++++++++++-- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/lib/pleroma/gun/conn.ex b/lib/pleroma/gun/conn.ex index 75b1ffc0a..477e19c6e 100644 --- a/lib/pleroma/gun/conn.ex +++ b/lib/pleroma/gun/conn.ex @@ -50,10 +50,10 @@ defmodule Pleroma.Gun.Conn do with open_opts <- Map.delete(opts, :tls_opts), {:ok, conn} <- Gun.open(proxy_host, proxy_port, open_opts), - {:ok, _} <- Gun.await_up(conn, opts[:connect_timeout]), + {:ok, protocol} <- Gun.await_up(conn, opts[:connect_timeout]), stream <- Gun.connect(conn, connect_opts), {:response, :fin, 200, _} <- Gun.await(conn, stream) do - {:ok, conn} + {:ok, conn, protocol} else error -> Logger.warn( @@ -88,8 +88,8 @@ defmodule Pleroma.Gun.Conn do |> Map.put(:socks_opts, socks_opts) with {:ok, conn} <- Gun.open(proxy_host, proxy_port, opts), - {:ok, _} <- Gun.await_up(conn, opts[:connect_timeout]) do - {:ok, conn} + {:ok, protocol} <- Gun.await_up(conn, opts[:connect_timeout]) do + {:ok, conn, protocol} else error -> Logger.warn( @@ -106,8 +106,8 @@ defmodule Pleroma.Gun.Conn do host = Pleroma.HTTP.AdapterHelper.parse_host(host) with {:ok, conn} <- Gun.open(host, port, opts), - {:ok, _} <- Gun.await_up(conn, opts[:connect_timeout]) do - {:ok, conn} + {:ok, protocol} <- Gun.await_up(conn, opts[:connect_timeout]) do + {:ok, conn, protocol} else error -> Logger.warn( diff --git a/lib/pleroma/gun/connection_pool/worker.ex b/lib/pleroma/gun/connection_pool/worker.ex index c36332817..49d41e4c7 100644 --- a/lib/pleroma/gun/connection_pool/worker.ex +++ b/lib/pleroma/gun/connection_pool/worker.ex @@ -15,7 +15,7 @@ defmodule Pleroma.Gun.ConnectionPool.Worker do @impl true def handle_continue({:connect, [key, uri, opts, client_pid]}, _) do - with {:ok, conn_pid} <- Gun.Conn.open(uri, opts), + with {:ok, conn_pid, protocol} <- Gun.Conn.open(uri, opts), Process.link(conn_pid) do time = :erlang.monotonic_time(:millisecond) @@ -27,8 +27,12 @@ defmodule Pleroma.Gun.ConnectionPool.Worker do send(client_pid, {:conn_pid, conn_pid}) {:noreply, - %{key: key, timer: nil, client_monitors: %{client_pid => Process.monitor(client_pid)}}, - :hibernate} + %{ + key: key, + timer: nil, + client_monitors: %{client_pid => Process.monitor(client_pid)}, + protocol: protocol + }, :hibernate} else err -> {:stop, {:shutdown, err}, nil} @@ -53,14 +57,20 @@ defmodule Pleroma.Gun.ConnectionPool.Worker do end @impl true - def handle_call(:add_client, {client_pid, _}, %{key: key} = state) do + def handle_call(:add_client, {client_pid, _}, %{key: key, protocol: protocol} = state) do time = :erlang.monotonic_time(:millisecond) - {{conn_pid, _, _, _}, _} = + {{conn_pid, used_by, _, _}, _} = Registry.update_value(@registry, key, fn {conn_pid, used_by, crf, last_reference} -> {conn_pid, [client_pid | used_by], crf(time - last_reference, crf), time} end) + :telemetry.execute( + [:pleroma, :connection_pool, :client, :add], + %{client_pid: client_pid, clients: used_by}, + %{key: state.key, protocol: protocol} + ) + state = if state.timer != nil do Process.cancel_timer(state[:timer]) @@ -131,7 +141,7 @@ defmodule Pleroma.Gun.ConnectionPool.Worker do @impl true def handle_info({:DOWN, _ref, :process, pid, reason}, state) do :telemetry.execute( - [:pleroma, :connection_pool, :client_death], + [:pleroma, :connection_pool, :client, :dead], %{client_pid: pid, reason: reason}, %{key: state.key} ) diff --git a/lib/pleroma/telemetry/logger.ex b/lib/pleroma/telemetry/logger.ex index 4cacae02f..197b1d091 100644 --- a/lib/pleroma/telemetry/logger.ex +++ b/lib/pleroma/telemetry/logger.ex @@ -7,7 +7,8 @@ defmodule Pleroma.Telemetry.Logger do [:pleroma, :connection_pool, :reclaim, :start], [:pleroma, :connection_pool, :reclaim, :stop], [:pleroma, :connection_pool, :provision_failure], - [:pleroma, :connection_pool, :client_death] + [:pleroma, :connection_pool, :client, :dead], + [:pleroma, :connection_pool, :client, :add] ] def attach do :telemetry.attach_many("pleroma-logger", @events, &handle_event/4, []) @@ -62,7 +63,7 @@ defmodule Pleroma.Telemetry.Logger do end def handle_event( - [:pleroma, :connection_pool, :client_death], + [:pleroma, :connection_pool, :client, :dead], %{client_pid: client_pid, reason: reason}, %{key: key}, _ @@ -73,4 +74,17 @@ defmodule Pleroma.Telemetry.Logger do }" end) end + + def handle_event( + [:pleroma, :connection_pool, :client, :add], + %{clients: [_, _ | _] = clients}, + %{key: key, protocol: :http}, + _ + ) do + Logger.info(fn -> + "Pool worker for #{key}: #{length(clients)} clients are using an HTTP1 connection at the same time, head-of-line blocking might occur." + end) + end + + def handle_event([:pleroma, :connection_pool, :client, :add], _, _, _), do: :ok end From f1f44069ae525fd21127e5ceccc61016c12f4427 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 11 Sep 2020 19:58:58 +0200 Subject: [PATCH 100/182] Fetcher: Correctly return MRF reject reason --- lib/pleroma/object/fetcher.ex | 4 ++-- lib/pleroma/web/activity_pub/activity_pub.ex | 4 ++-- test/object/fetcher_test.exs | 25 +++++++++++++++----- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/lib/pleroma/object/fetcher.ex b/lib/pleroma/object/fetcher.ex index 1de2ce6c3..24dc7cb95 100644 --- a/lib/pleroma/object/fetcher.ex +++ b/lib/pleroma/object/fetcher.ex @@ -98,8 +98,8 @@ defmodule Pleroma.Object.Fetcher do {:containment, _} -> {:error, "Object containment failed."} - {:transmogrifier, {:error, {:reject, nil}}} -> - {:reject, nil} + {:transmogrifier, {:error, {:reject, e}}} -> + {:reject, e} {:transmogrifier, _} = e -> {:error, e} diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 66a9f78a3..b2205bff7 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -154,8 +154,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do {:remote_limit_pass, _} -> {:error, :remote_limit} - {:reject, reason} -> - {:error, reason} + {:reject, _} = e -> + {:error, e} end end diff --git a/test/object/fetcher_test.exs b/test/object/fetcher_test.exs index 16cfa7f5c..3173ee31c 100644 --- a/test/object/fetcher_test.exs +++ b/test/object/fetcher_test.exs @@ -6,10 +6,13 @@ defmodule Pleroma.Object.FetcherTest do use Pleroma.DataCase alias Pleroma.Activity + alias Pleroma.Config alias Pleroma.Object alias Pleroma.Object.Fetcher - import Tesla.Mock + + import ExUnit.CaptureLog import Mock + import Tesla.Mock setup do mock(fn @@ -71,20 +74,20 @@ defmodule Pleroma.Object.FetcherTest do setup do: clear_config([:instance, :federation_incoming_replies_max_depth]) test "it returns thread depth exceeded error if thread depth is exceeded" do - Pleroma.Config.put([:instance, :federation_incoming_replies_max_depth], 0) + Config.put([:instance, :federation_incoming_replies_max_depth], 0) assert {:error, "Max thread distance exceeded."} = Fetcher.fetch_object_from_id(@ap_id, depth: 1) end test "it fetches object if max thread depth is restricted to 0 and depth is not specified" do - Pleroma.Config.put([:instance, :federation_incoming_replies_max_depth], 0) + Config.put([:instance, :federation_incoming_replies_max_depth], 0) assert {:ok, _} = Fetcher.fetch_object_from_id(@ap_id) end test "it fetches object if requested depth does not exceed max thread depth" do - Pleroma.Config.put([:instance, :federation_incoming_replies_max_depth], 10) + Config.put([:instance, :federation_incoming_replies_max_depth], 10) assert {:ok, _} = Fetcher.fetch_object_from_id(@ap_id, depth: 10) end @@ -120,6 +123,16 @@ defmodule Pleroma.Object.FetcherTest do assert object == object_again end + + test "Return MRF reason when fetched status is rejected by one" do + clear_config([:mrf_keyword, :reject], ["yeah"]) + clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.KeywordPolicy]) + + assert {:reject, "[KeywordPolicy] Matches with rejected keyword"} == + Fetcher.fetch_object_from_id( + "http://mastodon.example.org/@admin/99541947525187367" + ) + end end describe "implementation quirks" do @@ -212,7 +225,7 @@ defmodule Pleroma.Object.FetcherTest do Pleroma.Signature, [:passthrough], [] do - Pleroma.Config.put([:activitypub, :sign_object_fetches], true) + Config.put([:activitypub, :sign_object_fetches], true) Fetcher.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367") @@ -223,7 +236,7 @@ defmodule Pleroma.Object.FetcherTest do Pleroma.Signature, [:passthrough], [] do - Pleroma.Config.put([:activitypub, :sign_object_fetches], false) + Config.put([:activitypub, :sign_object_fetches], false) Fetcher.fetch_object_from_id("http://mastodon.example.org/@admin/99541947525187367") From f88dc1937e5aa4208143fa68400a5c38a1b9eddf Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 31 Aug 2020 16:48:24 -0500 Subject: [PATCH 101/182] MastodonAPI.StatusView.get_user/1 --> CommonAPI.get_user/1 --- .../web/admin_api/views/status_view.ex | 3 ++- lib/pleroma/web/common_api/common_api.ex | 17 +++++++++++++ .../web/mastodon_api/views/status_view.ex | 25 +++---------------- .../web/pleroma_api/views/scrobble_view.ex | 4 +-- test/web/common_api/common_api_test.exs | 20 +++++++++++++++ 5 files changed, 45 insertions(+), 24 deletions(-) diff --git a/lib/pleroma/web/admin_api/views/status_view.ex b/lib/pleroma/web/admin_api/views/status_view.ex index 500800be2..6042a22b6 100644 --- a/lib/pleroma/web/admin_api/views/status_view.ex +++ b/lib/pleroma/web/admin_api/views/status_view.ex @@ -8,6 +8,7 @@ defmodule Pleroma.Web.AdminAPI.StatusView do require Pleroma.Constants alias Pleroma.Web.AdminAPI + alias Pleroma.Web.CommonAPI alias Pleroma.Web.MastodonAPI defdelegate merge_account_views(user), to: AdminAPI.AccountView @@ -17,7 +18,7 @@ defmodule Pleroma.Web.AdminAPI.StatusView do end def render("show.json", %{activity: %{data: %{"object" => _object}} = activity} = opts) do - user = MastodonAPI.StatusView.get_user(activity.data["actor"]) + user = CommonAPI.get_user(activity.data["actor"]) MastodonAPI.StatusView.render("show.json", opts) |> Map.merge(%{account: merge_account_views(user)}) diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 5ad2b91c2..d6e9d3d67 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -550,4 +550,21 @@ defmodule Pleroma.Web.CommonAPI do def show_reblogs(%User{} = user, %User{} = target) do UserRelationship.delete_reblog_mute(user, target) end + + def get_user(ap_id, fake_record_fallback \\ true) do + cond do + user = User.get_cached_by_ap_id(ap_id) -> + user + + user = User.get_by_guessed_nickname(ap_id) -> + user + + fake_record_fallback -> + # TODO: refactor (fake records is never a good idea) + User.error_user(ap_id) + + true -> + nil + end + end end diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index 3fe1967be..66732d09e 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -56,23 +56,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do end) end - def get_user(ap_id, fake_record_fallback \\ true) do - cond do - user = User.get_cached_by_ap_id(ap_id) -> - user - - user = User.get_by_guessed_nickname(ap_id) -> - user - - fake_record_fallback -> - # TODO: refactor (fake records is never a good idea) - User.error_user(ap_id) - - true -> - nil - end - end - defp get_context_id(%{data: %{"context_id" => context_id}}) when not is_nil(context_id), do: context_id @@ -120,7 +103,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do # Note: unresolved users are filtered out actors = (activities ++ parent_activities) - |> Enum.map(&get_user(&1.data["actor"], false)) + |> Enum.map(&CommonAPI.get_user(&1.data["actor"], false)) |> Enum.filter(& &1) UserRelationship.view_relationships_option(reading_user, actors, subset: :source_mutes) @@ -139,7 +122,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do "show.json", %{activity: %{data: %{"type" => "Announce", "object" => _object}} = activity} = opts ) do - user = get_user(activity.data["actor"]) + user = CommonAPI.get_user(activity.data["actor"]) created_at = Utils.to_masto_date(activity.data["published"]) activity_object = Object.normalize(activity) @@ -212,7 +195,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do def render("show.json", %{activity: %{data: %{"object" => _object}} = activity} = opts) do object = Object.normalize(activity) - user = get_user(activity.data["actor"]) + user = CommonAPI.get_user(activity.data["actor"]) user_follower_address = user.follower_address like_count = object.data["like_count"] || 0 @@ -266,7 +249,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do reply_to = get_reply_to(activity, opts) - reply_to_user = reply_to && get_user(reply_to.data["actor"]) + reply_to_user = reply_to && CommonAPI.get_user(reply_to.data["actor"]) content = object diff --git a/lib/pleroma/web/pleroma_api/views/scrobble_view.ex b/lib/pleroma/web/pleroma_api/views/scrobble_view.ex index bbff93abe..95bd4c368 100644 --- a/lib/pleroma/web/pleroma_api/views/scrobble_view.ex +++ b/lib/pleroma/web/pleroma_api/views/scrobble_view.ex @@ -10,14 +10,14 @@ defmodule Pleroma.Web.PleromaAPI.ScrobbleView do alias Pleroma.Activity alias Pleroma.HTML alias Pleroma.Object + alias Pleroma.Web.CommonAPI alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.AccountView - alias Pleroma.Web.MastodonAPI.StatusView def render("show.json", %{activity: %Activity{data: %{"type" => "Listen"}} = activity} = opts) do object = Object.normalize(activity) - user = StatusView.get_user(activity.data["actor"]) + user = CommonAPI.get_user(activity.data["actor"]) created_at = Utils.to_masto_date(activity.data["published"]) %{ diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 4ba6232dc..d171b344a 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -1126,4 +1126,24 @@ defmodule Pleroma.Web.CommonAPITest do assert Visibility.get_visibility(activity) == "private" end end + + describe "get_user/1" do + test "gets user by ap_id" do + user = insert(:user) + assert CommonAPI.get_user(user.ap_id) == user + end + + test "gets user by guessed nickname" do + user = insert(:user, ap_id: "", nickname: "mario@mushroom.kingdom") + assert CommonAPI.get_user("https://mushroom.kingdom/users/mario") == user + end + + test "fallback" do + assert %User{ + name: "", + ap_id: "", + nickname: "erroruser@example.com" + } = CommonAPI.get_user("") + end + end end From b40a627ab02f9f63eac42ce6fc65282fc6cb6b92 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 31 Aug 2020 19:56:05 -0500 Subject: [PATCH 102/182] AdminAPI: delete a chat message --- lib/pleroma/moderation_log.ex | 24 +++++++++ .../admin_api/controllers/chat_controller.ex | 37 +++++++++++++ .../operations/admin/chat_operation.ex | 44 +++++++++++++++ lib/pleroma/web/router.ex | 2 + test/support/factory.ex | 54 +++++++++++++++++++ .../controllers/chat_controller_test.exs | 53 ++++++++++++++++++ 6 files changed, 214 insertions(+) create mode 100644 lib/pleroma/web/admin_api/controllers/chat_controller.ex create mode 100644 lib/pleroma/web/api_spec/operations/admin/chat_operation.ex create mode 100644 test/web/admin_api/controllers/chat_controller_test.exs diff --git a/lib/pleroma/moderation_log.ex b/lib/pleroma/moderation_log.ex index 31c9afe2a..47036a6f6 100644 --- a/lib/pleroma/moderation_log.ex +++ b/lib/pleroma/moderation_log.ex @@ -320,6 +320,19 @@ defmodule Pleroma.ModerationLog do |> insert_log_entry_with_message() end + @spec insert_log(%{actor: User, action: String.t(), subject_id: String.t()}) :: + {:ok, ModerationLog} | {:error, any} + def insert_log(%{actor: %User{} = actor, action: "chat_message_delete", subject_id: subject_id}) do + %ModerationLog{ + data: %{ + "actor" => %{"nickname" => actor.nickname}, + "action" => "chat_message_delete", + "subject_id" => subject_id + } + } + |> insert_log_entry_with_message() + end + @spec insert_log_entry_with_message(ModerationLog) :: {:ok, ModerationLog} | {:error, any} defp insert_log_entry_with_message(entry) do entry.data["message"] @@ -627,6 +640,17 @@ defmodule Pleroma.ModerationLog do "@#{actor_nickname} updated users: #{users_to_nicknames_string(subjects)}" end + @spec get_log_entry_message(ModerationLog) :: String.t() + def get_log_entry_message(%ModerationLog{ + data: %{ + "actor" => %{"nickname" => actor_nickname}, + "action" => "chat_message_delete", + "subject_id" => subject_id + } + }) do + "@#{actor_nickname} deleted chat message ##{subject_id}" + end + defp nicknames_to_string(nicknames) do nicknames |> Enum.map(&"@#{&1}") diff --git a/lib/pleroma/web/admin_api/controllers/chat_controller.ex b/lib/pleroma/web/admin_api/controllers/chat_controller.ex new file mode 100644 index 000000000..bcce824d2 --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/chat_controller.ex @@ -0,0 +1,37 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.ChatController do + use Pleroma.Web, :controller + + alias Pleroma.Activity + alias Pleroma.ModerationLog + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.CommonAPI + + require Logger + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + + plug( + OAuthScopesPlug, + %{scopes: ["write:chats"], admin: true} when action in [:delete_message] + ) + + action_fallback(Pleroma.Web.AdminAPI.FallbackController) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.ChatOperation + + def delete_message(%{assigns: %{user: user}} = conn, %{message_id: id}) do + with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do + ModerationLog.insert_log(%{ + action: "chat_message_delete", + actor: user, + subject_id: id + }) + + json(conn, %{}) + end + end +end diff --git a/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex b/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex new file mode 100644 index 000000000..7045fd7ce --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex @@ -0,0 +1,44 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Admin.ChatOperation do + alias OpenApiSpex.Operation + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def delete_message_operation do + %Operation{ + tags: ["Admin", "Chats"], + summary: "Delete an individual chat message", + operationId: "AdminAPI.ChatController.delete", + parameters: [id_param(), message_id_param()] ++ admin_api_params(), + security: [%{"oAuth" => ["write:chats"]}], + responses: %{ + 200 => empty_object_response(), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def id_param do + Operation.parameter(:id, :path, FlakeID, "Chat ID", + example: "9umDrYheeY451cQnEe", + required: true + ) + end + + def message_id_param do + Operation.parameter(:message_id, :path, FlakeID, "Chat message ID", + example: "9umDrYheeY451cQnEe", + required: true + ) + end +end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index c6433cc53..e438768ed 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -214,6 +214,8 @@ defmodule Pleroma.Web.Router do get("/media_proxy_caches", MediaProxyCacheController, :index) post("/media_proxy_caches/delete", MediaProxyCacheController, :delete) post("/media_proxy_caches/purge", MediaProxyCacheController, :purge) + + delete("/chats/:id/messages/:message_id", ChatController, :delete_message) end scope "/api/pleroma/emoji", Pleroma.Web.PleromaAPI do diff --git a/test/support/factory.ex b/test/support/factory.ex index 486eda8da..61ca4587c 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -460,4 +460,58 @@ defmodule Pleroma.Factory do phrase: "cofe" } end + + def chat_factory(attrs \\ %{}) do + user = attrs[:user] || insert(:user) + recipient = attrs[:recipient] || insert(:user) + + %Pleroma.Chat{ + user_id: user.id, + recipient: recipient.ap_id + } + end + + def chat_message_factory(attrs \\ %{}) do + text = sequence(:text, &"This is :moominmamma: chat message #{&1}") + chat = attrs[:chat] || insert(:chat) + + data = %{ + "type" => "ChatMessage", + "content" => text, + "id" => Pleroma.Web.ActivityPub.Utils.generate_object_id(), + "actor" => User.get_by_id(chat.user_id).ap_id, + "to" => [chat.recipient], + "published" => DateTime.utc_now() |> DateTime.to_iso8601() + } + + %Pleroma.Object{ + data: merge_attributes(data, Map.get(attrs, :data, %{})) + } + end + + def chat_message_activity_factory(attrs \\ %{}) do + chat = attrs[:chat] || insert(:chat) + chat_message = attrs[:chat_message] || insert(:chat_message, chat: chat) + + data_attrs = attrs[:data_attrs] || %{} + attrs = Map.drop(attrs, [:chat, :chat_message, :data_attrs]) + + data = + %{ + "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(), + "type" => "Create", + "actor" => chat_message.data["actor"], + "to" => chat_message.data["to"], + "object" => chat_message.data["id"], + "published" => DateTime.utc_now() |> DateTime.to_iso8601() + } + |> Map.merge(data_attrs) + + %Pleroma.Activity{ + data: data, + actor: data["actor"], + recipients: data["to"] + } + |> Map.merge(attrs) + end end diff --git a/test/web/admin_api/controllers/chat_controller_test.exs b/test/web/admin_api/controllers/chat_controller_test.exs new file mode 100644 index 000000000..4527437af --- /dev/null +++ b/test/web/admin_api/controllers/chat_controller_test.exs @@ -0,0 +1,53 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.ChatControllerTest do + use Pleroma.Web.ConnCase + + import Pleroma.Factory + + alias Pleroma.Activity + alias Pleroma.Config + alias Pleroma.ModerationLog + alias Pleroma.Repo + + setup do + admin = insert(:user, is_admin: true) + token = insert(:oauth_admin_token, user: admin) + + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, token) + + {:ok, %{admin: admin, token: token, conn: conn}} + end + + describe "DELETE /api/pleroma/admin/chats/:id/messages/:message_id" do + setup do + chat = insert(:chat) + message = insert(:chat_message_activity, chat: chat) + %{chat: chat, message: message} + end + + test "deletes chat message", %{conn: conn, chat: chat, message: message, admin: admin} do + conn + |> delete("/api/pleroma/admin/chats/#{chat.id}/messages/#{message.id}") + |> json_response_and_validate_schema(:ok) + + refute Activity.get_by_id(message.id) + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} deleted chat message ##{message.id}" + end + + test "returns 404 when the chat message does not exist", %{conn: conn} do + conn = delete(conn, "/api/pleroma/admin/chats/test/messages/test") + + assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} + end + end +end From fb0de073439b5e3be823e736b44608e80f1027f1 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Mon, 31 Aug 2020 20:23:33 -0500 Subject: [PATCH 103/182] AdminAPI: list chats for a user --- .../controllers/admin_api_controller.ex | 27 +++++++++++++++++++ lib/pleroma/web/router.ex | 3 +++ .../controllers/admin_api_controller_test.exs | 18 +++++++++++++ 3 files changed, 48 insertions(+) diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index f5e4d49f9..9b66c2f10 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -5,6 +5,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do use Pleroma.Web, :controller + import Ecto.Query import Pleroma.Web.ControllerHelper, only: [json_response: 3] alias Pleroma.Config @@ -21,6 +22,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do alias Pleroma.Web.AdminAPI.ModerationLogView alias Pleroma.Web.AdminAPI.Search alias Pleroma.Web.Endpoint + alias Pleroma.Web.PleromaAPI alias Pleroma.Web.Router require Logger @@ -68,6 +70,12 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do when action in [:list_user_statuses, :list_instance_statuses] ) + plug( + OAuthScopesPlug, + %{scopes: ["read:chats"], admin: true} + when action in [:list_user_chats] + ) + plug( OAuthScopesPlug, %{scopes: ["read"], admin: true} @@ -256,6 +264,25 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do end end + def list_user_chats(%{assigns: %{user: admin}} = conn, %{"nickname" => nickname} = _params) do + with %User{id: user_id} <- User.get_cached_by_nickname_or_id(nickname, for: admin) do + chats = + from(c in Pleroma.Chat, + where: c.user_id == ^user_id, + order_by: [desc: c.updated_at], + inner_join: u in User, + on: u.ap_id == c.recipient + ) + |> Pleroma.Repo.all() + + conn + |> put_view(PleromaAPI.ChatView) + |> render("index.json", chats: chats) + else + _ -> {:error, :not_found} + end + end + def user_toggle_activation(%{assigns: %{user: admin}} = conn, %{"nickname" => nickname}) do user = User.get_cached_by_nickname(nickname) diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index e438768ed..ad3282df4 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -178,6 +178,7 @@ defmodule Pleroma.Web.Router do get("/users", AdminAPIController, :list_users) get("/users/:nickname", AdminAPIController, :user_show) get("/users/:nickname/statuses", AdminAPIController, :list_user_statuses) + get("/users/:nickname/chats", AdminAPIController, :list_user_chats) get("/instances/:instance/statuses", AdminAPIController, :list_instance_statuses) @@ -215,6 +216,8 @@ defmodule Pleroma.Web.Router do post("/media_proxy_caches/delete", MediaProxyCacheController, :delete) post("/media_proxy_caches/purge", MediaProxyCacheController, :purge) + # get("/chats/:id", ChatController, :show) + # get("/chats/:id/messages", ChatController, :messages) delete("/chats/:id/messages/:message_id", ChatController, :delete_message) end diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs index dbf478edf..cf5637246 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -1510,6 +1510,24 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do end end + describe "GET /api/pleroma/admin/users/:nickname/chats" do + setup do + user = insert(:user) + + insert(:chat, user: user) + insert(:chat, user: user) + insert(:chat, user: user) + + %{user: user} + end + + test "renders user's statuses", %{conn: conn, user: user} do + conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/chats") + + assert json_response(conn, 200) |> length() == 3 + end + end + describe "GET /api/pleroma/admin/moderation_log" do setup do moderator = insert(:user, is_moderator: true) From c41430b23eaf3fd15b227e66215aa2a4ff31dfdb Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Tue, 1 Sep 2020 19:05:24 -0500 Subject: [PATCH 104/182] Refactor with Chat.for_user_query/1 --- lib/pleroma/chat.ex | 12 ++++++++++++ .../admin_api/controllers/admin_api_controller.ex | 8 +------- .../web/pleroma_api/controllers/chat_controller.ex | 9 ++------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index 24a86371e..b38c5c3dd 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -6,7 +6,9 @@ defmodule Pleroma.Chat do use Ecto.Schema import Ecto.Changeset + import Ecto.Query + alias Pleroma.Chat alias Pleroma.Repo alias Pleroma.User @@ -69,4 +71,14 @@ defmodule Pleroma.Chat do conflict_target: [:user_id, :recipient] ) end + + @spec for_user_query(FlakeId.Ecto.CompatType.t()) :: Ecto.Query.t() + def for_user_query(user_id) do + from(c in Chat, + where: c.user_id == ^user_id, + order_by: [desc: c.updated_at], + inner_join: u in User, + on: u.ap_id == c.recipient + ) + end end diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index 9b66c2f10..fccdbabb4 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -5,7 +5,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do use Pleroma.Web, :controller - import Ecto.Query import Pleroma.Web.ControllerHelper, only: [json_response: 3] alias Pleroma.Config @@ -267,12 +266,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do def list_user_chats(%{assigns: %{user: admin}} = conn, %{"nickname" => nickname} = _params) do with %User{id: user_id} <- User.get_cached_by_nickname_or_id(nickname, for: admin) do chats = - from(c in Pleroma.Chat, - where: c.user_id == ^user_id, - order_by: [desc: c.updated_at], - inner_join: u in User, - on: u.ap_id == c.recipient - ) + Pleroma.Chat.for_user_query(user_id) |> Pleroma.Repo.all() conn diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 1f2e953f7..27c9a2e0f 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -146,13 +146,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do blocked_ap_ids = User.blocked_users_ap_ids(user) chats = - from(c in Chat, - where: c.user_id == ^user_id, - where: c.recipient not in ^blocked_ap_ids, - order_by: [desc: c.updated_at], - inner_join: u in User, - on: u.ap_id == c.recipient - ) + Chat.for_user_query(user_id) + |> where([c], c.recipient not in ^blocked_ap_ids) |> Repo.all() conn From f13b52a703d5c60cf12b2fff69f458e5c467c783 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Tue, 1 Sep 2020 19:39:34 -0500 Subject: [PATCH 105/182] AdminAPI: list messages in a chat --- .../admin_api/controllers/chat_controller.ex | 27 ++++++++++ .../operations/admin/chat_operation.ex | 26 ++++++++- lib/pleroma/web/router.ex | 2 +- .../controllers/chat_controller_test.exs | 54 +++++++++++++++++++ 4 files changed, 107 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/admin_api/controllers/chat_controller.ex b/lib/pleroma/web/admin_api/controllers/chat_controller.ex index bcce824d2..b423188d7 100644 --- a/lib/pleroma/web/admin_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/chat_controller.ex @@ -6,14 +6,23 @@ defmodule Pleroma.Web.AdminAPI.ChatController do use Pleroma.Web, :controller alias Pleroma.Activity + alias Pleroma.Chat + alias Pleroma.Chat.MessageReference alias Pleroma.ModerationLog + alias Pleroma.Pagination alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Web.CommonAPI + alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView require Logger plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug( + OAuthScopesPlug, + %{scopes: ["read:chats"], admin: true} when action in [:messages] + ) + plug( OAuthScopesPlug, %{scopes: ["write:chats"], admin: true} when action in [:delete_message] @@ -34,4 +43,22 @@ defmodule Pleroma.Web.AdminAPI.ChatController do json(conn, %{}) end end + + def messages(conn, %{id: id} = params) do + with %Chat{} = chat <- Chat.get_by_id(id) do + cm_refs = + chat + |> MessageReference.for_chat_query() + |> Pagination.fetch_paginated(params) + + conn + |> put_view(MessageReferenceView) + |> render("index.json", chat_message_references: cm_refs) + else + _ -> + conn + |> put_status(:not_found) + |> json(%{error: "not found"}) + end + end end diff --git a/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex b/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex index 7045fd7ce..a382bd35a 100644 --- a/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex @@ -16,7 +16,7 @@ defmodule Pleroma.Web.ApiSpec.Admin.ChatOperation do def delete_message_operation do %Operation{ - tags: ["Admin", "Chats"], + tags: ["admin", "chat"], summary: "Delete an individual chat message", operationId: "AdminAPI.ChatController.delete", parameters: [id_param(), message_id_param()] ++ admin_api_params(), @@ -28,6 +28,30 @@ defmodule Pleroma.Web.ApiSpec.Admin.ChatOperation do } end + def messages_operation do + %Operation{ + tags: ["admin", "chat"], + summary: "Get the most recent messages of the chat", + operationId: "AdminAPI.ChatController.messages", + parameters: + [Operation.parameter(:id, :path, :string, "The ID of the Chat")] ++ + pagination_params(), + responses: %{ + 200 => + Operation.response( + "The messages in the chat", + "application/json", + Pleroma.Web.ApiSpec.ChatOperation.chat_messages_response() + ) + }, + security: [ + %{ + "oAuth" => ["read:chats"] + } + ] + } + end + def id_param do Operation.parameter(:id, :path, FlakeID, "Chat ID", example: "9umDrYheeY451cQnEe", diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index ad3282df4..02836114a 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -217,7 +217,7 @@ defmodule Pleroma.Web.Router do post("/media_proxy_caches/purge", MediaProxyCacheController, :purge) # get("/chats/:id", ChatController, :show) - # get("/chats/:id/messages", ChatController, :messages) + get("/chats/:id/messages", ChatController, :messages) delete("/chats/:id/messages/:message_id", ChatController, :delete_message) end diff --git a/test/web/admin_api/controllers/chat_controller_test.exs b/test/web/admin_api/controllers/chat_controller_test.exs index 4527437af..f61e2a1fa 100644 --- a/test/web/admin_api/controllers/chat_controller_test.exs +++ b/test/web/admin_api/controllers/chat_controller_test.exs @@ -8,9 +8,11 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do import Pleroma.Factory alias Pleroma.Activity + alias Pleroma.Chat alias Pleroma.Config alias Pleroma.ModerationLog alias Pleroma.Repo + alias Pleroma.Web.CommonAPI setup do admin = insert(:user, is_admin: true) @@ -50,4 +52,56 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} end end + + describe "GET /api/pleroma/admin/chats/:id/messages" do + test "it paginates", %{conn: conn} do + user = insert(:user) + recipient = insert(:user) + + Enum.each(1..30, fn _ -> + {:ok, _} = CommonAPI.post_chat_message(user, recipient, "hey") + end) + + chat = Chat.get(user.id, recipient.ap_id) + + result = + conn + |> get("/api/pleroma/admin/chats/#{chat.id}/messages") + |> json_response_and_validate_schema(200) + + assert length(result) == 20 + + result = + conn + |> get("/api/pleroma/admin/chats/#{chat.id}/messages?max_id=#{List.last(result)["id"]}") + |> json_response_and_validate_schema(200) + + assert length(result) == 10 + end + + test "it returns the messages for a given chat", %{conn: conn} do + user = insert(:user) + other_user = insert(:user) + third_user = insert(:user) + + {:ok, _} = CommonAPI.post_chat_message(user, other_user, "hey") + {:ok, _} = CommonAPI.post_chat_message(user, third_user, "hey") + {:ok, _} = CommonAPI.post_chat_message(user, other_user, "how are you?") + {:ok, _} = CommonAPI.post_chat_message(other_user, user, "fine, how about you?") + + chat = Chat.get(user.id, other_user.ap_id) + + result = + conn + |> get("/api/pleroma/admin/chats/#{chat.id}/messages") + |> json_response_and_validate_schema(200) + + result + |> Enum.each(fn message -> + assert message["chat_id"] == chat.id |> to_string() + end) + + assert length(result) == 3 + end + end end From 9dd0b23da424c380a37897d8bf69ab241efa6f91 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Tue, 1 Sep 2020 19:49:46 -0500 Subject: [PATCH 106/182] AdminAPI: show chat --- .../admin_api/controllers/chat_controller.ex | 11 ++++++- .../operations/admin/chat_operation.ex | 32 +++++++++++++++++++ lib/pleroma/web/router.ex | 2 +- .../controllers/chat_controller_test.exs | 16 ++++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/admin_api/controllers/chat_controller.ex b/lib/pleroma/web/admin_api/controllers/chat_controller.ex index b423188d7..ac362c430 100644 --- a/lib/pleroma/web/admin_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/chat_controller.ex @@ -13,6 +13,7 @@ defmodule Pleroma.Web.AdminAPI.ChatController do alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Web.CommonAPI alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView + alias Pleroma.Web.PleromaAPI.ChatView require Logger @@ -20,7 +21,7 @@ defmodule Pleroma.Web.AdminAPI.ChatController do plug( OAuthScopesPlug, - %{scopes: ["read:chats"], admin: true} when action in [:messages] + %{scopes: ["read:chats"], admin: true} when action in [:show, :messages] ) plug( @@ -61,4 +62,12 @@ defmodule Pleroma.Web.AdminAPI.ChatController do |> json(%{error: "not found"}) end end + + def show(conn, %{id: id}) do + with %Chat{} = chat <- Chat.get_by_id(id) do + conn + |> put_view(ChatView) + |> render("show.json", chat: chat) + end + end end diff --git a/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex b/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex index a382bd35a..3550d531e 100644 --- a/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex @@ -5,6 +5,7 @@ defmodule Pleroma.Web.ApiSpec.Admin.ChatOperation do alias OpenApiSpex.Operation alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.Chat alias Pleroma.Web.ApiSpec.Schemas.FlakeID import Pleroma.Web.ApiSpec.Helpers @@ -52,6 +53,37 @@ defmodule Pleroma.Web.ApiSpec.Admin.ChatOperation do } end + def show_operation do + %Operation{ + tags: ["chat"], + summary: "Create a chat", + operationId: "AdminAPI.ChatController.show", + parameters: [ + Operation.parameter( + :id, + :path, + :string, + "The id of the chat", + required: true, + example: "1234" + ) + ], + responses: %{ + 200 => + Operation.response( + "The existing chat", + "application/json", + Chat + ) + }, + security: [ + %{ + "oAuth" => ["read"] + } + ] + } + end + def id_param do Operation.parameter(:id, :path, FlakeID, "Chat ID", example: "9umDrYheeY451cQnEe", diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 02836114a..e4440d442 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -216,7 +216,7 @@ defmodule Pleroma.Web.Router do post("/media_proxy_caches/delete", MediaProxyCacheController, :delete) post("/media_proxy_caches/purge", MediaProxyCacheController, :purge) - # get("/chats/:id", ChatController, :show) + get("/chats/:id", ChatController, :show) get("/chats/:id/messages", ChatController, :messages) delete("/chats/:id/messages/:message_id", ChatController, :delete_message) end diff --git a/test/web/admin_api/controllers/chat_controller_test.exs b/test/web/admin_api/controllers/chat_controller_test.exs index f61e2a1fa..63c195b99 100644 --- a/test/web/admin_api/controllers/chat_controller_test.exs +++ b/test/web/admin_api/controllers/chat_controller_test.exs @@ -104,4 +104,20 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do assert length(result) == 3 end end + + describe "GET /api/pleroma/admin/chats/:id" do + test "it returns a chat", %{conn: conn} do + user = insert(:user) + other_user = insert(:user) + + {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + + result = + conn + |> get("/api/pleroma/admin/chats/#{chat.id}") + |> json_response_and_validate_schema(200) + + assert result["id"] == to_string(chat.id) + end + end end From 02d70228b566d5de2cbdd6d1f9958caf2db173f1 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Tue, 1 Sep 2020 20:40:36 -0500 Subject: [PATCH 107/182] AdminAPI: fix delete chat message --- .../admin_api/controllers/chat_controller.ex | 20 ++++++++-- .../operations/admin/chat_operation.ex | 40 +++++++++---------- .../controllers/chat_controller_test.exs | 39 ++++++++++-------- 3 files changed, 56 insertions(+), 43 deletions(-) diff --git a/lib/pleroma/web/admin_api/controllers/chat_controller.ex b/lib/pleroma/web/admin_api/controllers/chat_controller.ex index ac362c430..61d45b970 100644 --- a/lib/pleroma/web/admin_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/chat_controller.ex @@ -33,15 +33,27 @@ defmodule Pleroma.Web.AdminAPI.ChatController do defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.ChatOperation - def delete_message(%{assigns: %{user: user}} = conn, %{message_id: id}) do - with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do + def delete_message(%{assigns: %{user: user}} = conn, %{ + message_id: message_id, + id: chat_id + }) do + with %MessageReference{object: %{data: %{"id" => object_ap_id}}} = cm_ref <- + MessageReference.get_by_id(message_id), + ^chat_id <- to_string(cm_ref.chat_id), + %Activity{id: activity_id} <- Activity.get_create_by_object_ap_id(object_ap_id), + {:ok, _} <- CommonAPI.delete(activity_id, user) do ModerationLog.insert_log(%{ action: "chat_message_delete", actor: user, - subject_id: id + subject_id: message_id }) - json(conn, %{}) + conn + |> put_view(MessageReferenceView) + |> render("show.json", chat_message_reference: cm_ref) + else + _e -> + {:error, :could_not_delete} end end diff --git a/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex b/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex index 3550d531e..d3e5dfc1c 100644 --- a/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/admin/chat_operation.ex @@ -4,9 +4,8 @@ defmodule Pleroma.Web.ApiSpec.Admin.ChatOperation do alias OpenApiSpex.Operation - alias Pleroma.Web.ApiSpec.Schemas.ApiError alias Pleroma.Web.ApiSpec.Schemas.Chat - alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.Schemas.ChatMessage import Pleroma.Web.ApiSpec.Helpers @@ -19,13 +18,24 @@ defmodule Pleroma.Web.ApiSpec.Admin.ChatOperation do %Operation{ tags: ["admin", "chat"], summary: "Delete an individual chat message", - operationId: "AdminAPI.ChatController.delete", - parameters: [id_param(), message_id_param()] ++ admin_api_params(), - security: [%{"oAuth" => ["write:chats"]}], + operationId: "AdminAPI.ChatController.delete_message", + parameters: [ + Operation.parameter(:id, :path, :string, "The ID of the Chat"), + Operation.parameter(:message_id, :path, :string, "The ID of the message") + ], responses: %{ - 200 => empty_object_response(), - 404 => Operation.response("Not Found", "application/json", ApiError) - } + 200 => + Operation.response( + "The deleted ChatMessage", + "application/json", + ChatMessage + ) + }, + security: [ + %{ + "oAuth" => ["write:chats"] + } + ] } end @@ -83,18 +93,4 @@ defmodule Pleroma.Web.ApiSpec.Admin.ChatOperation do ] } end - - def id_param do - Operation.parameter(:id, :path, FlakeID, "Chat ID", - example: "9umDrYheeY451cQnEe", - required: true - ) - end - - def message_id_param do - Operation.parameter(:message_id, :path, FlakeID, "Chat message ID", - example: "9umDrYheeY451cQnEe", - required: true - ) - end end diff --git a/test/web/admin_api/controllers/chat_controller_test.exs b/test/web/admin_api/controllers/chat_controller_test.exs index 63c195b99..9393dd49b 100644 --- a/test/web/admin_api/controllers/chat_controller_test.exs +++ b/test/web/admin_api/controllers/chat_controller_test.exs @@ -7,9 +7,10 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do import Pleroma.Factory - alias Pleroma.Activity alias Pleroma.Chat + alias Pleroma.Chat.MessageReference alias Pleroma.Config + alias Pleroma.Object alias Pleroma.ModerationLog alias Pleroma.Repo alias Pleroma.Web.CommonAPI @@ -27,29 +28,33 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do end describe "DELETE /api/pleroma/admin/chats/:id/messages/:message_id" do - setup do - chat = insert(:chat) - message = insert(:chat_message_activity, chat: chat) - %{chat: chat, message: message} - end + test "it deletes a message from the chat", %{conn: conn, admin: admin} do + user = insert(:user) + recipient = insert(:user) - test "deletes chat message", %{conn: conn, chat: chat, message: message, admin: admin} do - conn - |> delete("/api/pleroma/admin/chats/#{chat.id}/messages/#{message.id}") - |> json_response_and_validate_schema(:ok) + {:ok, message} = + CommonAPI.post_chat_message(user, recipient, "Hello darkness my old friend") - refute Activity.get_by_id(message.id) + object = Object.normalize(message, false) + + chat = Chat.get(user.id, recipient.ap_id) + + cm_ref = MessageReference.for_chat_and_object(chat, object) + + result = + conn + |> put_req_header("content-type", "application/json") + |> delete("/api/pleroma/admin/chats/#{chat.id}/messages/#{cm_ref.id}") + |> json_response_and_validate_schema(200) log_entry = Repo.one(ModerationLog) assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} deleted chat message ##{message.id}" - end + "@#{admin.nickname} deleted chat message ##{cm_ref.id}" - test "returns 404 when the chat message does not exist", %{conn: conn} do - conn = delete(conn, "/api/pleroma/admin/chats/test/messages/test") - - assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} + assert result["id"] == cm_ref.id + refute MessageReference.get_by_id(cm_ref.id) + assert %{data: %{"type" => "Tombstone"}} = Object.get_by_id(object.id) end end From c361df11b4e31bc6b369a4feebdbaa82987c2eec Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Tue, 1 Sep 2020 20:56:42 -0500 Subject: [PATCH 108/182] Docs: AdminAPI chat moderation --- docs/API/admin_api.md | 111 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/docs/API/admin_api.md b/docs/API/admin_api.md index c0ea074f0..7bdbd17aa 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -1334,3 +1334,114 @@ Loads json generated from `config/descriptions.exs`. { } ``` + +## GET /api/pleroma/admin/users/:nickname/chats + +### List a user's chats + +- Params: None + +- Response: + +```json +[ + { + "account": { + "id": "someflakeid", + "username": "somenick", + ... + }, + "id" : "1", + "unread" : 2, + "last_message" : {...}, // The last message in that chat + "updated_at": "2020-04-21T15:11:46.000Z" + } +] +``` + +## GET /api/pleroma/admin/chats/:chat_id + +### View a single chat + +- Params: None + +- Response: + +```json +{ + "account": { + "id": "someflakeid", + "username": "somenick", + ... + }, + "id" : "1", + "unread" : 2, + "last_message" : {...}, // The last message in that chat + "updated_at": "2020-04-21T15:11:46.000Z" +} +``` + +## GET /api/pleroma/admin/chats/:chat_id/messages + +### List the messages in a chat + +- Params: None + +- Response: + +```json +[ + { + "account_id": "someflakeid", + "chat_id": "1", + "content": "Check this out :firefox:", + "created_at": "2020-04-21T15:11:46.000Z", + "emojis": [ + { + "shortcode": "firefox", + "static_url": "https://dontbulling.me/emoji/Firefox.gif", + "url": "https://dontbulling.me/emoji/Firefox.gif", + "visible_in_picker": false + } + ], + "id": "13", + "unread": true + }, + { + "account_id": "someflakeid", + "chat_id": "1", + "content": "Whats' up?", + "created_at": "2020-04-21T15:06:45.000Z", + "emojis": [], + "id": "12", + "unread": false + } +] +``` + +## DELETE /api/pleroma/admin/chats/:chat_id/messages/:message_id + +### Delete a single message + +- Params: None + +- Response: + +```json +{ + "account_id": "someflakeid", + "chat_id": "1", + "content": "Check this out :firefox:", + "created_at": "2020-04-21T15:11:46.000Z", + "emojis": [ + { + "shortcode": "firefox", + "static_url": "https://dontbulling.me/emoji/Firefox.gif", + "url": "https://dontbulling.me/emoji/Firefox.gif", + "visible_in_picker": false + } + ], + "id": "13", + "unread": false +} +``` From 67726453f85eb5bb51bf82e7decf23a4f1d184af Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Tue, 1 Sep 2020 21:12:21 -0500 Subject: [PATCH 109/182] Credo fix --- test/web/admin_api/controllers/chat_controller_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/web/admin_api/controllers/chat_controller_test.exs b/test/web/admin_api/controllers/chat_controller_test.exs index 9393dd49b..bca9d440d 100644 --- a/test/web/admin_api/controllers/chat_controller_test.exs +++ b/test/web/admin_api/controllers/chat_controller_test.exs @@ -10,8 +10,8 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do alias Pleroma.Chat alias Pleroma.Chat.MessageReference alias Pleroma.Config - alias Pleroma.Object alias Pleroma.ModerationLog + alias Pleroma.Object alias Pleroma.Repo alias Pleroma.Web.CommonAPI From e229536e5cca65d811f85d25c86bf3c92b3d8c45 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 10 Sep 2020 01:44:32 -0500 Subject: [PATCH 110/182] Chat Moderation: use explicit `sender` and `recipient` fields --- docs/API/admin_api.md | 14 +++++++-- .../controllers/admin_api_controller.ex | 5 +--- .../admin_api/controllers/chat_controller.ex | 4 +-- lib/pleroma/web/admin_api/views/chat_view.ex | 30 +++++++++++++++++++ .../controllers/chat_controller_test.exs | 3 ++ 5 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 lib/pleroma/web/admin_api/views/chat_view.ex diff --git a/docs/API/admin_api.md b/docs/API/admin_api.md index 7bdbd17aa..eadb455ee 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -1346,7 +1346,12 @@ Loads json generated from `config/descriptions.exs`. ```json [ { - "account": { + "sender": { + "id": "someflakeid", + "username": "somenick", + ... + }, + "receiver": { "id": "someflakeid", "username": "somenick", ... @@ -1369,7 +1374,12 @@ Loads json generated from `config/descriptions.exs`. ```json { - "account": { + "sender": { + "id": "someflakeid", + "username": "somenick", + ... + }, + "receiver": { "id": "someflakeid", "username": "somenick", ... diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index fccdbabb4..d5713c3dd 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -21,11 +21,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do alias Pleroma.Web.AdminAPI.ModerationLogView alias Pleroma.Web.AdminAPI.Search alias Pleroma.Web.Endpoint - alias Pleroma.Web.PleromaAPI alias Pleroma.Web.Router - require Logger - @users_page_size 50 plug( @@ -270,7 +267,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do |> Pleroma.Repo.all() conn - |> put_view(PleromaAPI.ChatView) + |> put_view(AdminAPI.ChatView) |> render("index.json", chats: chats) else _ -> {:error, :not_found} diff --git a/lib/pleroma/web/admin_api/controllers/chat_controller.ex b/lib/pleroma/web/admin_api/controllers/chat_controller.ex index 61d45b970..967600d69 100644 --- a/lib/pleroma/web/admin_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/chat_controller.ex @@ -11,9 +11,9 @@ defmodule Pleroma.Web.AdminAPI.ChatController do alias Pleroma.ModerationLog alias Pleroma.Pagination alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.AdminAPI alias Pleroma.Web.CommonAPI alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView - alias Pleroma.Web.PleromaAPI.ChatView require Logger @@ -78,7 +78,7 @@ defmodule Pleroma.Web.AdminAPI.ChatController do def show(conn, %{id: id}) do with %Chat{} = chat <- Chat.get_by_id(id) do conn - |> put_view(ChatView) + |> put_view(AdminAPI.ChatView) |> render("show.json", chat: chat) end end diff --git a/lib/pleroma/web/admin_api/views/chat_view.ex b/lib/pleroma/web/admin_api/views/chat_view.ex new file mode 100644 index 000000000..847df1423 --- /dev/null +++ b/lib/pleroma/web/admin_api/views/chat_view.ex @@ -0,0 +1,30 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.ChatView do + use Pleroma.Web, :view + + alias Pleroma.Chat + alias Pleroma.User + alias Pleroma.Web.MastodonAPI + alias Pleroma.Web.PleromaAPI + + def render("index.json", %{chats: chats} = opts) do + render_many(chats, __MODULE__, "show.json", Map.delete(opts, :chats)) + end + + def render("show.json", %{chat: %Chat{user_id: user_id}} = opts) do + user = User.get_by_id(user_id) + sender = MastodonAPI.AccountView.render("show.json", user: user, skip_visibility_check: true) + + serialized_chat = PleromaAPI.ChatView.render("show.json", opts) + + serialized_chat + |> Map.put(:sender, sender) + |> Map.put(:receiver, serialized_chat[:account]) + |> Map.delete(:account) + end + + def render(view, opts), do: PleromaAPI.ChatView.render(view, opts) +end diff --git a/test/web/admin_api/controllers/chat_controller_test.exs b/test/web/admin_api/controllers/chat_controller_test.exs index bca9d440d..840f18aa2 100644 --- a/test/web/admin_api/controllers/chat_controller_test.exs +++ b/test/web/admin_api/controllers/chat_controller_test.exs @@ -123,6 +123,9 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do |> json_response_and_validate_schema(200) assert result["id"] == to_string(chat.id) + assert %{} = result["sender"] + assert %{} = result["receiver"] + refute result["account"] end end end From dfb831ca39db3098d6d585448a6ff8e938e51e8c Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 11 Sep 2020 14:00:34 -0500 Subject: [PATCH 111/182] Chat moderation: add tests for unauthorized access --- docs/API/admin_api.md | 2 +- .../controllers/admin_api_controller_test.exs | 29 +++++++ .../controllers/chat_controller_test.exs | 80 ++++++++++++++++++- 3 files changed, 109 insertions(+), 2 deletions(-) diff --git a/docs/API/admin_api.md b/docs/API/admin_api.md index eadb455ee..bc96abbf0 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -1395,7 +1395,7 @@ Loads json generated from `config/descriptions.exs`. ### List the messages in a chat -- Params: None +- Params: `max_id`, `min_id` - Response: diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs index cf5637246..dbeeb7f3d 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -1528,6 +1528,35 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do end end + describe "GET /api/pleroma/admin/users/:nickname/chats unauthorized" do + setup do + user = insert(:user) + insert(:chat, user: user) + %{conn: conn} = oauth_access(["read:chats"]) + %{conn: conn, user: user} + end + + test "returns 403", %{conn: conn, user: user} do + conn + |> get("/api/pleroma/admin/users/#{user.nickname}/chats") + |> json_response(403) + end + end + + describe "GET /api/pleroma/admin/users/:nickname/chats unauthenticated" do + setup do + user = insert(:user) + insert(:chat, user: user) + %{conn: build_conn(), user: user} + end + + test "returns 403", %{conn: conn, user: user} do + conn + |> get("/api/pleroma/admin/users/#{user.nickname}/chats") + |> json_response(403) + end + end + describe "GET /api/pleroma/admin/moderation_log" do setup do moderator = insert(:user, is_moderator: true) diff --git a/test/web/admin_api/controllers/chat_controller_test.exs b/test/web/admin_api/controllers/chat_controller_test.exs index 840f18aa2..ccca3521a 100644 --- a/test/web/admin_api/controllers/chat_controller_test.exs +++ b/test/web/admin_api/controllers/chat_controller_test.exs @@ -15,7 +15,7 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do alias Pleroma.Repo alias Pleroma.Web.CommonAPI - setup do + defp admin_setup do admin = insert(:user, is_admin: true) token = insert(:oauth_admin_token, user: admin) @@ -28,6 +28,8 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do end describe "DELETE /api/pleroma/admin/chats/:id/messages/:message_id" do + setup do: admin_setup() + test "it deletes a message from the chat", %{conn: conn, admin: admin} do user = insert(:user) recipient = insert(:user) @@ -59,6 +61,8 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do end describe "GET /api/pleroma/admin/chats/:id/messages" do + setup do: admin_setup() + test "it paginates", %{conn: conn} do user = insert(:user) recipient = insert(:user) @@ -111,6 +115,8 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do end describe "GET /api/pleroma/admin/chats/:id" do + setup do: admin_setup() + test "it returns a chat", %{conn: conn} do user = insert(:user) other_user = insert(:user) @@ -128,4 +134,76 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do refute result["account"] end end + + describe "unauthorized chat moderation" do + setup do + user = insert(:user) + recipient = insert(:user) + + {:ok, message} = CommonAPI.post_chat_message(user, recipient, "Yo") + object = Object.normalize(message, false) + chat = Chat.get(user.id, recipient.ap_id) + cm_ref = MessageReference.for_chat_and_object(chat, object) + + %{conn: conn} = oauth_access(["read:chats", "write:chats"]) + %{conn: conn, chat: chat, cm_ref: cm_ref} + end + + test "DELETE /api/pleroma/admin/chats/:id/messages/:message_id", %{conn: conn, chat: chat, cm_ref: cm_ref} do + conn + |> put_req_header("content-type", "application/json") + |> delete("/api/pleroma/admin/chats/#{chat.id}/messages/#{cm_ref.id}") + |> json_response(403) + + assert MessageReference.get_by_id(cm_ref.id) == cm_ref + end + + test "GET /api/pleroma/admin/chats/:id/messages", %{conn: conn, chat: chat} do + conn + |> get("/api/pleroma/admin/chats/#{chat.id}/messages") + |> json_response(403) + end + + test "GET /api/pleroma/admin/chats/:id", %{conn: conn, chat: chat} do + conn + |> get("/api/pleroma/admin/chats/#{chat.id}") + |> json_response(403) + end + end + + describe "unauthenticated chat moderation" do + setup do + user = insert(:user) + recipient = insert(:user) + + {:ok, message} = CommonAPI.post_chat_message(user, recipient, "Yo") + object = Object.normalize(message, false) + chat = Chat.get(user.id, recipient.ap_id) + cm_ref = MessageReference.for_chat_and_object(chat, object) + + %{conn: build_conn(), chat: chat, cm_ref: cm_ref} + end + + test "DELETE /api/pleroma/admin/chats/:id/messages/:message_id", %{conn: conn, chat: chat, cm_ref: cm_ref} do + conn + |> put_req_header("content-type", "application/json") + |> delete("/api/pleroma/admin/chats/#{chat.id}/messages/#{cm_ref.id}") + |> json_response(403) + + assert MessageReference.get_by_id(cm_ref.id) == cm_ref + end + + test "GET /api/pleroma/admin/chats/:id/messages", %{conn: conn, chat: chat} do + conn + |> get("/api/pleroma/admin/chats/#{chat.id}/messages") + |> json_response(403) + end + + test "GET /api/pleroma/admin/chats/:id", %{conn: conn, chat: chat} do + conn + |> get("/api/pleroma/admin/chats/#{chat.id}") + |> json_response(403) + end + end + end From bc86d0a906e58becb94c5a73552f90abbe494c28 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 11 Sep 2020 14:29:56 -0500 Subject: [PATCH 112/182] Chat moderation: fix formatting --- .../admin_api/controllers/chat_controller_test.exs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/test/web/admin_api/controllers/chat_controller_test.exs b/test/web/admin_api/controllers/chat_controller_test.exs index ccca3521a..e81484ce6 100644 --- a/test/web/admin_api/controllers/chat_controller_test.exs +++ b/test/web/admin_api/controllers/chat_controller_test.exs @@ -149,7 +149,11 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do %{conn: conn, chat: chat, cm_ref: cm_ref} end - test "DELETE /api/pleroma/admin/chats/:id/messages/:message_id", %{conn: conn, chat: chat, cm_ref: cm_ref} do + test "DELETE /api/pleroma/admin/chats/:id/messages/:message_id", %{ + conn: conn, + chat: chat, + cm_ref: cm_ref + } do conn |> put_req_header("content-type", "application/json") |> delete("/api/pleroma/admin/chats/#{chat.id}/messages/#{cm_ref.id}") @@ -184,7 +188,11 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do %{conn: build_conn(), chat: chat, cm_ref: cm_ref} end - test "DELETE /api/pleroma/admin/chats/:id/messages/:message_id", %{conn: conn, chat: chat, cm_ref: cm_ref} do + test "DELETE /api/pleroma/admin/chats/:id/messages/:message_id", %{ + conn: conn, + chat: chat, + cm_ref: cm_ref + } do conn |> put_req_header("content-type", "application/json") |> delete("/api/pleroma/admin/chats/#{chat.id}/messages/#{cm_ref.id}") @@ -205,5 +213,4 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do |> json_response(403) end end - end From 40c847dc2a33bcd4bb6776d500cb73d6fa5ff052 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Fri, 11 Sep 2020 17:42:39 -0500 Subject: [PATCH 113/182] Spelling Reported by: trevoke --- docs/configuration/cheatsheet.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 7cf1d1ce7..0c5d17ce3 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -18,7 +18,7 @@ To add configuration to your config file, you can copy it from the base config. * `notify_email`: Email used for notifications. * `description`: The instance’s description, can be seen in nodeinfo and ``/api/v1/instance``. * `limit`: Posts character limit (CW/Subject included in the counter). -* `discription_limit`: The character limit for image descriptions. +* `description_limit`: The character limit for image descriptions. * `chat_limit`: Character limit of the instance chat messages. * `remote_limit`: Hard character limit beyond which remote posts will be dropped. * `upload_limit`: File size limit of uploads (except for avatar, background, banner). From 6877bad44cccff807cf8d1426c26ab80a6ea0244 Mon Sep 17 00:00:00 2001 From: tarteka Date: Fri, 11 Sep 2020 18:24:59 +0000 Subject: [PATCH 114/182] Translated using Weblate (Spanish) Currently translated at 20.7% (22 of 106 strings) Translation: Pleroma/Pleroma backend Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma/es/ --- priv/gettext/es/LC_MESSAGES/errors.po | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/priv/gettext/es/LC_MESSAGES/errors.po b/priv/gettext/es/LC_MESSAGES/errors.po index ba75936a9..0a6fceaad 100644 --- a/priv/gettext/es/LC_MESSAGES/errors.po +++ b/priv/gettext/es/LC_MESSAGES/errors.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-09-09 09:49+0000\n" -"PO-Revision-Date: 2020-09-09 10:52+0000\n" +"PO-Revision-Date: 2020-09-11 21:26+0000\n" "Last-Translator: tarteka \n" "Language-Team: Spanish \n" @@ -94,52 +94,52 @@ msgid "must be less than %{number}" msgstr "" msgid "must be greater than %{number}" -msgstr "" +msgstr "debe ser mayor que %{number}" msgid "must be less than or equal to %{number}" -msgstr "" +msgstr "debe ser menor o igual que %{number}" msgid "must be greater than or equal to %{number}" -msgstr "" +msgstr "deber ser mayor o igual que %{number}" msgid "must be equal to %{number}" -msgstr "" +msgstr "deber ser igual a %{number}" #: lib/pleroma/web/common_api/common_api.ex:505 #, elixir-format msgid "Account not found" -msgstr "" +msgstr "Cuenta no encontrada" #: lib/pleroma/web/common_api/common_api.ex:339 #, elixir-format msgid "Already voted" -msgstr "" +msgstr "Ya has votado" #: lib/pleroma/web/oauth/oauth_controller.ex:359 #, elixir-format msgid "Bad request" -msgstr "" +msgstr "Solicitud incorrecta" #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:426 #, elixir-format msgid "Can't delete object" -msgstr "" +msgstr "No se puede eliminar el objeto" #: lib/pleroma/web/controller_helper.ex:105 #: lib/pleroma/web/controller_helper.ex:111 #, elixir-format msgid "Can't display this activity" -msgstr "" +msgstr "No se puede mostrar esta actividad" #: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:285 #, elixir-format msgid "Can't find user" -msgstr "" +msgstr "No se puede encontrar al usuario" #: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:61 #, elixir-format msgid "Can't get favorites" -msgstr "" +msgstr "No se puede obtener los favoritos" #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:438 #, elixir-format @@ -149,7 +149,7 @@ msgstr "" #: lib/pleroma/web/common_api/utils.ex:563 #, elixir-format msgid "Cannot post an empty status without attachments" -msgstr "" +msgstr "No se puede publicar un estado vacío y sin archivos adjuntos" #: lib/pleroma/web/common_api/utils.ex:511 #, elixir-format From c0b36621f1149734e97f268e267202cc53700abb Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Fri, 11 Sep 2020 16:59:45 -0500 Subject: [PATCH 115/182] Ensure we only apply NSFW Simple policy on parsable objects --- lib/pleroma/web/activity_pub/mrf/simple_policy.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex index bb193475a..161177727 100644 --- a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex @@ -66,7 +66,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do "type" => "Create", "object" => child_object } = object - ) do + ) + when is_map(child_object) do media_nsfw = Config.get([:mrf_simple, :media_nsfw]) |> MRF.subdomains_regex() From 32831f371ff426ac0c6f5d6c1381313f5f92af42 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Sat, 12 Sep 2020 10:33:42 +0300 Subject: [PATCH 116/182] [#2497] Media preview proxy: redirecting to media proxy url in case of preview error or unsupported content type. --- .../web/media_proxy/media_proxy_controller.ex | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index ff7fd2409..08d62a51a 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -91,8 +91,8 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do handle_video_preview(conn, media_proxy_url) end - defp handle_preview(content_type, conn, _media_proxy_url) do - send_resp(conn, :unprocessable_entity, "Unsupported content type: #{content_type}.") + defp handle_preview(_unsupported_content_type, conn, media_proxy_url) do + fallback_on_preview_error(conn, media_proxy_url) end defp handle_png_preview(conn, media_proxy_url) do @@ -114,7 +114,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do |> send_resp(200, thumbnail_binary) else _ -> - send_resp(conn, :failed_dependency, "Can't handle preview.") + fallback_on_preview_error(conn, media_proxy_url) end end @@ -132,7 +132,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do |> send_resp(200, thumbnail_binary) else _ -> - send_resp(conn, :failed_dependency, "Can't handle preview.") + fallback_on_preview_error(conn, media_proxy_url) end end @@ -144,10 +144,14 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do |> send_resp(200, thumbnail_binary) else _ -> - send_resp(conn, :failed_dependency, "Can't handle preview.") + fallback_on_preview_error(conn, media_proxy_url) end end + defp fallback_on_preview_error(conn, media_proxy_url) do + redirect(conn, external: media_proxy_url) + end + defp put_preview_response_headers( conn, [content_type, filename] = _content_info \\ ["image/jpeg", "preview.jpg"] From cd234a5321b9d33146b90be95d84fa67aa4f7707 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Sat, 12 Sep 2020 11:20:41 +0300 Subject: [PATCH 117/182] [#2497] Media preview proxy: preview bypass for small images (basing on Content-Length and Content-Type). --- .../web/media_proxy/media_proxy_controller.ex | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 08d62a51a..78df7763e 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -11,6 +11,8 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do alias Pleroma.Web.MediaProxy alias Plug.Conn + @min_content_length_for_preview 100 * 1024 + def remote(conn, %{"sig" => sig64, "url" => url64}) do with {_, true} <- {:enabled, MediaProxy.enabled?()}, {:ok, url} <- MediaProxy.decode_url(sig64, url64), @@ -54,8 +56,12 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do with {:ok, %{status: status} = head_response} when status in 200..299 <- Pleroma.HTTP.request("head", media_proxy_url, [], [], pool: :media) do content_type = Tesla.get_header(head_response, "content-type") - handle_preview(content_type, conn, media_proxy_url) + content_length = Tesla.get_header(head_response, "content-length") + content_length = content_length && String.to_integer(content_length) + + handle_preview(content_type, content_length, conn, media_proxy_url) else + # If HEAD failed, redirecting to media proxy URI doesn't make much sense; returning an error {_, %{status: status}} -> send_resp(conn, :failed_dependency, "Can't fetch HTTP headers (HTTP #{status}).") @@ -69,29 +75,36 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do defp handle_preview( "image/" <> _ = _content_type, + _content_length, %{params: %{"output_format" => "jpeg"}} = conn, media_proxy_url ) do handle_jpeg_preview(conn, media_proxy_url) end - defp handle_preview("image/gif" = _content_type, conn, media_proxy_url) do + defp handle_preview("image/gif" = _content_type, _content_length, conn, media_proxy_url) do redirect(conn, external: media_proxy_url) end - defp handle_preview("image/png" <> _ = _content_type, conn, media_proxy_url) do + defp handle_preview("image/" <> _ = _content_type, content_length, conn, media_proxy_url) + when is_integer(content_length) and content_length > 0 and + content_length < @min_content_length_for_preview do + redirect(conn, external: media_proxy_url) + end + + defp handle_preview("image/png" <> _ = _content_type, _content_length, conn, media_proxy_url) do handle_png_preview(conn, media_proxy_url) end - defp handle_preview("image/" <> _ = _content_type, conn, media_proxy_url) do + defp handle_preview("image/" <> _ = _content_type, _content_length, conn, media_proxy_url) do handle_jpeg_preview(conn, media_proxy_url) end - defp handle_preview("video/" <> _ = _content_type, conn, media_proxy_url) do + defp handle_preview("video/" <> _ = _content_type, _content_length, conn, media_proxy_url) do handle_video_preview(conn, media_proxy_url) end - defp handle_preview(_unsupported_content_type, conn, media_proxy_url) do + defp handle_preview(_unsupported_content_type, _content_length, conn, media_proxy_url) do fallback_on_preview_error(conn, media_proxy_url) end From 65f4e37ee1f47ff2f160eb56facef4c783a6828c Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Sun, 13 Sep 2020 10:04:50 +0300 Subject: [PATCH 118/182] remove old workers in oban migrations --- .../20200825061316_move_activity_expirations_to_oban.exs | 2 ++ .../20200907092050_move_tokens_expiration_into_oban.exs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs b/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs index cdc00d20b..a703af83f 100644 --- a/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs +++ b/priv/repo/migrations/20200825061316_move_activity_expirations_to_oban.exs @@ -4,6 +4,8 @@ defmodule Pleroma.Repo.Migrations.MoveActivityExpirationsToOban do import Ecto.Query, only: [from: 2] def change do + Pleroma.Config.Oban.warn() + Supervisor.start_link([{Oban, Pleroma.Config.get(Oban)}], strategy: :one_for_one, name: Pleroma.Supervisor diff --git a/priv/repo/migrations/20200907092050_move_tokens_expiration_into_oban.exs b/priv/repo/migrations/20200907092050_move_tokens_expiration_into_oban.exs index 832bd02a7..9e49ddacb 100644 --- a/priv/repo/migrations/20200907092050_move_tokens_expiration_into_oban.exs +++ b/priv/repo/migrations/20200907092050_move_tokens_expiration_into_oban.exs @@ -4,6 +4,8 @@ defmodule Pleroma.Repo.Migrations.MoveTokensExpirationIntoOban do import Ecto.Query, only: [from: 2] def change do + Pleroma.Config.Oban.warn() + Supervisor.start_link([{Oban, Pleroma.Config.get(Oban)}], strategy: :one_for_one, name: Pleroma.Supervisor From 3e53ab4e98e6294f593f2185998f555ccd6fee73 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Mon, 14 Sep 2020 14:08:12 +0300 Subject: [PATCH 119/182] added notification constraints --- .../migration_helper/notification_backfill.ex | 15 +++++----- lib/pleroma/repo.ex | 9 ++++-- ...8_delete_notification_without_activity.exs | 30 +++++++++++++++++++ ...914105800_add_notification_constraints.exs | 23 ++++++++++++++ 4 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 priv/repo/migrations/20200914105638_delete_notification_without_activity.exs create mode 100644 priv/repo/migrations/20200914105800_add_notification_constraints.exs diff --git a/lib/pleroma/migration_helper/notification_backfill.ex b/lib/pleroma/migration_helper/notification_backfill.ex index d260e62ca..24f4733fe 100644 --- a/lib/pleroma/migration_helper/notification_backfill.ex +++ b/lib/pleroma/migration_helper/notification_backfill.ex @@ -19,13 +19,13 @@ defmodule Pleroma.MigrationHelper.NotificationBackfill do query |> Repo.chunk_stream(100) |> Enum.each(fn notification -> - type = - notification.activity - |> type_from_activity() + if notification.activity do + type = type_from_activity(notification.activity) - notification - |> Ecto.Changeset.change(%{type: type}) - |> Repo.update() + notification + |> Ecto.Changeset.change(%{type: type}) + |> Repo.update() + end end) end @@ -72,8 +72,7 @@ defmodule Pleroma.MigrationHelper.NotificationBackfill do "pleroma:emoji_reaction" "Create" -> - activity - |> type_from_activity_object() + type_from_activity_object(activity) t -> raise "No notification type for activity type #{t}" diff --git a/lib/pleroma/repo.ex b/lib/pleroma/repo.ex index f317e4d58..a75610879 100644 --- a/lib/pleroma/repo.ex +++ b/lib/pleroma/repo.ex @@ -49,7 +49,7 @@ defmodule Pleroma.Repo do end end - def chunk_stream(query, chunk_size) do + def chunk_stream(query, chunk_size, returns_as \\ :one) do # We don't actually need start and end funcitons of resource streaming, # but it seems to be the only way to not fetch records one-by-one and # have individual records be the elements of the stream, instead of @@ -69,7 +69,12 @@ defmodule Pleroma.Repo do records -> last_id = List.last(records).id - {records, last_id} + + if returns_as == :one do + {records, last_id} + else + {[records], last_id} + end end end, fn _ -> :ok end diff --git a/priv/repo/migrations/20200914105638_delete_notification_without_activity.exs b/priv/repo/migrations/20200914105638_delete_notification_without_activity.exs new file mode 100644 index 000000000..f5b339101 --- /dev/null +++ b/priv/repo/migrations/20200914105638_delete_notification_without_activity.exs @@ -0,0 +1,30 @@ +defmodule Pleroma.Repo.Migrations.DeleteNotificationWithoutActivity do + use Ecto.Migration + + import Ecto.Query + alias Pleroma.Repo + + def up do + from( + q in Pleroma.Notification, + left_join: c in assoc(q, :activity), + select: %{id: type(q.id, :integer)}, + where: is_nil(c.id) + ) + |> Repo.chunk_stream(1_000, :bacthes) + |> Stream.each(fn records -> + notification_ids = Enum.map(records, fn %{id: id} -> id end) + + Repo.delete_all( + from(n in "notifications", + where: n.id in ^notification_ids + ) + ) + end) + |> Stream.run() + end + + def down do + :ok + end +end diff --git a/priv/repo/migrations/20200914105800_add_notification_constraints.exs b/priv/repo/migrations/20200914105800_add_notification_constraints.exs new file mode 100644 index 000000000..a65c35fd0 --- /dev/null +++ b/priv/repo/migrations/20200914105800_add_notification_constraints.exs @@ -0,0 +1,23 @@ +defmodule Pleroma.Repo.Migrations.AddNotificationConstraints do + use Ecto.Migration + + def up do + drop(constraint(:notifications, "notifications_activity_id_fkey")) + + alter table(:notifications) do + modify(:activity_id, references(:activities, type: :uuid, on_delete: :delete_all), + null: false + ) + end + end + + def down do + drop(constraint(:notifications, "notifications_activity_id_fkey")) + + alter table(:notifications) do + modify(:activity_id, references(:activities, type: :uuid, on_delete: :delete_all), + null: true + ) + end + end +end From f66a15c4a51e1c8f614b4c1609b2385a29762931 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Mon, 14 Sep 2020 14:44:25 +0300 Subject: [PATCH 120/182] RichMedia parser: do not set a cache TTL for unchanging errors --- lib/pleroma/web/rich_media/parser.ex | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/pleroma/web/rich_media/parser.ex b/lib/pleroma/web/rich_media/parser.ex index 5727fda18..ab8f35922 100644 --- a/lib/pleroma/web/rich_media/parser.ex +++ b/lib/pleroma/web/rich_media/parser.ex @@ -36,6 +36,14 @@ defmodule Pleroma.Web.RichMedia.Parser do {:ok, _data} = res -> res + {:error, :body_too_large} = e -> + e + + {:error, {:content_type, _}} -> + e + + # The TTL is not set for the errors above, since they are unlikely to change + # with time {:error, _} = e -> ttl = Pleroma.Config.get([:rich_media, :failure_backoff], 60_000) Cachex.expire(:rich_media_cache, url, ttl) From f70335002df9b2b3f47f0ccaed6aaeebfb14435f Mon Sep 17 00:00:00 2001 From: rinpatch Date: Mon, 14 Sep 2020 14:45:58 +0300 Subject: [PATCH 121/182] RichMedia: Do a HEAD request to check content type/length This shouldn't be too expensive, since the connections are pooled, but it should save us some bandwidth since we won't fetch non-html files and files that are too large for us to process (especially since you can't cancel a request without closing the connection with HTTP1). --- lib/pleroma/web/rich_media/helpers.ex | 46 ++++++++++++++++++++++++++- test/support/http_request_mock.ex | 17 ++++++++++ test/web/rich_media/parser_test.exs | 29 +++++++++++++++++ 3 files changed, 91 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/rich_media/helpers.ex b/lib/pleroma/web/rich_media/helpers.ex index bd7f03cbe..d7a19df4a 100644 --- a/lib/pleroma/web/rich_media/helpers.ex +++ b/lib/pleroma/web/rich_media/helpers.ex @@ -87,6 +87,50 @@ defmodule Pleroma.Web.RichMedia.Helpers do def rich_media_get(url) do headers = [{"user-agent", Pleroma.Application.user_agent() <> "; Bot"}] - Pleroma.HTTP.get(url, headers, @options) + head_check = + case Pleroma.HTTP.head(url, headers, @options) do + # If the HEAD request didn't reach the server for whatever reason, + # we assume the GET that comes right after won't either + {:error, _} = e -> + e + + {:ok, %Tesla.Env{status: 200, headers: headers}} -> + with :ok <- check_content_type(headers), + :ok <- check_content_length(headers), + do: :ok + + _ -> + :ok + end + + with :ok <- head_check, do: Pleroma.HTTP.get(url, headers, @options) + end + + defp check_content_type(headers) do + case List.keyfind(headers, "content-type", 0) do + {_, content_type} -> + case Plug.Conn.Utils.media_type(content_type) do + {:ok, "text", "html", _} -> :ok + _ -> {:error, {:content_type, content_type}} + end + + _ -> + :ok + end + end + + @max_body @options[:max_body] + defp check_content_length(headers) do + case List.keyfind(headers, "content-length", 0) do + {_, maybe_content_length} -> + case Integer.parse(maybe_content_length) do + {content_length, ""} when content_length <= @max_body -> :ok + {_, ""} -> {:error, :body_too_large} + _ -> :ok + end + + _ -> + :ok + end end end diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index 344e27f13..cb022333f 100644 --- a/test/support/http_request_mock.ex +++ b/test/support/http_request_mock.ex @@ -1262,4 +1262,21 @@ defmodule HttpRequestMock do inspect(headers) }"} end + + # Most of the rich media mocks are missing HEAD requests, so we just return 404. + @rich_media_mocks [ + "https://example.com/ogp", + "https://example.com/ogp-missing-data", + "https://example.com/twitter-card" + ] + def head(url, _query, _body, _headers) when url in @rich_media_mocks do + {:ok, %Tesla.Env{status: 404, body: ""}} + end + + def head(url, query, body, headers) do + {:error, + "Mock response not implemented for HEAD #{inspect(url)}, #{query}, #{inspect(body)}, #{ + inspect(headers) + }"} + end end diff --git a/test/web/rich_media/parser_test.exs b/test/web/rich_media/parser_test.exs index 21ae35f8b..d65a63121 100644 --- a/test/web/rich_media/parser_test.exs +++ b/test/web/rich_media/parser_test.exs @@ -56,6 +56,27 @@ defmodule Pleroma.Web.RichMedia.ParserTest do %{method: :get, url: "http://example.com/error"} -> {:error, :overload} + + %{ + method: :head, + url: "http://example.com/huge-page" + } -> + %Tesla.Env{ + status: 200, + headers: [{"content-length", "2000001"}, {"content-type", "text/html"}] + } + + %{ + method: :head, + url: "http://example.com/pdf-file" + } -> + %Tesla.Env{ + status: 200, + headers: [{"content-length", "1000000"}, {"content-type", "application/pdf"}] + } + + %{method: :head} -> + %Tesla.Env{status: 404, body: "", headers: []} end) :ok @@ -144,4 +165,12 @@ defmodule Pleroma.Web.RichMedia.ParserTest do test "returns error if getting page was not successful" do assert {:error, :overload} = Parser.parse("http://example.com/error") end + + test "does a HEAD request to check if the body is too large" do + assert {:error, body_too_large} = Parser.parse("http://example.com/huge-page") + end + + test "does a HEAD request to check if the body is html" do + assert {:error, {:content_type, _}} = Parser.parse("http://example.com/pdf-file") + end end From 738685a6298d7bd883fe81477b2e25ec94822e02 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Mon, 14 Sep 2020 11:56:00 +0000 Subject: [PATCH 122/182] Apply 1 suggestion(s) to 1 file(s) --- test/web/rich_media/parser_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/web/rich_media/parser_test.exs b/test/web/rich_media/parser_test.exs index d65a63121..6d00c2af5 100644 --- a/test/web/rich_media/parser_test.exs +++ b/test/web/rich_media/parser_test.exs @@ -167,7 +167,7 @@ defmodule Pleroma.Web.RichMedia.ParserTest do end test "does a HEAD request to check if the body is too large" do - assert {:error, body_too_large} = Parser.parse("http://example.com/huge-page") + assert {:error, :body_too_large} = Parser.parse("http://example.com/huge-page") end test "does a HEAD request to check if the body is html" do From bb407edce4b512aae74c12ea0c1abcc92bc18ddb Mon Sep 17 00:00:00 2001 From: rinpatch Date: Mon, 14 Sep 2020 15:46:00 +0300 Subject: [PATCH 123/182] RichMedia: fix a compilation error due to nonexistent variable No idea why this passed Gitlab CI --- lib/pleroma/web/rich_media/parser.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/rich_media/parser.ex b/lib/pleroma/web/rich_media/parser.ex index ab8f35922..33f6f1fa1 100644 --- a/lib/pleroma/web/rich_media/parser.ex +++ b/lib/pleroma/web/rich_media/parser.ex @@ -39,7 +39,7 @@ defmodule Pleroma.Web.RichMedia.Parser do {:error, :body_too_large} = e -> e - {:error, {:content_type, _}} -> + {:error, {:content_type, _}} = e -> e # The TTL is not set for the errors above, since they are unlikely to change From 0b5e72ecf033ff78c67eb4e5a68277e5d83f5611 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 10 Sep 2020 15:00:19 +0300 Subject: [PATCH 124/182] Remove `:managed_config` option. In practice, it was already removed half a year ago, but the description and cheatsheet entries were still there. The migration intentionally does not use ConfigDB.get_by_params, since this will break migration code as soon as we add a new field is added to ConfigDB. Closes #2086 --- CHANGELOG.md | 2 ++ config/config.exs | 1 - config/description.exs | 6 ----- docs/configuration/cheatsheet.md | 1 - ...10113106_remove_managed_config_from_db.exs | 27 +++++++++++++++++++ 5 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 priv/repo/migrations/20200910113106_remove_managed_config_from_db.exs diff --git a/CHANGELOG.md b/CHANGELOG.md index 75357f05e..88c489895 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **Breaking:** `Pleroma.Workers.Cron.StatsWorker` setting from Oban `:crontab` (moved to a simpler implementation). - **Breaking:** `Pleroma.Workers.Cron.ClearOauthTokenWorker` setting from Oban `:crontab` (moved to scheduled jobs). - **Breaking:** `Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker` setting from Oban `:crontab` (moved to scheduled jobs). +- Removed `:managed_config` option. In practice, it was accidentally removed with 2.0.0 release when frontends were +switched to a new configuration mechanism, however it was not officially removed until now. ### Changed - Minimum lifetime for ephmeral activities changed to 10 minutes and made configurable (`:min_lifetime` option). diff --git a/config/config.exs b/config/config.exs index 88c47fd03..c204814d0 100644 --- a/config/config.exs +++ b/config/config.exs @@ -216,7 +216,6 @@ config :pleroma, :instance, allow_relay: true, public: true, quarantined_instances: [], - managed_config: true, static_dir: "instance/static/", allowed_post_formats: [ "text/plain", diff --git a/config/description.exs b/config/description.exs index 82c7bc6a7..2b30f8148 100644 --- a/config/description.exs +++ b/config/description.exs @@ -764,12 +764,6 @@ config :pleroma, :config_description, [ "*.quarantined.com" ] }, - %{ - key: :managed_config, - type: :boolean, - description: - "Whenether the config for pleroma-fe is configured in this config or in static/config.json" - }, %{ key: :static_dir, type: :string, diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 0c5d17ce3..054b8fe43 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -40,7 +40,6 @@ To add configuration to your config file, you can copy it from the base config. * `allow_relay`: Enable Pleroma’s Relay, which makes it possible to follow a whole instance. * `public`: Makes the client API in authenticated mode-only except for user-profiles. Useful for disabling the Local Timeline and The Whole Known Network. Note that there is a dependent setting restricting or allowing unauthenticated access to specific resources, see `restrict_unauthenticated` for more details. * `quarantined_instances`: List of ActivityPub instances where private (DMs, followers-only) activities will not be send. -* `managed_config`: Whenether the config for pleroma-fe is configured in [:frontend_configurations](#frontend_configurations) or in ``static/config.json``. * `allowed_post_formats`: MIME-type list of formats allowed to be posted (transformed into HTML). * `extended_nickname_format`: Set to `true` to use extended local nicknames format (allows underscores/dashes). This will break federation with older software for theses nicknames. diff --git a/priv/repo/migrations/20200910113106_remove_managed_config_from_db.exs b/priv/repo/migrations/20200910113106_remove_managed_config_from_db.exs new file mode 100644 index 000000000..e27a9ae48 --- /dev/null +++ b/priv/repo/migrations/20200910113106_remove_managed_config_from_db.exs @@ -0,0 +1,27 @@ +defmodule Pleroma.Repo.Migrations.RemoveManagedConfigFromDb do + use Ecto.Migration + import Ecto.Query + alias Pleroma.ConfigDB + alias Pleroma.Repo + + def up do + config_entry = + from(c in ConfigDB, + select: [:id, :value], + where: c.group == ^:pleroma and c.key == ^:instance + ) + |> Repo.one() + + if config_entry do + {_, value} = Keyword.pop(config_entry.value, :managed_config) + + config_entry + |> Ecto.Changeset.change(value: value) + |> Repo.update() + end + end + + def down do + :ok + end +end From d31f0393bfaa733cf68058c21294874daa286e0a Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 14 Sep 2020 12:06:08 -0500 Subject: [PATCH 125/182] Validate Welcome Chat message works with Simple policy applied to local instance --- test/user_test.exs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/test/user_test.exs b/test/user_test.exs index 50f72549e..a910226b2 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -440,6 +440,45 @@ defmodule Pleroma.UserTest do assert activity.actor == welcome_user.ap_id end + setup do: + clear_config(:mrf_simple, + media_removal: [], + media_nsfw: [], + federated_timeline_removal: [], + report_removal: [], + reject: [], + followers_only: [], + accept: [], + avatar_removal: [], + banner_removal: [], + reject_deletes: [] + ) + + setup do: + clear_config(:mrf, + policies: [ + Pleroma.Web.ActivityPub.MRF.SimplePolicy + ] + ) + + test "it sends a welcome chat message when Simple policy applied to local instance" do + Pleroma.Config.put([:mrf_simple, :media_nsfw], ["localhost"]) + + welcome_user = insert(:user) + Pleroma.Config.put([:welcome, :chat_message, :enabled], true) + Pleroma.Config.put([:welcome, :chat_message, :sender_nickname], welcome_user.nickname) + Pleroma.Config.put([:welcome, :chat_message, :message], "Hello, this is a chat message") + + cng = User.register_changeset(%User{}, @full_user_data) + {:ok, registered_user} = User.register(cng) + ObanHelpers.perform_all() + + activity = Repo.one(Pleroma.Activity) + assert registered_user.ap_id in activity.recipients + assert Object.normalize(activity).data["content"] =~ "chat message" + assert activity.actor == welcome_user.ap_id + end + test "it sends a welcome email message if it is set" do welcome_user = insert(:user) Pleroma.Config.put([:welcome, :email, :enabled], true) From 25d1caf1ddae3730f2554d35d89a0c2692927d99 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 14 Sep 2020 12:07:31 -0500 Subject: [PATCH 126/182] Merge duplicate Changed sections --- CHANGELOG.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75357f05e..e94f2eda2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Renamed `:await_up_timeout` in `:connections_pool` namespace to `:connect_timeout`, old name is deprecated. - Renamed `:timeout` in `pools` namespace to `:recv_timeout`, old name is deprecated. +- Minimum lifetime for ephmeral activities changed to 10 minutes and made configurable (`:min_lifetime` option). ### Removed @@ -16,9 +17,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **Breaking:** `Pleroma.Workers.Cron.ClearOauthTokenWorker` setting from Oban `:crontab` (moved to scheduled jobs). - **Breaking:** `Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker` setting from Oban `:crontab` (moved to scheduled jobs). -### Changed -- Minimum lifetime for ephmeral activities changed to 10 minutes and made configurable (`:min_lifetime` option). - ## [2.1.1] - 2020-09-08 ### Security From 118bf6e92bc112b20ba1ce2f7d0bd3bb5db7ebfe Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 14 Sep 2020 12:08:32 -0500 Subject: [PATCH 127/182] Fixed Welcome chats with MRF Simple applied locally --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e94f2eda2..685d59873 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **Breaking:** `Pleroma.Workers.Cron.ClearOauthTokenWorker` setting from Oban `:crontab` (moved to scheduled jobs). - **Breaking:** `Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker` setting from Oban `:crontab` (moved to scheduled jobs). +### Fixed + +- Welcome Chat messages preventing user registration with MRF Simple Policy applied to the local instance + ## [2.1.1] - 2020-09-08 ### Security From 38b2db297b3207607072347b408dc7eacbac600e Mon Sep 17 00:00:00 2001 From: stwf Date: Mon, 14 Sep 2020 13:18:11 -0400 Subject: [PATCH 128/182] search indexing metadata respects discoverable flag --- lib/pleroma/web/metadata/restrict_indexing.ex | 7 +++---- test/web/metadata/metadata_test.exs | 19 +++++++++++++++++-- test/web/metadata/restrict_indexing_test.exs | 8 +++++++- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/lib/pleroma/web/metadata/restrict_indexing.ex b/lib/pleroma/web/metadata/restrict_indexing.ex index f15607896..a1dcb6e15 100644 --- a/lib/pleroma/web/metadata/restrict_indexing.ex +++ b/lib/pleroma/web/metadata/restrict_indexing.ex @@ -10,7 +10,9 @@ defmodule Pleroma.Web.Metadata.Providers.RestrictIndexing do """ @impl true - def build_tags(%{user: %{local: false}}) do + def build_tags(%{user: %{local: true, discoverable: true}}), do: [] + + def build_tags(_) do [ {:meta, [ @@ -19,7 +21,4 @@ defmodule Pleroma.Web.Metadata.Providers.RestrictIndexing do ], []} ] end - - @impl true - def build_tags(%{user: %{local: true}}), do: [] end diff --git a/test/web/metadata/metadata_test.exs b/test/web/metadata/metadata_test.exs index 9d3121b7b..fe3009628 100644 --- a/test/web/metadata/metadata_test.exs +++ b/test/web/metadata/metadata_test.exs @@ -18,17 +18,32 @@ defmodule Pleroma.Web.MetadataTest do test "for local user" do user = insert(:user) + assert Pleroma.Web.Metadata.build_tags(%{user: user}) =~ + "" + end + + test "for local user set to discoverable" do + user = insert(:user, discoverable: true) + refute Pleroma.Web.Metadata.build_tags(%{user: user}) =~ "" end end describe "no metadata for private instances" do - test "for local user" do + test "for local user set to discoverable" do clear_config([:instance, :public], false) - user = insert(:user, bio: "This is my secret fedi account bio") + user = insert(:user, bio: "This is my secret fedi account bio", discoverable: true) assert "" = Pleroma.Web.Metadata.build_tags(%{user: user}) end + + test "search exclusion metadata is included" do + clear_config([:instance, :public], false) + user = insert(:user, bio: "This is my secret fedi account bio") + + assert "" == + Pleroma.Web.Metadata.build_tags(%{user: user}) + end end end diff --git a/test/web/metadata/restrict_indexing_test.exs b/test/web/metadata/restrict_indexing_test.exs index aad0bac42..6b3a65372 100644 --- a/test/web/metadata/restrict_indexing_test.exs +++ b/test/web/metadata/restrict_indexing_test.exs @@ -14,8 +14,14 @@ defmodule Pleroma.Web.Metadata.Providers.RestrictIndexingTest do test "for local user" do assert Pleroma.Web.Metadata.Providers.RestrictIndexing.build_tags(%{ - user: %Pleroma.User{local: true} + user: %Pleroma.User{local: true, discoverable: true} }) == [] end + + test "for local user when discoverable is false" do + assert Pleroma.Web.Metadata.Providers.RestrictIndexing.build_tags(%{ + user: %Pleroma.User{local: true, discoverable: false} + }) == [{:meta, [name: "robots", content: "noindex, noarchive"], []}] + end end end From f900a40d5dc4285977bd92f3792ad04a2f34ddcf Mon Sep 17 00:00:00 2001 From: stwf Date: Mon, 14 Sep 2020 13:55:49 -0400 Subject: [PATCH 129/182] fix credo warning --- test/web/metadata/metadata_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/web/metadata/metadata_test.exs b/test/web/metadata/metadata_test.exs index fe3009628..054844597 100644 --- a/test/web/metadata/metadata_test.exs +++ b/test/web/metadata/metadata_test.exs @@ -42,7 +42,7 @@ defmodule Pleroma.Web.MetadataTest do clear_config([:instance, :public], false) user = insert(:user, bio: "This is my secret fedi account bio") - assert "" == + assert ~s() == Pleroma.Web.Metadata.build_tags(%{user: user}) end end From 709723182d69e1bb41a23c8abeb5d7c2c67b8c49 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 14 Sep 2020 17:06:42 -0500 Subject: [PATCH 130/182] Ensure SimplePolicy's tags in string representation don't trip up the object validator --- lib/pleroma/web/activity_pub/transmogrifier.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index af4384213..8fe430644 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -309,7 +309,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do def fix_emoji(%{"tag" => tags} = object) when is_list(tags) do emoji = tags - |> Enum.filter(fn data -> data["type"] == "Emoji" and data["icon"] end) + |> Enum.filter(fn data -> is_map(data) and data["type"] == "Emoji" and data["icon"] end) |> Enum.reduce(%{}, fn data, mapping -> name = String.trim(data["name"], ":") From 0b66e806e32055b625560eb06b9300cc856f9789 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Mon, 14 Sep 2020 17:11:08 -0500 Subject: [PATCH 131/182] Move changelog entry to next patch --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 685d59873..ac4a6f7f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **Breaking:** `Pleroma.Workers.Cron.ClearOauthTokenWorker` setting from Oban `:crontab` (moved to scheduled jobs). - **Breaking:** `Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker` setting from Oban `:crontab` (moved to scheduled jobs). +## unreleased-patch - ??? + ### Fixed - Welcome Chat messages preventing user registration with MRF Simple Policy applied to the local instance From 3ab59a6f3c7b7bae2e69d1a8d1bf484d039a5420 Mon Sep 17 00:00:00 2001 From: eugenijm Date: Tue, 15 Sep 2020 13:00:07 +0300 Subject: [PATCH 132/182] Mastodon API: fix the public timeline returning an error when the `reply_visibility` parameter is set to `self` for an unauthenticated user --- CHANGELOG.md | 1 + lib/pleroma/web/activity_pub/activity_pub.ex | 4 ++-- test/web/activity_pub/activity_pub_test.exs | 8 ++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82f64d441..f7a372e11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ switched to a new configuration mechanism, however it was not officially removed ### Fixed - Welcome Chat messages preventing user registration with MRF Simple Policy applied to the local instance +- Mastodon API: the public timeline returning an error when the `reply_visibility` parameter is set to `self` for an unauthenticated user ## [2.1.1] - 2020-09-08 diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 66a9f78a3..5aac3f53b 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -767,7 +767,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end defp restrict_replies(query, %{ - reply_filtering_user: user, + reply_filtering_user: %User{} = user, reply_visibility: "self" }) do from( @@ -783,7 +783,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end defp restrict_replies(query, %{ - reply_filtering_user: user, + reply_filtering_user: %User{} = user, reply_visibility: "following" }) do from( diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index d8caa0b00..7bdad3810 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -1810,6 +1810,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do |> Enum.map(& &1.id) assert activities_ids == [] + + activities_ids = + %{} + |> Map.put(:reply_visibility, "self") + |> Map.put(:reply_filtering_user, nil) + |> ActivityPub.fetch_public_activities() + + assert activities_ids == [] end test "home timeline", %{users: %{u1: user}} do From f879d07fa1a046b5aa33de8e445b1ca803fa1d04 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Tue, 15 Sep 2020 15:32:49 +0300 Subject: [PATCH 133/182] fixed tests --- test/marker_test.exs | 4 ++-- test/repo_test.exs | 4 +++- .../web/mastodon_api/controllers/account_controller_test.exs | 5 ++++- test/web/mastodon_api/controllers/marker_controller_test.exs | 2 +- test/web/mastodon_api/views/account_view_test.exs | 2 +- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/test/marker_test.exs b/test/marker_test.exs index 5b6d0b4a4..7b3943c7b 100644 --- a/test/marker_test.exs +++ b/test/marker_test.exs @@ -33,8 +33,8 @@ defmodule Pleroma.MarkerTest do test "returns user markers" do user = insert(:user) marker = insert(:marker, user: user) - insert(:notification, user: user) - insert(:notification, user: user) + insert(:notification, user: user, activity: insert(:note_activity)) + insert(:notification, user: user, activity: insert(:note_activity)) insert(:marker, timeline: "home", user: user) assert Marker.get_markers( diff --git a/test/repo_test.exs b/test/repo_test.exs index 92e827c95..72c0b5071 100644 --- a/test/repo_test.exs +++ b/test/repo_test.exs @@ -37,7 +37,9 @@ defmodule Pleroma.RepoTest do test "get one-to-many assoc from repo" do user = insert(:user) - notification = refresh_record(insert(:notification, user: user)) + + notification = + refresh_record(insert(:notification, user: user, activity: insert(:note_activity))) assert Repo.get_assoc(user, :notifications) == {:ok, [notification]} end diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index 17a1e7d66..f7f1369e4 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -1442,7 +1442,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do describe "verify_credentials" do test "verify_credentials" do %{user: user, conn: conn} = oauth_access(["read:accounts"]) - [notification | _] = insert_list(7, :notification, user: user) + + [notification | _] = + insert_list(7, :notification, user: user, activity: insert(:note_activity)) + Pleroma.Notification.set_read_up_to(user, notification.id) conn = get(conn, "/api/v1/accounts/verify_credentials") diff --git a/test/web/mastodon_api/controllers/marker_controller_test.exs b/test/web/mastodon_api/controllers/marker_controller_test.exs index 6dd40fb4a..9f0481120 100644 --- a/test/web/mastodon_api/controllers/marker_controller_test.exs +++ b/test/web/mastodon_api/controllers/marker_controller_test.exs @@ -11,7 +11,7 @@ defmodule Pleroma.Web.MastodonAPI.MarkerControllerTest do test "gets markers with correct scopes", %{conn: conn} do user = insert(:user) token = insert(:oauth_token, user: user, scopes: ["read:statuses"]) - insert_list(7, :notification, user: user) + insert_list(7, :notification, user: user, activity: insert(:note_activity)) {:ok, %{"notifications" => marker}} = Pleroma.Marker.upsert( diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index 9f22f9dcf..c5f491d6b 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -448,7 +448,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do test "shows unread_count only to the account owner" do user = insert(:user) - insert_list(7, :notification, user: user) + insert_list(7, :notification, user: user, activity: insert(:note_activity)) other_user = insert(:user) user = User.get_cached_by_ap_id(user.ap_id) From c74fad9e06cdb272a1378082908448f7f0b592ac Mon Sep 17 00:00:00 2001 From: Maksim Date: Wed, 16 Sep 2020 03:18:50 +0000 Subject: [PATCH 134/182] Apply 1 suggestion(s) to 1 file(s) --- .../20200914105638_delete_notification_without_activity.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/priv/repo/migrations/20200914105638_delete_notification_without_activity.exs b/priv/repo/migrations/20200914105638_delete_notification_without_activity.exs index f5b339101..9333fc5a1 100644 --- a/priv/repo/migrations/20200914105638_delete_notification_without_activity.exs +++ b/priv/repo/migrations/20200914105638_delete_notification_without_activity.exs @@ -11,7 +11,7 @@ defmodule Pleroma.Repo.Migrations.DeleteNotificationWithoutActivity do select: %{id: type(q.id, :integer)}, where: is_nil(c.id) ) - |> Repo.chunk_stream(1_000, :bacthes) + |> Repo.chunk_stream(1_000, :batches) |> Stream.each(fn records -> notification_ids = Enum.map(records, fn %{id: id} -> id end) From 599f8bb152ca0669d17baa5f313f00f0791209b6 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Wed, 16 Sep 2020 09:47:18 +0300 Subject: [PATCH 135/182] RepoStreamer.chunk_stream -> Repo.chunk_stream --- lib/mix/tasks/pleroma/database.ex | 4 ++-- lib/mix/tasks/pleroma/user.ex | 4 ++-- lib/pleroma/repo.ex | 14 +++++++++++++ lib/pleroma/repo_streamer.ex | 34 ------------------------------- lib/pleroma/user.ex | 3 +-- test/repo_test.exs | 28 +++++++++++++++++++++++++ 6 files changed, 47 insertions(+), 40 deletions(-) delete mode 100644 lib/pleroma/repo_streamer.ex diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index 7f1108dcf..a01c36ece 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -99,7 +99,7 @@ defmodule Mix.Tasks.Pleroma.Database do where: fragment("(?)->>'likes' is not null", object.data), select: %{id: object.id, likes: fragment("(?)->>'likes'", object.data)} ) - |> Pleroma.RepoStreamer.chunk_stream(100) + |> Pleroma.Repo.chunk_stream(100, :batches) |> Stream.each(fn objects -> ids = objects @@ -145,7 +145,7 @@ defmodule Mix.Tasks.Pleroma.Database do |> where(local: true) |> where([a], fragment("(? ->> 'type'::text) = 'Create'", a.data)) |> where([_a, o], fragment("?->>'type' = 'Note'", o.data)) - |> Pleroma.RepoStreamer.chunk_stream(100) + |> Pleroma.Repo.chunk_stream(100, :batches) |> Stream.each(fn activities -> Enum.each(activities, fn activity -> expires_at = diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 01824aa18..b20c49d89 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -179,7 +179,7 @@ defmodule Mix.Tasks.Pleroma.User do start_pleroma() Pleroma.User.Query.build(%{nickname: "@#{instance}"}) - |> Pleroma.RepoStreamer.chunk_stream(500) + |> Pleroma.Repo.chunk_stream(500, :batches) |> Stream.each(fn users -> users |> Enum.each(fn user -> @@ -370,7 +370,7 @@ defmodule Mix.Tasks.Pleroma.User do start_pleroma() Pleroma.User.Query.build(%{local: true}) - |> Pleroma.RepoStreamer.chunk_stream(500) + |> Pleroma.Repo.chunk_stream(500, :batches) |> Stream.each(fn users -> users |> Enum.each(fn user -> diff --git a/lib/pleroma/repo.ex b/lib/pleroma/repo.ex index a75610879..4524bd5e2 100644 --- a/lib/pleroma/repo.ex +++ b/lib/pleroma/repo.ex @@ -49,6 +49,20 @@ defmodule Pleroma.Repo do end end + @doc """ + Returns a lazy enumerable that emits all entries from the data store matching the given query. + + `returns_as` use to group records. use the `batches` option to fetch records in bulk. + + ## Examples + + # fetch records one-by-one + iex> Pleroma.Repo.chunk_stream(Pleroma.Activity.Queries.by_actor(ap_id), 500) + + # fetch records in bulk + iex> Pleroma.Repo.chunk_stream(Pleroma.Activity.Queries.by_actor(ap_id), 500, :batches) + """ + @spec chunk_stream(Ecto.Query.t(), integer(), atom()) :: Enumerable.t() def chunk_stream(query, chunk_size, returns_as \\ :one) do # We don't actually need start and end funcitons of resource streaming, # but it seems to be the only way to not fetch records one-by-one and diff --git a/lib/pleroma/repo_streamer.ex b/lib/pleroma/repo_streamer.ex deleted file mode 100644 index cb4d7bb7a..000000000 --- a/lib/pleroma/repo_streamer.ex +++ /dev/null @@ -1,34 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.RepoStreamer do - alias Pleroma.Repo - import Ecto.Query - - def chunk_stream(query, chunk_size) do - Stream.unfold(0, fn - :halt -> - {[], :halt} - - last_id -> - query - |> order_by(asc: :id) - |> where([r], r.id > ^last_id) - |> limit(^chunk_size) - |> Repo.all() - |> case do - [] -> - {[], :halt} - - records -> - last_id = List.last(records).id - {records, last_id} - end - end) - |> Stream.take_while(fn - [] -> false - _ -> true - end) - end -end diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index e73d19964..57497eb83 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -25,7 +25,6 @@ defmodule Pleroma.User do alias Pleroma.Object alias Pleroma.Registration alias Pleroma.Repo - alias Pleroma.RepoStreamer alias Pleroma.User alias Pleroma.UserRelationship alias Pleroma.Web @@ -1775,7 +1774,7 @@ defmodule Pleroma.User do def delete_user_activities(%User{ap_id: ap_id} = user) do ap_id |> Activity.Queries.by_actor() - |> RepoStreamer.chunk_stream(50) + |> Repo.chunk_stream(50, :batches) |> Stream.each(fn activities -> Enum.each(activities, fn activity -> delete_activity(activity, user) end) end) diff --git a/test/repo_test.exs b/test/repo_test.exs index 72c0b5071..155791be2 100644 --- a/test/repo_test.exs +++ b/test/repo_test.exs @@ -49,4 +49,32 @@ defmodule Pleroma.RepoTest do assert Repo.get_assoc(token, :user) == {:error, :not_found} end end + + describe "chunk_stream/3" do + test "fetch records one-by-one" do + users = insert_list(50, :user) + + {fetch_users, 50} = + from(t in User) + |> Repo.chunk_stream(5) + |> Enum.reduce({[], 0}, fn %User{} = user, {acc, count} -> + {acc ++ [user], count + 1} + end) + + assert users == fetch_users + end + + test "fetch records in bulk" do + users = insert_list(50, :user) + + {fetch_users, 10} = + from(t in User) + |> Repo.chunk_stream(5, :batches) + |> Enum.reduce({[], 0}, fn users, {acc, count} -> + {acc ++ users, count + 1} + end) + + assert users == fetch_users + end + end end From adb1b0282dfbced2b2986c90cff765be37dd5151 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Wed, 16 Sep 2020 17:23:05 +0300 Subject: [PATCH 136/182] ConnectionPool Worker: use monitor flush instead of checking ref `:flush` removes the DOWN message if one had arrived, so this check should no longer be necessary. --- lib/pleroma/gun/connection_pool/worker.ex | 25 ++++++++--------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/lib/pleroma/gun/connection_pool/worker.ex b/lib/pleroma/gun/connection_pool/worker.ex index 49d41e4c7..bf57e9e5f 100644 --- a/lib/pleroma/gun/connection_pool/worker.ex +++ b/lib/pleroma/gun/connection_pool/worker.ex @@ -93,25 +93,18 @@ defmodule Pleroma.Gun.ConnectionPool.Worker do end) {ref, state} = pop_in(state.client_monitors[client_pid]) - # DOWN message can receive right after `remove_client` call and cause worker to terminate - state = - if is_nil(ref) do - state + + Process.demonitor(ref, [:flush]) + + timer = + if used_by == [] do + max_idle = Pleroma.Config.get([:connections_pool, :max_idle_time], 30_000) + Process.send_after(self(), :idle_close, max_idle) else - Process.demonitor(ref) - - timer = - if used_by == [] do - max_idle = Pleroma.Config.get([:connections_pool, :max_idle_time], 30_000) - Process.send_after(self(), :idle_close, max_idle) - else - nil - end - - %{state | timer: timer} + nil end - {:reply, :ok, state, :hibernate} + {:reply, :ok, %{state | timer: timer}, :hibernate} end @impl true From 7a88b726bf81e1610ade2b07ffd6af672b701600 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 16 Sep 2020 17:29:16 +0200 Subject: [PATCH 137/182] User: Remote users don't need to be confirmed or approved --- lib/pleroma/user.ex | 4 ++-- test/user_test.exs | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 57497eb83..1ffe60dfc 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -275,9 +275,9 @@ defmodule Pleroma.User do @spec account_status(User.t()) :: account_status() def account_status(%User{deactivated: true}), do: :deactivated def account_status(%User{password_reset_pending: true}), do: :password_reset_pending - def account_status(%User{approval_pending: true}), do: :approval_pending + def account_status(%User{local: true, approval_pending: true}), do: :approval_pending - def account_status(%User{confirmation_pending: true}) do + def account_status(%User{local: true, confirmation_pending: true}) do if Config.get([:instance, :account_activation_required]) do :confirmation_pending else diff --git a/test/user_test.exs b/test/user_test.exs index a910226b2..060918d71 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -1676,7 +1676,7 @@ defmodule Pleroma.UserTest do assert User.visible_for(user, user) == :visible end - test "returns false when the account is unauthenticated and auth is required" do + test "returns false when the account is unconfirmed and confirmation is required" do Pleroma.Config.put([:instance, :account_activation_required], true) user = insert(:user, local: true, confirmation_pending: true) @@ -1685,14 +1685,23 @@ defmodule Pleroma.UserTest do refute User.visible_for(user, other_user) == :visible end - test "returns true when the account is unauthenticated and auth is not required" do + test "returns true when the account is unconfirmed and confirmation is required but the account is remote" do + Pleroma.Config.put([:instance, :account_activation_required], true) + + user = insert(:user, local: false, confirmation_pending: true) + other_user = insert(:user, local: true) + + assert User.visible_for(user, other_user) == :visible + end + + test "returns true when the account is unconfirmed and confirmation is not required" do user = insert(:user, local: true, confirmation_pending: true) other_user = insert(:user, local: true) assert User.visible_for(user, other_user) == :visible end - test "returns true when the account is unauthenticated and being viewed by a privileged account (auth required)" do + test "returns true when the account is unconfirmed and being viewed by a privileged account (confirmation required)" do Pleroma.Config.put([:instance, :account_activation_required], true) user = insert(:user, local: true, confirmation_pending: true) From 73e0e6a8a2efaac513077317229f72b128f3a3ea Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 16 Sep 2020 10:56:42 -0500 Subject: [PATCH 138/182] Remove unused import --- test/object/fetcher_test.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/object/fetcher_test.exs b/test/object/fetcher_test.exs index 3173ee31c..14d2c645f 100644 --- a/test/object/fetcher_test.exs +++ b/test/object/fetcher_test.exs @@ -10,7 +10,6 @@ defmodule Pleroma.Object.FetcherTest do alias Pleroma.Object alias Pleroma.Object.Fetcher - import ExUnit.CaptureLog import Mock import Tesla.Mock From a781f41f969bd1a929005b2b5006a40d42855ae8 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Wed, 16 Sep 2020 22:30:42 +0300 Subject: [PATCH 139/182] [#2497] Media preview proxy: misc. improvements (`static` param support, dynamic fifo pipe path), refactoring. --- CHANGELOG.md | 3 +++ lib/pleroma/helpers/media_helper.ex | 4 +--- lib/pleroma/helpers/uri_helper.ex | 13 ++++++++----- .../web/mastodon_api/views/account_view.ex | 4 ++-- lib/pleroma/web/media_proxy/media_proxy.ex | 2 +- .../web/media_proxy/media_proxy_controller.ex | 19 ++++++++++++++++--- lib/pleroma/web/oauth/oauth_controller.ex | 4 ++-- 7 files changed, 33 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7a372e11..adea6d019 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Renamed `:timeout` in `pools` namespace to `:recv_timeout`, old name is deprecated. - Minimum lifetime for ephmeral activities changed to 10 minutes and made configurable (`:min_lifetime` option). +### Added +- Media preview proxy (requires media proxy be enabled; see `:media_preview_proxy` config for more details). + ### Removed - **Breaking:** `Pleroma.Workers.Cron.StatsWorker` setting from Oban `:crontab` (moved to a simpler implementation). diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index d834b4a07..9b7348ee2 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -9,8 +9,6 @@ defmodule Pleroma.Helpers.MediaHelper do alias Pleroma.HTTP - @tmp_base "/tmp/pleroma-media_preview-pipe" - def image_resize(url, options) do with executable when is_binary(executable) <- System.find_executable("convert"), {:ok, args} <- prepare_image_resize_args(options), @@ -103,7 +101,7 @@ defmodule Pleroma.Helpers.MediaHelper do end defp mkfifo do - path = "#{@tmp_base}#{to_charlist(:erlang.phash2(self()))}" + path = Path.join(System.tmp_dir!(), "pleroma-media-preview-pipe-#{Ecto.UUID.generate()}") case System.cmd("mkfifo", [path]) do {_, 0} -> diff --git a/lib/pleroma/helpers/uri_helper.ex b/lib/pleroma/helpers/uri_helper.ex index 9c9e53447..f1301f055 100644 --- a/lib/pleroma/helpers/uri_helper.ex +++ b/lib/pleroma/helpers/uri_helper.ex @@ -3,14 +3,17 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Helpers.UriHelper do - def append_uri_params(uri, appended_params) do + def modify_uri_params(uri, overridden_params, deleted_params \\ []) do uri = URI.parse(uri) - appended_params = for {k, v} <- appended_params, into: %{}, do: {to_string(k), v} - existing_params = URI.query_decoder(uri.query || "") |> Enum.into(%{}) - updated_params_keys = Enum.uniq(Map.keys(existing_params) ++ Map.keys(appended_params)) + + existing_params = URI.query_decoder(uri.query || "") |> Map.new() + overridden_params = Map.new(overridden_params, fn {k, v} -> {to_string(k), v} end) + deleted_params = Enum.map(deleted_params, &to_string/1) updated_params = - for k <- updated_params_keys, do: {k, appended_params[k] || existing_params[k]} + existing_params + |> Map.merge(overridden_params) + |> Map.drop(deleted_params) uri |> Map.put(:query, URI.encode_query(updated_params)) diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index a811f81c2..121ba1693 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -182,9 +182,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do display_name = user.name || user.nickname avatar = User.avatar_url(user) |> MediaProxy.url() - avatar_static = User.avatar_url(user) |> MediaProxy.preview_url(output_format: "jpeg") + avatar_static = User.avatar_url(user) |> MediaProxy.preview_url(static: true) header = User.banner_url(user) |> MediaProxy.url() - header_static = User.banner_url(user) |> MediaProxy.preview_url(output_format: "jpeg") + header_static = User.banner_url(user) |> MediaProxy.preview_url(static: true) following_count = if !user.hide_follows_count or !user.hide_follows or opts[:for] == user do diff --git a/lib/pleroma/web/media_proxy/media_proxy.ex b/lib/pleroma/web/media_proxy/media_proxy.ex index ba553998b..8656b8cad 100644 --- a/lib/pleroma/web/media_proxy/media_proxy.ex +++ b/lib/pleroma/web/media_proxy/media_proxy.ex @@ -157,7 +157,7 @@ defmodule Pleroma.Web.MediaProxy do def build_preview_url(sig_base64, url_base64, filename \\ nil, preview_params \\ []) do uri = proxy_url("proxy/preview", sig_base64, url_base64, filename) - UriHelper.append_uri_params(uri, preview_params) + UriHelper.modify_uri_params(uri, preview_params) end def verify_request_path_and_url( diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 78df7763e..fe279e964 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -7,6 +7,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do alias Pleroma.Config alias Pleroma.Helpers.MediaHelper + alias Pleroma.Helpers.UriHelper alias Pleroma.ReverseProxy alias Pleroma.Web.MediaProxy alias Plug.Conn @@ -74,14 +75,26 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end defp handle_preview( - "image/" <> _ = _content_type, + "image/gif" = _content_type, _content_length, - %{params: %{"output_format" => "jpeg"}} = conn, + %{params: %{"static" => static}} = conn, media_proxy_url - ) do + ) + when static in ["true", true] do handle_jpeg_preview(conn, media_proxy_url) end + defp handle_preview( + _content_type, + _content_length, + %{params: %{"static" => static}} = conn, + _media_proxy_url + ) + when static in ["true", true] do + uri_without_static_param = UriHelper.modify_uri_params(current_url(conn), %{}, ["static"]) + redirect(conn, external: uri_without_static_param) + end + defp handle_preview("image/gif" = _content_type, _content_length, conn, media_proxy_url) do redirect(conn, external: media_proxy_url) end diff --git a/lib/pleroma/web/oauth/oauth_controller.ex b/lib/pleroma/web/oauth/oauth_controller.ex index 26e68be42..a4152e840 100644 --- a/lib/pleroma/web/oauth/oauth_controller.ex +++ b/lib/pleroma/web/oauth/oauth_controller.ex @@ -119,7 +119,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do redirect_uri = redirect_uri(conn, redirect_uri) url_params = %{access_token: token.token} url_params = Maps.put_if_present(url_params, :state, params["state"]) - url = UriHelper.append_uri_params(redirect_uri, url_params) + url = UriHelper.modify_uri_params(redirect_uri, url_params) redirect(conn, external: url) else conn @@ -161,7 +161,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do redirect_uri = redirect_uri(conn, redirect_uri) url_params = %{code: auth.token} url_params = Maps.put_if_present(url_params, :state, auth_attrs["state"]) - url = UriHelper.append_uri_params(redirect_uri, url_params) + url = UriHelper.modify_uri_params(redirect_uri, url_params) redirect(conn, external: url) else conn From 5a8ea0a5b07c22d567a60af36345483fe880b638 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Thu, 17 Sep 2020 09:13:43 +0300 Subject: [PATCH 140/182] small refactoring --- lib/pleroma/user/import.ex | 10 ++------ lib/pleroma/workers/background_worker.ex | 29 +++--------------------- 2 files changed, 5 insertions(+), 34 deletions(-) diff --git a/lib/pleroma/user/import.ex b/lib/pleroma/user/import.ex index de27bdc4c..e458021c8 100644 --- a/lib/pleroma/user/import.ex +++ b/lib/pleroma/user/import.ex @@ -65,20 +65,14 @@ defmodule Pleroma.User.Import do def blocks_import(%User{} = blocker, [_ | _] = identifiers) do BackgroundWorker.enqueue( "blocks_import", - %{ - "blocker_id" => blocker.id, - "blocked_identifiers" => identifiers - } + %{"user_id" => blocker.id, "identifiers" => identifiers} ) end def follow_import(%User{} = follower, [_ | _] = identifiers) do BackgroundWorker.enqueue( "follow_import", - %{ - "follower_id" => follower.id, - "followed_identifiers" => identifiers - } + %{"user_id" => follower.id, "identifiers" => identifiers} ) end diff --git a/lib/pleroma/workers/background_worker.ex b/lib/pleroma/workers/background_worker.ex index f9c767ee0..55b5a13d9 100644 --- a/lib/pleroma/workers/background_worker.ex +++ b/lib/pleroma/workers/background_worker.ex @@ -26,33 +26,10 @@ defmodule Pleroma.Workers.BackgroundWorker do User.perform(:force_password_reset, user) end - def perform(%Job{ - args: %{ - "op" => "blocks_import", - "blocker_id" => blocker_id, - "blocked_identifiers" => blocked_identifiers - } - }) do - blocker = User.get_cached_by_id(blocker_id) - {:ok, User.Import.perform(:blocks_import, blocker, blocked_identifiers)} - end - - def perform(%Job{ - args: %{ - "op" => "follow_import", - "follower_id" => follower_id, - "followed_identifiers" => followed_identifiers - } - }) do - follower = User.get_cached_by_id(follower_id) - {:ok, User.Import.perform(:follow_import, follower, followed_identifiers)} - end - - def perform(%Job{ - args: %{"op" => "mutes_import", "user_id" => user_id, "identifiers" => identifiers} - }) do + def perform(%Job{args: %{"op" => op, "user_id" => user_id, "identifiers" => identifiers}}) + when op in ["blocks_import", "follow_import", "mutes_import"] do user = User.get_cached_by_id(user_id) - {:ok, User.Import.perform(:mutes_import, user, identifiers)} + {:ok, User.Import.perform(String.to_atom(op), user, identifiers)} end def perform(%Job{args: %{"op" => "media_proxy_preload", "message" => message}}) do From e39ff2616b6694f97ab793bc60b5caa7b509f0b1 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 17 Sep 2020 13:29:26 +0200 Subject: [PATCH 141/182] Admin chat api tests: Small additions. --- test/web/admin_api/controllers/admin_api_controller_test.exs | 2 +- test/web/admin_api/controllers/chat_controller_test.exs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs index 3476fd0b4..e6ad210a2 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -1521,7 +1521,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do %{user: user} end - test "renders user's statuses", %{conn: conn, user: user} do + test "renders user's chats", %{conn: conn, user: user} do conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/chats") assert json_response(conn, 200) |> length() == 3 diff --git a/test/web/admin_api/controllers/chat_controller_test.exs b/test/web/admin_api/controllers/chat_controller_test.exs index e81484ce6..bd4c9c9d1 100644 --- a/test/web/admin_api/controllers/chat_controller_test.exs +++ b/test/web/admin_api/controllers/chat_controller_test.exs @@ -40,8 +40,10 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do object = Object.normalize(message, false) chat = Chat.get(user.id, recipient.ap_id) + recipient_chat = Chat.get(recipient.id, user.ap_id) cm_ref = MessageReference.for_chat_and_object(chat, object) + recipient_cm_ref = MessageReference.for_chat_and_object(recipient_chat, object) result = conn @@ -56,6 +58,7 @@ defmodule Pleroma.Web.AdminAPI.ChatControllerTest do assert result["id"] == cm_ref.id refute MessageReference.get_by_id(cm_ref.id) + refute MessageReference.get_by_id(recipient_cm_ref.id) assert %{data: %{"type" => "Tombstone"}} = Object.get_by_id(object.id) end end From 5e3c70afa5c02926a5578628431487e92b2175e9 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 17 Sep 2020 13:37:25 +0200 Subject: [PATCH 142/182] AdminAPI Chat tests: Remove factory. The factory system doesn't work too well with how the chats are done. Instead of tempting people to use it, let's rather use the CommonAPI system for now. --- test/support/factory.ex | 54 ------------------- .../controllers/admin_api_controller_test.exs | 13 +++-- 2 files changed, 8 insertions(+), 59 deletions(-) diff --git a/test/support/factory.ex b/test/support/factory.ex index e59d83242..2fdfabbc5 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -441,58 +441,4 @@ defmodule Pleroma.Factory do phrase: "cofe" } end - - def chat_factory(attrs \\ %{}) do - user = attrs[:user] || insert(:user) - recipient = attrs[:recipient] || insert(:user) - - %Pleroma.Chat{ - user_id: user.id, - recipient: recipient.ap_id - } - end - - def chat_message_factory(attrs \\ %{}) do - text = sequence(:text, &"This is :moominmamma: chat message #{&1}") - chat = attrs[:chat] || insert(:chat) - - data = %{ - "type" => "ChatMessage", - "content" => text, - "id" => Pleroma.Web.ActivityPub.Utils.generate_object_id(), - "actor" => User.get_by_id(chat.user_id).ap_id, - "to" => [chat.recipient], - "published" => DateTime.utc_now() |> DateTime.to_iso8601() - } - - %Pleroma.Object{ - data: merge_attributes(data, Map.get(attrs, :data, %{})) - } - end - - def chat_message_activity_factory(attrs \\ %{}) do - chat = attrs[:chat] || insert(:chat) - chat_message = attrs[:chat_message] || insert(:chat_message, chat: chat) - - data_attrs = attrs[:data_attrs] || %{} - attrs = Map.drop(attrs, [:chat, :chat_message, :data_attrs]) - - data = - %{ - "id" => Pleroma.Web.ActivityPub.Utils.generate_activity_id(), - "type" => "Create", - "actor" => chat_message.data["actor"], - "to" => chat_message.data["to"], - "object" => chat_message.data["id"], - "published" => DateTime.utc_now() |> DateTime.to_iso8601() - } - |> Map.merge(data_attrs) - - %Pleroma.Activity{ - data: data, - actor: data["actor"], - recipients: data["to"] - } - |> Map.merge(attrs) - end end diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs index e6ad210a2..e4d3512de 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -1513,10 +1513,11 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do describe "GET /api/pleroma/admin/users/:nickname/chats" do setup do user = insert(:user) + recipients = insert_list(3, :user) - insert(:chat, user: user) - insert(:chat, user: user) - insert(:chat, user: user) + Enum.each(recipients, fn recipient -> + CommonAPI.post_chat_message(user, recipient, "yo") + end) %{user: user} end @@ -1531,7 +1532,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do describe "GET /api/pleroma/admin/users/:nickname/chats unauthorized" do setup do user = insert(:user) - insert(:chat, user: user) + recipient = insert(:user) + CommonAPI.post_chat_message(user, recipient, "yo") %{conn: conn} = oauth_access(["read:chats"]) %{conn: conn, user: user} end @@ -1546,7 +1548,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do describe "GET /api/pleroma/admin/users/:nickname/chats unauthenticated" do setup do user = insert(:user) - insert(:chat, user: user) + recipient = insert(:user) + CommonAPI.post_chat_message(user, recipient, "yo") %{conn: build_conn(), user: user} end From 582ad5d4e1587b3dba9d879bd68dd9a315c8446e Mon Sep 17 00:00:00 2001 From: eugenijm Date: Sun, 30 Aug 2020 15:15:14 +0300 Subject: [PATCH 143/182] AdminAPI: Allow to modify Terms of Service and Instance Panel via Admin API --- CHANGELOG.md | 6 + docs/API/admin_api.md | 42 +++++++ .../instance_document_controller.ex | 37 ++++++ .../admin/instance_document_operation.ex | 108 +++++++++++++++++ lib/pleroma/web/instance_document.ex | 62 ++++++++++ lib/pleroma/web/router.ex | 4 + test/fixtures/custom_instance_panel.html | 1 + .../instance_document_controller_test.exs | 112 ++++++++++++++++++ 8 files changed, 372 insertions(+) create mode 100644 lib/pleroma/web/admin_api/controllers/instance_document_controller.ex create mode 100644 lib/pleroma/web/api_spec/operations/admin/instance_document_operation.ex create mode 100644 lib/pleroma/web/instance_document.ex create mode 100644 test/fixtures/custom_instance_panel.html create mode 100644 test/web/admin_api/controllers/instance_document_controller_test.exs diff --git a/CHANGELOG.md b/CHANGELOG.md index f7a372e11..1ec6c11cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,12 @@ switched to a new configuration mechanism, however it was not officially removed ### Added - Rich media failure tracking (along with `:failure_backoff` option). +
+ Admin API Changes + +- Add `PATCH /api/pleroma/admin/instance_document/:document_name` to modify the Terms of Service and Instance Panel HTML pages via Admin API +
+ ### Fixed - Default HTTP adapter not respecting pool setting, leading to possible OOM. - Fixed uploading webp images when the Exiftool Upload Filter is enabled by skipping them diff --git a/docs/API/admin_api.md b/docs/API/admin_api.md index bc96abbf0..eba92dd1f 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -1455,3 +1455,45 @@ Loads json generated from `config/descriptions.exs`. "unread": false } ``` + +## `GET /api/pleroma/admin/instance_document/:document_name` + +### Gets an instance document + +- Authentication: required + +- Response: + +``` json +{ + "url": "https://example.com/instance/panel.html" +} +``` + +## `PATCH /api/pleroma/admin/instance_document/:document_name` +- Params: + - `file` (the file to be uploaded, using multipart form data.) + +### Updates an instance document + +- Authentication: required + +- Response: + +``` json +{ + "url": "https://example.com/instance/panel.html" +} +``` + +## `DELETE /api/pleroma/admin/instance_document/:document_name` + +### Delete an instance document + +- Response: + +``` json +{ + "url": "https://example.com/instance/panel.html" +} +``` diff --git a/lib/pleroma/web/admin_api/controllers/instance_document_controller.ex b/lib/pleroma/web/admin_api/controllers/instance_document_controller.ex new file mode 100644 index 000000000..2144e44ac --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/instance_document_controller.ex @@ -0,0 +1,37 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.InstanceDocumentController do + use Pleroma.Web, :controller + + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.InstanceDocument + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + + action_fallback(Pleroma.Web.AdminAPI.FallbackController) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.InstanceDocumentOperation + + plug(OAuthScopesPlug, %{scopes: ["read"], admin: true} when action == :show) + plug(OAuthScopesPlug, %{scopes: ["write"], admin: true} when action in [:update, :delete]) + + def show(conn, %{name: document_name}) do + with {:ok, url} <- InstanceDocument.get(document_name) do + json(conn, %{"url" => url}) + end + end + + def update(%{body_params: %{file: file}} = conn, %{name: document_name}) do + with {:ok, url} <- InstanceDocument.put(document_name, file.path) do + json(conn, %{"url" => url}) + end + end + + def delete(conn, %{name: document_name}) do + with :ok <- InstanceDocument.delete(document_name) do + json(conn, %{}) + end + end +end diff --git a/lib/pleroma/web/api_spec/operations/admin/instance_document_operation.ex b/lib/pleroma/web/api_spec/operations/admin/instance_document_operation.ex new file mode 100644 index 000000000..e0eb993fb --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/instance_document_operation.ex @@ -0,0 +1,108 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Admin.InstanceDocumentOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Helpers + alias Pleroma.Web.ApiSpec.Schemas.ApiError + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def show_operation do + %Operation{ + tags: ["Admin", "InstanceDocument"], + summary: "Get the instance document", + operationId: "AdminAPI.InstanceDocumentController.show", + security: [%{"oAuth" => ["read"]}], + parameters: [ + Operation.parameter(:name, :path, %Schema{type: :string}, "The document name", + required: true + ) + | Helpers.admin_api_params() + ], + responses: %{ + 200 => Operation.response("InstanceDocument", "application/json", instance_document()), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 403 => Operation.response("Forbidden", "application/json", ApiError), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def update_operation do + %Operation{ + tags: ["Admin", "InstanceDocument"], + summary: "Update the instance document", + operationId: "AdminAPI.InstanceDocumentController.update", + security: [%{"oAuth" => ["write"]}], + requestBody: Helpers.request_body("Parameters", update_request()), + parameters: [ + Operation.parameter(:name, :path, %Schema{type: :string}, "The document name", + required: true + ) + | Helpers.admin_api_params() + ], + responses: %{ + 200 => Operation.response("InstanceDocument", "application/json", instance_document()), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 403 => Operation.response("Forbidden", "application/json", ApiError), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + defp update_request do + %Schema{ + title: "UpdateRequest", + description: "POST body for uploading the file", + type: :object, + required: [:file], + properties: %{ + file: %Schema{ + type: :string, + format: :binary, + description: "The file to be uploaded, using multipart form data." + } + } + } + end + + def delete_operation do + %Operation{ + tags: ["Admin", "InstanceDocument"], + summary: "Get the instance document", + operationId: "AdminAPI.InstanceDocumentController.delete", + security: [%{"oAuth" => ["write"]}], + parameters: [ + Operation.parameter(:name, :path, %Schema{type: :string}, "The document name", + required: true + ) + | Helpers.admin_api_params() + ], + responses: %{ + 200 => Operation.response("InstanceDocument", "application/json", instance_document()), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 403 => Operation.response("Forbidden", "application/json", ApiError), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + defp instance_document do + %Schema{ + title: "InstanceDocument", + type: :object, + properties: %{ + url: %Schema{type: :string} + }, + example: %{ + "url" => "https://example.com/static/terms-of-service.html" + } + } + end +end diff --git a/lib/pleroma/web/instance_document.ex b/lib/pleroma/web/instance_document.ex new file mode 100644 index 000000000..969a44e41 --- /dev/null +++ b/lib/pleroma/web/instance_document.ex @@ -0,0 +1,62 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.InstanceDocument do + alias Pleroma.Config + alias Pleroma.Web.Endpoint + + @instance_documents %{ + "terms-of-service" => "/static/terms-of-service.html", + "instance-panel" => "/instance/panel.html" + } + + @spec get(String.t()) :: {:ok, String.t()} | {:error, atom()} + def get(document_name) do + case Map.fetch(@instance_documents, document_name) do + {:ok, path} -> {:ok, Path.join(Endpoint.url(), path)} + _ -> {:error, :not_found} + end + end + + @spec put(String.t(), String.t()) :: {:ok, String.t()} | {:error, atom()} + def put(document_name, origin_path) do + with {_, {:ok, destination_path}} <- + {:instance_document, Map.fetch(@instance_documents, document_name)}, + :ok <- put_file(origin_path, destination_path) do + {:ok, Path.join(Endpoint.url(), destination_path)} + else + {:instance_document, :error} -> {:error, :not_found} + error -> error + end + end + + @spec delete(String.t()) :: :ok | {:error, atom()} + def delete(document_name) do + with {_, {:ok, path}} <- {:instance_document, Map.fetch(@instance_documents, document_name)}, + instance_static_dir_path <- instance_static_dir(path), + :ok <- File.rm(instance_static_dir_path) do + :ok + else + {:instance_document, :error} -> {:error, :not_found} + {:error, :enoent} -> {:error, :not_found} + error -> error + end + end + + defp put_file(origin_path, destination_path) do + with destination <- instance_static_dir(destination_path), + {_, :ok} <- {:mkdir_p, File.mkdir_p(Path.dirname(destination))}, + {_, {:ok, _}} <- {:copy, File.copy(origin_path, destination)} do + :ok + else + {error, _} -> {:error, error} + end + end + + defp instance_static_dir(filename) do + [:instance, :static_dir] + |> Config.get!() + |> Path.join(filename) + end +end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index e4440d442..a4a58c2c4 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -182,6 +182,10 @@ defmodule Pleroma.Web.Router do get("/instances/:instance/statuses", AdminAPIController, :list_instance_statuses) + get("/instance_document/:name", InstanceDocumentController, :show) + patch("/instance_document/:name", InstanceDocumentController, :update) + delete("/instance_document/:name", InstanceDocumentController, :delete) + patch("/users/confirm_email", AdminAPIController, :confirm_email) patch("/users/resend_confirmation_email", AdminAPIController, :resend_confirmation_email) diff --git a/test/fixtures/custom_instance_panel.html b/test/fixtures/custom_instance_panel.html new file mode 100644 index 000000000..6371a1e43 --- /dev/null +++ b/test/fixtures/custom_instance_panel.html @@ -0,0 +1 @@ +

Custom instance panel

\ No newline at end of file diff --git a/test/web/admin_api/controllers/instance_document_controller_test.exs b/test/web/admin_api/controllers/instance_document_controller_test.exs new file mode 100644 index 000000000..60dcc9dff --- /dev/null +++ b/test/web/admin_api/controllers/instance_document_controller_test.exs @@ -0,0 +1,112 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.InstanceDocumentControllerTest do + use Pleroma.Web.ConnCase, async: true + import Pleroma.Factory + alias Pleroma.Config + + @dir "test/tmp/instance_static" + @default_instance_panel ~s(

Welcome to Pleroma!

) + + setup do + File.mkdir_p!(@dir) + on_exit(fn -> File.rm_rf(@dir) end) + end + + setup do: clear_config([:instance, :static_dir], @dir) + + setup do + admin = insert(:user, is_admin: true) + token = insert(:oauth_admin_token, user: admin) + + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, token) + + {:ok, %{admin: admin, token: token, conn: conn}} + end + + describe "GET /api/pleroma/admin/instance_document/:name" do + test "return the instance document url", %{conn: conn} do + conn = get(conn, "/api/pleroma/admin/instance_document/instance-panel") + + assert %{"url" => url} = json_response_and_validate_schema(conn, 200) + index = get(build_conn(), url) + response = html_response(index, 200) + assert String.contains?(response, @default_instance_panel) + end + + test "it returns 403 if requested by a non-admin" do + non_admin_user = insert(:user) + token = insert(:oauth_token, user: non_admin_user) + + conn = + build_conn() + |> assign(:user, non_admin_user) + |> assign(:token, token) + |> get("/api/pleroma/admin/instance_document/instance-panel") + + assert json_response(conn, :forbidden) + end + + test "it returns 404 if the instance document with the given name doesn't exist", %{ + conn: conn + } do + conn = get(conn, "/api/pleroma/admin/instance_document/1234") + + assert json_response_and_validate_schema(conn, 404) + end + end + + describe "PATCH /api/pleroma/admin/instance_document/:name" do + test "uploads the instance document", %{conn: conn} do + image = %Plug.Upload{ + content_type: "text/html", + path: Path.absname("test/fixtures/custom_instance_panel.html"), + filename: "custom_instance_panel.html" + } + + conn = + conn + |> put_req_header("content-type", "multipart/form-data") + |> patch("/api/pleroma/admin/instance_document/instance-panel", %{ + "file" => image + }) + + assert %{"url" => url} = json_response_and_validate_schema(conn, 200) + index = get(build_conn(), url) + assert html_response(index, 200) == "

Custom instance panel

" + end + end + + describe "DELETE /api/pleroma/admin/instance_document/:name" do + test "deletes the instance document", %{conn: conn} do + File.mkdir!(@dir <> "/instance/") + File.write!(@dir <> "/instance/panel.html", "Custom instance panel") + + conn_resp = + conn + |> get("/api/pleroma/admin/instance_document/instance-panel") + + assert %{"url" => url} = json_response_and_validate_schema(conn_resp, 200) + index = get(build_conn(), url) + assert html_response(index, 200) == "Custom instance panel" + + conn + |> delete("/api/pleroma/admin/instance_document/instance-panel") + |> json_response_and_validate_schema(200) + + conn_resp = + conn + |> get("/api/pleroma/admin/instance_document/instance-panel") + + assert %{"url" => url} = json_response_and_validate_schema(conn_resp, 200) + index = get(build_conn(), url) + response = html_response(index, 200) + assert String.contains?(response, @default_instance_panel) + end + end +end From f58262c673616661baf9750c216a07d239ae99c3 Mon Sep 17 00:00:00 2001 From: stwf Date: Thu, 17 Sep 2020 09:48:17 -0400 Subject: [PATCH 144/182] add description to changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75357f05e..a7a4f08ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Renamed `:await_up_timeout` in `:connections_pool` namespace to `:connect_timeout`, old name is deprecated. - Renamed `:timeout` in `pools` namespace to `:recv_timeout`, old name is deprecated. +- The `discoverable` field in the `User` struct will now add a NOINDEX metatag to profile pages when false. ### Removed From c711a2b15761db9d2d30035e9fee0783f0bf77b0 Mon Sep 17 00:00:00 2001 From: eugenijm Date: Thu, 17 Sep 2020 16:54:38 +0300 Subject: [PATCH 145/182] Return the file content for `GET /api/pleroma/admin/instance_document/:document_name` --- docs/API/admin_api.md | 12 ++++++------ .../controllers/instance_document_controller.ex | 8 ++++++-- .../admin/instance_document_operation.ex | 9 ++++++++- lib/pleroma/web/instance_document.ex | 2 +- .../instance_document_controller_test.exs | 16 +++++----------- 5 files changed, 26 insertions(+), 21 deletions(-) diff --git a/docs/API/admin_api.md b/docs/API/admin_api.md index eba92dd1f..7992db58f 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -1458,23 +1458,23 @@ Loads json generated from `config/descriptions.exs`. ## `GET /api/pleroma/admin/instance_document/:document_name` -### Gets an instance document +### Get an instance document - Authentication: required - Response: -``` json -{ - "url": "https://example.com/instance/panel.html" -} +Returns the content of the document + +```html +

Instance panel

``` ## `PATCH /api/pleroma/admin/instance_document/:document_name` - Params: - `file` (the file to be uploaded, using multipart form data.) -### Updates an instance document +### Update an instance document - Authentication: required diff --git a/lib/pleroma/web/admin_api/controllers/instance_document_controller.ex b/lib/pleroma/web/admin_api/controllers/instance_document_controller.ex index 2144e44ac..504d9b517 100644 --- a/lib/pleroma/web/admin_api/controllers/instance_document_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/instance_document_controller.ex @@ -5,6 +5,7 @@ defmodule Pleroma.Web.AdminAPI.InstanceDocumentController do use Pleroma.Web, :controller + alias Pleroma.Plugs.InstanceStatic alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Web.InstanceDocument @@ -18,8 +19,11 @@ defmodule Pleroma.Web.AdminAPI.InstanceDocumentController do plug(OAuthScopesPlug, %{scopes: ["write"], admin: true} when action in [:update, :delete]) def show(conn, %{name: document_name}) do - with {:ok, url} <- InstanceDocument.get(document_name) do - json(conn, %{"url" => url}) + with {:ok, url} <- InstanceDocument.get(document_name), + {:ok, content} <- File.read(InstanceStatic.file_path(url)) do + conn + |> put_resp_content_type("text/html") + |> send_resp(200, content) end end diff --git a/lib/pleroma/web/api_spec/operations/admin/instance_document_operation.ex b/lib/pleroma/web/api_spec/operations/admin/instance_document_operation.ex index e0eb993fb..a120ff4e8 100644 --- a/lib/pleroma/web/api_spec/operations/admin/instance_document_operation.ex +++ b/lib/pleroma/web/api_spec/operations/admin/instance_document_operation.ex @@ -26,7 +26,7 @@ defmodule Pleroma.Web.ApiSpec.Admin.InstanceDocumentOperation do | Helpers.admin_api_params() ], responses: %{ - 200 => Operation.response("InstanceDocument", "application/json", instance_document()), + 200 => document_content(), 400 => Operation.response("Bad Request", "application/json", ApiError), 403 => Operation.response("Forbidden", "application/json", ApiError), 404 => Operation.response("Not Found", "application/json", ApiError) @@ -105,4 +105,11 @@ defmodule Pleroma.Web.ApiSpec.Admin.InstanceDocumentOperation do } } end + + defp document_content do + Operation.response("InstanceDocumentContent", "text/html", %Schema{ + type: :string, + example: "

Instance panel

" + }) + end end diff --git a/lib/pleroma/web/instance_document.ex b/lib/pleroma/web/instance_document.ex index 969a44e41..df5caebf0 100644 --- a/lib/pleroma/web/instance_document.ex +++ b/lib/pleroma/web/instance_document.ex @@ -14,7 +14,7 @@ defmodule Pleroma.Web.InstanceDocument do @spec get(String.t()) :: {:ok, String.t()} | {:error, atom()} def get(document_name) do case Map.fetch(@instance_documents, document_name) do - {:ok, path} -> {:ok, Path.join(Endpoint.url(), path)} + {:ok, path} -> {:ok, path} _ -> {:error, :not_found} end end diff --git a/test/web/admin_api/controllers/instance_document_controller_test.exs b/test/web/admin_api/controllers/instance_document_controller_test.exs index 60dcc9dff..5f7b042f6 100644 --- a/test/web/admin_api/controllers/instance_document_controller_test.exs +++ b/test/web/admin_api/controllers/instance_document_controller_test.exs @@ -33,10 +33,8 @@ defmodule Pleroma.Web.AdminAPI.InstanceDocumentControllerTest do test "return the instance document url", %{conn: conn} do conn = get(conn, "/api/pleroma/admin/instance_document/instance-panel") - assert %{"url" => url} = json_response_and_validate_schema(conn, 200) - index = get(build_conn(), url) - response = html_response(index, 200) - assert String.contains?(response, @default_instance_panel) + assert content = html_response(conn, 200) + assert String.contains?(content, @default_instance_panel) end test "it returns 403 if requested by a non-admin" do @@ -91,9 +89,7 @@ defmodule Pleroma.Web.AdminAPI.InstanceDocumentControllerTest do conn |> get("/api/pleroma/admin/instance_document/instance-panel") - assert %{"url" => url} = json_response_and_validate_schema(conn_resp, 200) - index = get(build_conn(), url) - assert html_response(index, 200) == "Custom instance panel" + assert html_response(conn_resp, 200) == "Custom instance panel" conn |> delete("/api/pleroma/admin/instance_document/instance-panel") @@ -103,10 +99,8 @@ defmodule Pleroma.Web.AdminAPI.InstanceDocumentControllerTest do conn |> get("/api/pleroma/admin/instance_document/instance-panel") - assert %{"url" => url} = json_response_and_validate_schema(conn_resp, 200) - index = get(build_conn(), url) - response = html_response(index, 200) - assert String.contains?(response, @default_instance_panel) + assert content = html_response(conn_resp, 200) + assert String.contains?(content, @default_instance_panel) end end end From db80b9d630f9fc72ebc269cb24142501116c269a Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 17 Sep 2020 16:13:21 +0300 Subject: [PATCH 146/182] RichMedia: Fix log spam on failures and resetting TTL on cached errors --- lib/pleroma/web/rich_media/parser.ex | 67 +++++++++++++++++++--------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/lib/pleroma/web/rich_media/parser.ex b/lib/pleroma/web/rich_media/parser.ex index 33f6f1fa1..c70d2fdba 100644 --- a/lib/pleroma/web/rich_media/parser.ex +++ b/lib/pleroma/web/rich_media/parser.ex @@ -20,36 +20,61 @@ defmodule Pleroma.Web.RichMedia.Parser do with {:ok, data} <- get_cached_or_parse(url), {:ok, _} <- set_ttl_based_on_image(data, url) do {:ok, data} - else - {:error, {:invalid_metadata, data}} = e -> - Logger.debug(fn -> "Incomplete or invalid metadata for #{url}: #{inspect(data)}" end) - e - - error -> - Logger.error(fn -> "Rich media error for #{url}: #{inspect(error)}" end) - error end end defp get_cached_or_parse(url) do - case Cachex.fetch!(:rich_media_cache, url, fn _ -> {:commit, parse_url(url)} end) do - {:ok, _data} = res -> - res + case Cachex.fetch(:rich_media_cache, url, fn -> + case parse_url(url) do + {:ok, _} = res -> + {:commit, res} - {:error, :body_too_large} = e -> - e + {:error, reason} = e -> + # Unfortunately we have to log errors here, instead of doing that + # along with ttl setting at the bottom. Otherwise we can get log spam + # if more than one process was waiting for the rich media card + # while it was generated. Ideally we would set ttl here as well, + # so we don't override it number_of_waiters_on_generation + # times, but one, obviously, can't set ttl for not-yet-created entry + # and Cachex doesn't support returning ttl from the fetch callback. + log_error(url, reason) + {:commit, e} + end + end) do + {action, res} when action in [:commit, :ok] -> + case res do + {:ok, _data} = res -> + res - {:error, {:content_type, _}} = e -> - e + {:error, reason} = e -> + if action == :commit, do: set_error_ttl(url, reason) + e + end - # The TTL is not set for the errors above, since they are unlikely to change - # with time - {:error, _} = e -> - ttl = Pleroma.Config.get([:rich_media, :failure_backoff], 60_000) - Cachex.expire(:rich_media_cache, url, ttl) - e + {:error, e} -> + {:error, {:cachex_error, e}} end end + + defp set_error_ttl(_url, :body_too_large), do: :ok + defp set_error_ttl(_url, {:content_type, _}), do: :ok + + # The TTL is not set for the errors above, since they are unlikely to change + # with time + + defp set_error_ttl(url, _reason) do + ttl = Pleroma.Config.get([:rich_media, :failure_backoff], 60_000) + Cachex.expire(:rich_media_cache, url, ttl) + :ok + end + + defp log_error(url, {:invalid_metadata, data}) do + Logger.debug(fn -> "Incomplete or invalid metadata for #{url}: #{inspect(data)}" end) + end + + defp log_error(url, reason) do + Logger.warn(fn -> "Rich media error for #{url}: #{inspect(reason)}" end) + end end @doc """ From 7cdbd91d83c02a79c22783ca489ef82e82b31a51 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Thu, 17 Sep 2020 17:13:40 +0300 Subject: [PATCH 147/182] [#2497] Configurability of :min_content_length (preview proxy). Refactoring, documentation, tests. --- config/config.exs | 3 +- config/description.exs | 12 +- docs/configuration/cheatsheet.md | 8 + lib/pleroma/helpers/media_helper.ex | 1 + .../web/media_proxy/media_proxy_controller.ex | 90 +++--- test/fixtures/image.gif | Bin 0 -> 1001718 bytes test/fixtures/image.png | Bin 0 -> 104426 bytes .../media_proxy_controller_test.exs | 278 +++++++++++++++++- 8 files changed, 329 insertions(+), 63 deletions(-) create mode 100755 test/fixtures/image.gif create mode 100755 test/fixtures/image.png diff --git a/config/config.exs b/config/config.exs index 2ca2236a9..98c31ef86 100644 --- a/config/config.exs +++ b/config/config.exs @@ -444,7 +444,8 @@ config :pleroma, :media_preview_proxy, enabled: false, thumbnail_max_width: 600, thumbnail_max_height: 600, - image_quality: 85 + image_quality: 85, + min_content_length: 100 * 1024 config :pleroma, :chat, enabled: true diff --git a/config/description.exs b/config/description.exs index 79e3cc259..4a5d5f2ea 100644 --- a/config/description.exs +++ b/config/description.exs @@ -1961,17 +1961,25 @@ config :pleroma, :config_description, [ %{ key: :thumbnail_max_width, type: :integer, - description: "Max width of preview thumbnail." + description: + "Max width of preview thumbnail for images (video preview always has original dimensions)." }, %{ key: :thumbnail_max_height, type: :integer, - description: "Max height of preview thumbnail." + description: + "Max height of preview thumbnail for images (video preview always has original dimensions)." }, %{ key: :image_quality, type: :integer, description: "Quality of the output. Ranges from 0 (min quality) to 100 (max quality)." + }, + %{ + key: :min_content_length, + type: :integer, + description: + "Min content length to perform preview, in bytes. If greater than 0, media smaller in size will be served as is, without thumbnailing." } ] }, diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 054b8fe43..d7c342383 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -314,6 +314,14 @@ This section describe PWA manifest instance-specific values. Currently this opti * `enabled`: Enables purge cache * `provider`: Which one of the [purge cache strategy](#purge-cache-strategy) to use. +## :media_preview_proxy + +* `enabled`: Enables proxying of remote media preview to the instance’s proxy. Requires enabled media proxy (`media_proxy/enabled`). +* `thumbnail_max_width`: Max width of preview thumbnail for images (video preview always has original dimensions). +* `thumbnail_max_height`: Max height of preview thumbnail for images (video preview always has original dimensions). +* `image_quality`: Quality of the output. Ranges from 0 (min quality) to 100 (max quality). +* `min_content_length`: Min content length to perform preview, in bytes. If greater than 0, media smaller in size will be served as is, without thumbnailing. + ### Purge cache strategy #### Pleroma.Web.MediaProxy.Invalidation.Script diff --git a/lib/pleroma/helpers/media_helper.ex b/lib/pleroma/helpers/media_helper.ex index 9b7348ee2..b6f35a24b 100644 --- a/lib/pleroma/helpers/media_helper.ex +++ b/lib/pleroma/helpers/media_helper.ex @@ -58,6 +58,7 @@ defmodule Pleroma.Helpers.MediaHelper do defp prepare_image_resize_args(_), do: {:error, :missing_options} + # Note: video thumbnail is intentionally not resized (always has original dimensions) def video_framegrab(url) do with executable when is_binary(executable) <- System.find_executable("ffmpeg"), {:ok, env} <- HTTP.get(url, [], pool: :media), diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index fe279e964..90651ed9b 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -12,8 +12,6 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do alias Pleroma.Web.MediaProxy alias Plug.Conn - @min_content_length_for_preview 100 * 1024 - def remote(conn, %{"sig" => sig64, "url" => url64}) do with {_, true} <- {:enabled, MediaProxy.enabled?()}, {:ok, url} <- MediaProxy.decode_url(sig64, url64), @@ -37,7 +35,8 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do def preview(%Conn{} = conn, %{"sig" => sig64, "url" => url64}) do with {_, true} <- {:enabled, MediaProxy.preview_enabled?()}, - {:ok, url} <- MediaProxy.decode_url(sig64, url64) do + {:ok, url} <- MediaProxy.decode_url(sig64, url64), + :ok <- MediaProxy.verify_request_path_and_url(conn, url) do handle_preview(conn, url) else {:enabled, false} -> @@ -59,8 +58,25 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do content_type = Tesla.get_header(head_response, "content-type") content_length = Tesla.get_header(head_response, "content-length") content_length = content_length && String.to_integer(content_length) + static = conn.params["static"] in ["true", true] - handle_preview(content_type, content_length, conn, media_proxy_url) + cond do + static and content_type == "image/gif" -> + handle_jpeg_preview(conn, media_proxy_url) + + static -> + drop_static_param_and_redirect(conn) + + content_type == "image/gif" -> + redirect(conn, external: media_proxy_url) + + min_content_length_for_preview() > 0 and content_length > 0 and + content_length < min_content_length_for_preview() -> + redirect(conn, external: media_proxy_url) + + true -> + handle_preview(content_type, conn, media_proxy_url) + end else # If HEAD failed, redirecting to media proxy URI doesn't make much sense; returning an error {_, %{status: status}} -> @@ -74,58 +90,27 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end - defp handle_preview( - "image/gif" = _content_type, - _content_length, - %{params: %{"static" => static}} = conn, - media_proxy_url - ) - when static in ["true", true] do - handle_jpeg_preview(conn, media_proxy_url) - end - - defp handle_preview( - _content_type, - _content_length, - %{params: %{"static" => static}} = conn, - _media_proxy_url - ) - when static in ["true", true] do - uri_without_static_param = UriHelper.modify_uri_params(current_url(conn), %{}, ["static"]) - redirect(conn, external: uri_without_static_param) - end - - defp handle_preview("image/gif" = _content_type, _content_length, conn, media_proxy_url) do - redirect(conn, external: media_proxy_url) - end - - defp handle_preview("image/" <> _ = _content_type, content_length, conn, media_proxy_url) - when is_integer(content_length) and content_length > 0 and - content_length < @min_content_length_for_preview do - redirect(conn, external: media_proxy_url) - end - - defp handle_preview("image/png" <> _ = _content_type, _content_length, conn, media_proxy_url) do + defp handle_preview("image/png" <> _ = _content_type, conn, media_proxy_url) do handle_png_preview(conn, media_proxy_url) end - defp handle_preview("image/" <> _ = _content_type, _content_length, conn, media_proxy_url) do + defp handle_preview("image/" <> _ = _content_type, conn, media_proxy_url) do handle_jpeg_preview(conn, media_proxy_url) end - defp handle_preview("video/" <> _ = _content_type, _content_length, conn, media_proxy_url) do + defp handle_preview("video/" <> _ = _content_type, conn, media_proxy_url) do handle_video_preview(conn, media_proxy_url) end - defp handle_preview(_unsupported_content_type, _content_length, conn, media_proxy_url) do + defp handle_preview(_unsupported_content_type, conn, media_proxy_url) do fallback_on_preview_error(conn, media_proxy_url) end defp handle_png_preview(conn, media_proxy_url) do quality = Config.get!([:media_preview_proxy, :image_quality]) + {thumbnail_max_width, thumbnail_max_height} = thumbnail_max_dimensions() - with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(), - {:ok, thumbnail_binary} <- + with {:ok, thumbnail_binary} <- MediaHelper.image_resize( media_proxy_url, %{ @@ -146,9 +131,9 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do defp handle_jpeg_preview(conn, media_proxy_url) do quality = Config.get!([:media_preview_proxy, :image_quality]) + {thumbnail_max_width, thumbnail_max_height} = thumbnail_max_dimensions() - with {thumbnail_max_width, thumbnail_max_height} <- thumbnail_max_dimensions(), - {:ok, thumbnail_binary} <- + with {:ok, thumbnail_binary} <- MediaHelper.image_resize( media_proxy_url, %{max_width: thumbnail_max_width, max_height: thumbnail_max_height, quality: quality} @@ -174,6 +159,15 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end end + defp drop_static_param_and_redirect(conn) do + uri_without_static_param = + conn + |> current_url() + |> UriHelper.modify_uri_params(%{}, ["static"]) + + redirect(conn, external: uri_without_static_param) + end + defp fallback_on_preview_error(conn, media_proxy_url) do redirect(conn, external: media_proxy_url) end @@ -189,7 +183,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do end defp thumbnail_max_dimensions do - config = Config.get([:media_preview_proxy], []) + config = media_preview_proxy_config() thumbnail_max_width = Keyword.fetch!(config, :thumbnail_max_width) thumbnail_max_height = Keyword.fetch!(config, :thumbnail_max_height) @@ -197,6 +191,14 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do {thumbnail_max_width, thumbnail_max_height} end + defp min_content_length_for_preview do + Keyword.get(media_preview_proxy_config(), :min_content_length, 0) + end + + defp media_preview_proxy_config do + Config.get!([:media_preview_proxy]) + end + defp media_proxy_opts do Config.get([:media_proxy, :proxy_opts], []) end diff --git a/test/fixtures/image.gif b/test/fixtures/image.gif new file mode 100755 index 0000000000000000000000000000000000000000..9df64778b72095084f03e1dcb7b57273e58ce8db GIT binary patch literal 1001718 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

%H5hnvklC*(fI6Km5M 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

^RR;~g4OL)a* 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

lk! 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�ql(z{~+K9^;8w^V)wH#m)Cg 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 z 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 z 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

r4s(j3HLMhnu<50`W@q0(kF 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�leolrs78beH$2L$Pj8>%VDIljlObO#x zFlBlU3n@*^mm`27!WnYYz~`|g;@S^I;YOZk-udoO%?o~JJbeA4;Pbs4U435ZsT>p6 zn2?Q7(@RCRw`-Z@$k_NGFfR^fKrDK~4o#;buK5+!BhgJBMbA9)?oA^*rjhlOyz>c2 zOi$iMH_&tuCD;={Ns2m$1tu0kVI1+xn2_`D){62Tr` z=3s$#7*)E_ja$#Z?8>yFd<)P82dOQTy+%a{`GLN$m)F%7JwGk0Mxw=~stbP>%{;&eg$0l6hkLPy%)GNM(|sU6>H6n~s}2FeV*oYd&5>?- zqUlkZS(wwi@i18$-roZdw(;!}$~}5lc#T61f(2z|$|`V_3lU)Pp0L`?Dy1S>gUi#Z z8yrxV3xwtjs9l6qg!AJf+|SnY=EBl0`;m>LDgyk%z1eGq;|sJ2VEUP0yP2BHA2lP2 zCJsjrtSp|OGoh}YkZw`1B>^fel_QOZ>m;T8UWzwaerP13lt>KWt>a=+G)YRv-6 zB1YE&FE8%!>< zVQMn?)_H7m(S3GA<2=$x%&O6q11M(xWWW>ZLx7mKJh`v}j5p+bxl@}bk{WdnFkf`z zu($TwiSM$3Ga7>|Afi0+ZJQ0SGzwySra7^wDg#xX!T~j)fC^s5u3Sz6ksCz1DM$$p zmiZI8+!EVN$s^Pvi+g}SJ;4qe^}lDHIoAeCPFBCjbL;r!>iZHlC<^Q=f=UAlF`TU( zy0xEQrpy*)u78PG;E4R-Rz`Qx%FhCJAt38A!6_|>v_(V;1@YiFYI6qcOKqmwR4Fu6 zQIk=!5l;(_>zgUa<+rJ+jgYLx;L^Sx9(~yIV&2dbk`w^k%xE;1AD(yIVK!BL+pzD~ z6H^PrMutV0RYXfF@{wa>iU2O=7F=MB)a79t+y){-$N(!T*aI{&HM1=fJCI80j{4ml z+g~LF=t(C->L_W6vyhZo$I!qQthl#osq4a+EhHR(IggErhJocZi)C@M%4) zpNhz!5L166)KbC`iQzx;B1JY)*+26iA4ghWE_EnHKK}QsrpD0ZhrslZ3-B}>Do21M z5+G*e3^HVo|C12?5)- ze!q#tlL6`N32`FoG#n*V+}ulURyiGbo*8?FME{o>j(HoI(w|7D5cgOYmerE0EEc6} z(+9cJCmz~IE8jQEUooO)| zVYZui=GUFJIJ1*6mR$nKNA3%>WQAI zy70(a*CQP^A&W76JC_nu5*JDLUv3P#JQ?NKRDMzLCt?$pxw*PjYNS%eUOdAL1+bkW z)F`w^c)A?`asflPzerm{nC-S3x%@N3WVAi>XRSRG?WT(M#BKLuG0cPAsf%a}TI93L zI?3%^4bSqA$X;8~-PQgq{*tQr2cU1^MH{84+rn`>gUDTJ*@ z9b2Y#$irCA(y^_FnBUPFBAMUC_r9e$7z$_uS|Ba}T6xG2QQ{g(?iq-&2!9Krme{tSewl&Vuj%PcZ{|XY_o@E9}X>c z94b|ko#i0wmfWloAEYj+vsGeKB+K96jRHgILvu{Dhue?rE}o=ahbWEcP9|AMncx zl)IVnJFJwOqZM$`=hye2?jQ!R2-)~ba|D?EH%Pm^NZX?JzT?*Wv=(&F-|haWwqd$i zaC4id{re{T8dFo7OBCA8es`**d6VvG3kHe3)ddGgi&gxCqWjfL%CsJnP{&Ej|P ztur6viT>0{m%-+{yR*YX3syt4HG~1^%`-;30nqJr{g`!opEmcBGYQ+ejhQc=kBYXh z_Nhc9^0Frt19pS;ldju;k`Fa(^nwJ5p1awcd(R9z81jO=`zwadQy0tur=WBIyy24e z6!hxHZp%?70S((lJj1QOHCf*zcPkSA32+`SwV<;1Xa@0L8XX5Z?N0MdzKEhRDq(dV z=6*{fI*2uKJK;s1EAqaO29o>4?HpkPE2*XNSY)l9L5`L)eNwh)MzQSl#dm!=xN(u( zi`5a*SiA{C(7}kN9;gy(E^01(n>-HU(`j?bS_<;ut`IPoyG|hE)*3CYcpq)8y}$D` zVmw{IcKw5OhsWAeS3?%ce=>egg5R_F+CKB$?o+jeA{naeN#TdQC0^_D+ z&+L-d4y|&3vNsN={`(czF(Y$4U!#?OQd}s*w_4B6ZD+n1te(tx*LDt(qJ1eUSdU9K z2Q|tIQLounAWk#UR9aqgCN3t`6egEg6<)S&a^=V!w63|;)I$Z(L) z+OvDluHvd>6?^=*L%RRHGOg2w%Bjp=c3WRdc4iq1y1s~W2t$a&^`6v2+lT2M)X=Zu zz%SZO%SN8%w2H@SF%4^3`(&-!L`?C>-10l*HMhcR=k7`!G|RIn(BGotawDF z9h22elkEwAQ~0aP19nqSFVZ#NmhQVGh2vqOM!sFxb$lT{XJ0$b9wvIJCu8}`<^>t0 z{LMRe$zVVJTAx;9O`g8;(W<5nhx!tYslKYKc9s?10-0*bBvqw1b($E%CGS+JTO9D$ zMG?E*q7D;_mRQ!W7p>z{{#a5nrYustE2<*aJ1RYU*3h{=D1arsHa7g`=~jGC@Avz8 z`+%iyd4Ns5*Ex19qCYvoq4Ym;;)GpdP3P&B=bqh?ISlEz_W;?GZy+WRW_HW)t`@D# zEmc=+!mZ{P@|N6+HT!tW)B}3X!VUgAbRn_&3Unb*QxIPh5eO4AVv|deEUP})5Gb#1 zAU3vn%Bi?l?Rsu~Tka2WuYCRh&2YU^1j<1B4Roi&-_gUH70kzX=}mTLi{&r!7M9K= zYpvm$Z=mn2G?~$8M||5OMZ7z@*8Mspf@&&fubuP10OExSkFys~A(IZ%^iv2Gl6 zt}t2P@*peead;e^m9`a2^fbH0s*J3*q#Q-upD+ zv-F8>?bWcbk~ZsDE)L2pAnvQcdeyDI`E`be>yDr?!6jN?THu@)ool;J7g*gv3cSTj z&3@`Eu~Ok{qakJkehCIh;+&;B8?{%?7@qp~da)h=R(U^FU$Vb2;?u0IUzM$-Pg~3s z^f@?~tM+8&@I|J^u2wnxfSk$ok2m|)0BQNYze&WGWXM+(#IXmAJT*(>w-gz<%@}2V z^A^oL#aW~QceHEVtkY8vdQqP<6<-QO9TA;HQ1c-n#4_u86*`wH@K{hZYK@j~|3F8A zP5qkI#{uicJ2cooFMkR1jIFpf<6bGVrGd*1}YD>XV7E5)Dh^a*I2Lp*#us#y7U zPS{i=xqZ>9#=WpM%_H1irdTnVDLwN+!7oEXNLCEjrTB?PCH=nO9uu8+&X_Sf%0*$P zqw7hjOlYo_Ex$lbSNF6>_Fl4?%+T|}<-@ed3TiDMLaSi##VD?V7^m-Ybe*d=Hdi4T zX=o!oEBD6)!N@#%8FB&TD``rxPE2M`lVUdq9&(CqqTRRZ7#bTw8Q$ol!z z!ny1xzQHlOk7Z~h1obj&Si*W86wcaElsfgx*vt=TG3nK`@-y@HVhP=QW4F`meFN0O z*-!B0q*e6t_0Yfw4~HilLdNkdz6Ul1uMpL2-n=J?5rJAM=1V9+z#Yb?K}VYR6lY5! zv-D?waG6Va#!5-u%hSmO>V88l7X}9f@%^wSKn<?sD#I>|V>8 zeBse@!2WW>JL=>1%KU@8YZ^B`dVG$lSFp#&-$?!F^&@)hC0#+dL!efF0Ffh<+n)t; z1o0!y(jT-1fEmtn=?8jkx5Lvd%6Q8lS;aD^*TC3qf7Fi(3fYK1!pC!|6B3^FX#4@Kp-&$daV*vU&6-S=&fp z-{M)ET9DLV)Lr(4o~0(U`XvAswftaq)^|I_L&>7wx8UxIjt*Q&>F+zigph{cKipPi z6+I$CHXD@a?%Y~}6>-VBbjyARdr7_=#f63)x=U*&*TtS07V3s;-eUFE_zO1MW zmI{IX+c`$*MFPSlWakYC)#(nL+bQd3U4!4>t}6nfyQ>1|?z6S*e)MXKp*ifkvF#fw z*~?A-*L3gZ`whcQ=bib(}8P&*DuW`5*M?ESEZqnnkk@|Sz`FL)VtOgW> z4M@7PGd~?KHYureCzEk&QB&k%$9k?zHu>Jf%!ji@msg0ZFLmDqRrz>wj7umiZ> zBz?8TO)aSbI{6}cnS%Q#e_o1nw;GjvQkWIHzMUP~@}YF%+GhrUDTknB;*nYr|Hkn6 zTqc*wSV^r!ZC})1hSxYwU17GVvsAkqs&)F zj5nUE{Vt|7ZjTKnuc!*vM~mBBzZOj=iWtfQ*Jn7lN*iQ0g3l*w@%`0{K|CwS)tQVU7UhB1;S&_Y|$FaYYq{YN)q7G&JAnNUnJ4C zkR%ZR%Yi`vUfHUtC-Ym6!xoX2kpgV#e=mwg%_(btOGb}V;2sp}FmDLoDKPm?N zsn}@f!_k{Il$$GKAU;_Qaq74p1@tI2*3`S?5dSUUHqZeqb37! zzc}+nh}%XiEvBQbNA>RA=k^@9IPa;193oV>>KYg72buB|Gj@GPFP$GCD_$g3Px1pw z-Gns%ZL4?3Bs>XvMn9fYS)~#(ATICEVLT)L-%3*@D*uc@*#11;n*gD28~FAfI=q1_;hTm}eTMr^k zkFOy5@-b&G&?-aN!*CF-<7Ag2Weq8eIar!TXe84Lz_c4Og+<%km-P!aqF4qc+5isN(BIUV_(-U(^Rf}A77On%^j)X z@h}#rLUuMFitWah-iy2Zh8-zARha;4Nlah=B6{~JY^%TbgI*p8Qm6{i7QG%+&HV`oT~28!V!1l(fN4g`vk-SNgFxN(C@DEgM?QhJ6o#%5Vtg_pFY ztw%0s+SImtQ<@A=)w_BJXcyKWTwB4Gj@{+ zy>+#4^|~bPy^hw*jqnv_*us!KKj)LWQY?_NX34dn!xDD%T>u zSa=rwPW~%ssw> zCOS2B)6evc)Wb(a9$9meZa2?LmAO;bRT+#7Y>M>;s^T}|sPBY=e3pZ?92OSl8B>(c)<$BfL?zw+R7Vm zk}q5RzoeRCHO*T~QWOyR++lXbDL|*#_P7mk=}(e3Nf~x#(dv_oa|4Zn)ky6W~=Jx9_|taXOQ)At$mF) zhy6C>=`F{>R*poafB=aEsKlfwJW#l-jXA*y5A&%jH4M+b%uE#;z)7Yz+h%pz&Pk~( zwm|g?I3|Sip-7&qzph@DDiKDglcM9C6G0)yFY!LhYiQ`V+su)%K*l-{42KiDfp_4% z#;MTNVzecBZoCAg(4K>GHSI;hXIGCbR-Nqo2ClajtXBUPCs*!r-Qa2GhM7;ryTPhFgH!Os;ZHCACogV6%SXYT?MGxh&#y+ao9?!5XLkrHhCK6ULc8K& z{@5Ii3s|eQ)HFT@PmYU4LmjXfheVLkcZWYQai4sa%LVY?kDPwQk@(%$3fyCqum{^J z2Wah>y&&F_OptUUM5Kj;%sH^{+!EXDkGYW|bsNZ)nW6!zRZ(e!bXm1)!;BEn8g|i7 zBhq4bU&}qk&JkXDwh3a&;%v#*s=PVM>vtdif(=6lF_xIC!Y~$mG=3546|i3lUHcqm zaNAzBuA^kS)DDGpMv;l4Ev9x;2K#uT5uITSzo4wuR!#8KA-;}w5h#5Ml#n{o&^-G4 zBl%x$p5 zR4?^O!*Z87zS(E1(9na;z13**eFXCBcJ`79g3hN|nSWqv@Jup3pGXFn8@12EjJ6o+ zQ@DCUgpE&>0+1OW-;!8+Q|psciapRz&&x?bqI6^n08k7NivOC9{J!*Iaz`7J$f?U9 z1g511A8#k$PHTOZum4k&9B79Yv@SVrgq|F389-ffKcbhop9l8kasJKHc;Ls{R#M*P z_T&zESwqyk& zrVo<+Tg6fYOlSACQsDSx{Cy-ofgKO*<`gGZcRHtwlSH&TD^7j+^2L|tXXf$xt0yc^ z2O2)VQ{oBB@hCVpcb?l;(M>j@-?<;<=3oZZ*jNRd!@$54EU&RA3N{7%#xnkH8vCE@ z!r_oC>zbwHobpF1LqGm=OM0_g`1O)Z0V#9{&)jsZ4Qug!G-hB{5?H4h>-fi~&Eh|LNb`smq$x7l5ZX!LE8LgYxD~1wzPB_43^xt$|S3S5v4DPv-P*^@Kll z7{L=RtJZ|nygo_a1bYhrl(bN$8^k7L`PVI^i6dObRJ}tXT&Wxo7z1M`1>9@E`eiGA z)*&&iK4%(rzHdixBP7vvd`G2FDH_T@nQxk$2ynyY@AQ3F_&K(uDyAgL6-bGdOo4XqN`-HGoR|DCIM6W$~p&!7`A z?_q6~QEg=OW&dCyq|lJQn?TdPPo)^$Q?7_m0=Y&Wt3wpl`_S*e(IvX z?qo_~xqCA#`Flzrxzgmr`{h7j4CZgz*R=QX6#DT_Tdj3yZhM{Xm5Yh4seHXL9+%L?mK6E)fS5#N7IZH z7P?RQqK~fYet5lduf!)cvA{nW8{Lr}N^i_#oWp7QxoOt6RLOX~jXI;XJ=>S^YDhG% zO;3lC>p1k5P=_Uhz(8`&Yzk^L9s_4+Si$6IFT(iv_b699eoJh;js5-e=*>3(0Uu97 z$C*ix+8RwGBT5AwUP;(v&063V8Q?A}@cf@D5?rDZXPE}vv zBBTEy=}%9&LV;@KL}u~Q66a2rHL+)KK@p?jkhR1lVY~K9tt5V9Rs*J&b!OF^z5Wbz zg{_XQ5r0`PWx<`k^EQ+2I+Q6CuFL=Z3LyUbJDhNK-uu4qF6IFc^FjGrBA5heL?a;+_o5?;Co%GLhbb**G9-;F4Z5@g?$ggSXfo6;X2}WE=b7K55jHZP zD0YW4+CTLHwP{N2@7P}ypcC2e2$>DVdb0+&7Ei3z3v_0`vM**mnG2^>R1y-x%eWUM zd{m}xswr_E?Dk$z%ChjBm)mRTob#tIoSdxoKeRbkI^5%CSL$@S-ioaJjx>^2dc=BQ zQmt9o=kx2vmJWAu zzGb4=Or9D7qx^HS`k4aSskBuYD$wQdLI8BYirdZ%Z&R8Nsm@kmm9A;1qIw#zurQ0N z(v^^Gy>gFgcCdCbZouY`jB(n0?U@Hsz4sO1D%Or7 z^A%Q6ausC@Dta$Iv3@usH^E1xXr~``#IknKXy!kDE9|cI4j5ahu$5ZuuvEtr9_-1}gd5sFvMYafsJwWq93J;h73=`0d&!4I}@?JB&#)ErshP z%@0^kK17q*Bpb>6cCNZrD@w_Dg4#-#Z1dheAFckVB;X{9pC*ea2giOwyxrGBIwD(STPy75Q{kmB~q(Z#Bou z5Lh!tB2F_*BQgx}>D%To*RN-2BQXRE;kn)jPUd1?W=lJ*k~3J2$f+4poGVQzwNNv5 z*37~Eg`oGXK;1fItr4^xT*0tk`5Ao@DxY7u_je7Upqzr%2rWMAR3377NCJ_$2g%9$ zeq5zVd*bQ+xNVbE9?iD6B+$4gZMj|FfQC$7b`s<(4Yyqxp z=WJjDu6joQDvx1$(my-3(z2qN*F6Va?V3q40XyzUYg)+e$!w+%?R9;9 z_LO3gj3X(VEVKMu>~x^F> zcT4TfJi0f=-+RtK9+86?UOs%Pq;Adr17*bQ-3(vzO{;eJXDM{OKE?V-n8OHZmGv;9 zK?Y1Ve|#^ZiXNJ&!;~;Tq1sIEp1q^jFO1=9sMP)@x35&`Jz7w8u7x4W*s7S?>$nJk zS=vfTEn2Gc%YI(C_Q-9o9p;(_a!bS0~A!pssRB8zO4Mjlj5Pc%q`HzAuvrrSh{ zS~$I%Sz0qW7cdE4iPkNq)Cu3@d@{A~TWDuDxH{fd?vCQz&3`L3W>x1q-C*@Ca<$P! zXwdGd%+F)=-CZv>tY)TvAT=%^pAwO5uQ%D0U7G)k4 z^Uk=^$wQGDpW(7vuUxvy9JR9MrC7q-_bp*`^*7jVXsLD@q+3C{84IzQej z*;=DhjGhs#5zC@0X>~K{Mx9|a$|vwD%~Y&&njY7+@2va$Y0td|>3H*>5vkAQ>q|Zq z8?sk6=;k~%vg8w07T$`vXOe(W^-@w6dDT*z-zetgAXgOAr8F+R@?AFoY5O{Tj-g1< zaP=^^*w9;mu4GYc<9(m<00@I+_;yI6qBzadw0KT)&i0y{&Mg0B_&4W*8Cw{q!~ByV zxoRIWKZj|HVNHq#vC5HsL!a11&73we+OAFW@Hb0d>XBD(i3k@+!-EeH-)_6R)v0!Z zaO6+9=l2dpX}=cf^Hx2S0haQf#V%zT;1=1#io8f?Tz&qUR5$p*t<>J!Ig;27Il z1S9SHeY5DgrLhn8*_L%5zT0F|i-pqKblrRuh)vxK`zu5g*idbgjsEgIs*>UjYPUR? zODdS8EX0c__v%6Yh1egKvs91W#7fHZSZ~}w1{bFxo9XIO{ZtI#`);+$Ign4t_0Nar zbi5vtTW^jQ{oj1<@r0-^%Vhm+=8)mNK#pK-3hn$yS5^7Z08bL)3_XK2 znyK-_70^Mx#x>O3>~68~s5oN2vwc(EL3rQ!US1$9d1`l)j0(=S&RB$wz4=HV1VXB`u#8<*H(F_-JOm;xQns|`Y)-OT@)1?cr1;<=SHJQZgE2c&NHeP%QB$_(R zi+u5h9xYm!$l9R6YNx?~#E2mQ&>7w~J0eiTDiPv7DgoMFvo@#mOHomS;xwRNUTsvf zl-)hj4x4df!0B<=0a<*91y)edIQmC+d~kO@!Kf`}n{vg+<1#fG3Mi0rdc073ynjJn zRkpT7Hjs=R>w^Rs$HUYrfQ;V@6;ktc`(VH2=cCq_R`>a!3s&?tIzuc@*6bt#=p-_$ zp$AeZnrtAVCZ19ZaO=g}$Wfu-U)c135s+9Dt1~1ar72ukC4IU5A5!3ac50O}_B-cOSPF&~X;f_1g2E_F~8%l1Lp^ zD%4aA9PxejB{)t?Vh2Q~3UunIGqwOw+716$-<3tDx=_~YoX*axj-8#d20yb9cK)Br z9&rUA|8B66sB5=`Wt1|~VXSD7|7H{9zV(3rAGX%Jr^v|yLzT}jdZ8&9;iH(UUG6o) zj0ckS@yCjg8pDB%RxcFnNaJ{U%r2_{^NiKIJ~sOg3jsq-|E(MFqq?d=Cy`caT=3}zyU5b?7dtF3 zzDU6+lfg)oJijSE)5-1wz_SG1tj>`;ERrbUCl3U)E>Gog4k;S>$;xR-GHZ#q#QTzI zWOdZF!-zj*=z${Hxp!^+o%{}hG^;edhFM6l4DEu*y&U`?S5J^*b7XVx9icvv#y$z! zev1Yt0hF`1mUv5Z!7>O*KrzH5S62x#x8nz|y=sFPadFEwQYwS-$hNL7u2XNTQOSSlxNF871Dx|X0SOVW(Upj975{wM zw(HVDjnljr_T_CY_H0kwxJ@A6U#rb)@_f2p7}FAOhNr=SVB-?ZOKkv;ts|Sl-lWar zpT~XIZT;$g4Cwf!!NRI`;4jYL+jJzvc5+^bpi+MPPc?~(9@}VvqB%^p($=Ig+Xnm) z11AKBr=MI2g#0n72bP^w+W;BK6WI0uWT}T|ypq0FLjlKGqyr`-C(YI5L^I>H%l0AxuGW919Jg^P)oU^)-jem9n{P0Loj7wnzTX~ia^ok9)Hoh zi=viv-tp2nbrEA5EPovMzgO|B*(k}+p0^7%VxAx=M=Z)ab&Z0^O*cl@(01IdAaz73 zmED0iK>{a9!x-yZcXYpvR!{+A&QD-J-tX;PSA^fW33FY(Ep zQo{g;P~lks1KdDXpwC@#m?`*_aRiLN*QL{+o`cZpRN! zotyZ}wYGA|B%Ydt@9A?jjD*DNTuzHn$r(Kkgbt>guL$$Hf+~cJCVK^yC*>m`l zAv$eMUUyBA6#(L81P|Ru1y_3So=eTy+B;kl>@@=E*C@J_AcoWL+If+_@sk|#!hhV&y9ZbPPHVWhkqEua`^U$QJ zdG$;N5ZozivO!OR_^dc%6nGqY5V7MS1j70>BGF~@Si;`wA6imE@y8T�dSvXgSMQTo~RhyE1` zA1f}v4$bN9tsQp~^2I(AjXrv;LA%Z)a`pSgH~9q4_LJ_utG7zqR^y4+I!T70FwTb^ zg4Yi$FS`tbfZ{RoT99%D55r@g1Y~u+ zJ8kNWb#;_Ca)ebSgeN5ct@mQ8-o$y31k{wo(+f)eWCYS%PPCuzbq2gmRXGMr{e}f% zKtce10pJ4hgN|n}Yx&=&@NM@)ZGCMj`yy6-<)=ko@)o|8)=$@w%IfvZs31i+VrPHim(8NM=VT zTJKKmXU`qCcQA89ZK;`fP)z~2uW zDF(?Iu9~Uh^iQDu?_)uy&>gM8(I2CwB9o!8H-70At~Mkr`Tb7tQ?M8c3AiB19wQM$ zExZ{-1nj!lGE|Oq;9Zk77n?ViZ?}IBUTOI^IK-M{jEz=<;=*5Bl26rVJl=i`VETxk zmjwJ>B!X0j=m4W2tSszMni-AKOhT|IL=?57wA1K>ZEAc09=cE2l-*TNX*~6Fcxm$G z9{fZC|Mw{-19%%10exZA|N9i*p}Uw_rSmnb)JoWJN(L7Qi`mE=(W5j-$qh$F%^7U1 z?S+)|@JhcN=!k(U?Ocp=w?B8a)=0Q2gkn0-TC_B-c=fJ_wv{>q5BZ`lZlXO2IYMNm z5f7MO85M*5VAorVbB zjt`3yTj2DBM5wrGcA}UlxfKosE0}q&vBPT>q&XzgbvisElbNQ)uGS)^{r-RsUhkED zS}7-k4>=ORRShHQt;B|g6OHDUehP2|Ob^3e<4ZKK`n>bQaBPQE2$+qQJ!opHB;x12 zcU9zp2Kh~0KMeqhooOG%Gh#n5JD^vl~Tff^q%jF1M%`NfTw+E0<$`BV5 zdvEihmR$`V14hWg+I6E@XF}`WQTM|PipiJ+TlT{+;<*Cb?%P-AepZ~b4*$@oMxbpI2HN%`HkYRxWoea$c zEFUyKeP8mmRqcSa=H&<{+gitukNMcBycGf&6|>N;sqW}`c!^zgFo!{>?;+ii#Jl}<)3THR{bPK2a8o4C29&n zUgPr=-HwNAzJGDqAqarQ9Y4IPEC=Osr{oA@$Zo5X*cn5FF6Ad5og}=tt)Odcr@=?A z_Ah}#k!f6w@r-5dAaHChnW#1|^YVAD5bnw0@xYfUchUCFfyPaGhO4@WvK5ZrGNkG)Ds z+n*n1a8p{Pt7O)>x|f=6dB+XjO($;DcqZ?P=N6X&f_d~0$%}~6)$&emVEJWjS_C!I zD6|zpCpxtO+(Uel2=uZT{QFpp)QiZ1cNbY%qw~m|6oC-W@|u^_r!}c1L*Lk2iKPg zV_RK4{w;DraiD`qecu^E3gf7fhX&D6XIBiZ0Hn?Tql3)^(B0JN+->E?iNgutbv{}< zD;!vNf!F`Q!Byd}(%9Ex>LgkUL1ij3&WtLpiM*MkAgeh#*!C0`bPWu)6*^(Q z^%&Z_T*d>>TJ>n=fQa}mKs?Tq4Dj1Or!6Lkompv0o<9qbkNhAiE9#JJF@XOTf@{ZtwVh%E& zP7fVGh(d-AhXeZQb7i(NdRQhsOj@kc)==^u+vtV1nk#igAZp#s|KbBc@A0)@tv6!+iW zBSp%KcviU^>;1T7W*j^%mIsm#ln_3IxO^>(eD0*eg`O4M=+vlL=csDT0Y;L_6(-S; z8__$wv;oKll8ACQ*Z~oET#|f#?=10imHj~Pr%~yPCQiNp*48qcGKJDIF;&}pv(=PM zjelpxu9h_r=QZEtOh=Y%3Pgcw8<@V!rU0UF;V=W`<$byzaAwa+lL=h~hr5%9ts2Lx zOdtTMuJM7oWpR>E+G)Yb)q!Ci!dNXw2gz~Y&k!)e+Mgu%M%d)cLu_}vT}L`?sJbN!pGw6Xq=Pu$3sryUm&!dQD2 zt*~mk+|h-P=M2S^bl@U(!l%E(-_)snEorX_UvnNrMXRZy9rzY}Ovdj&G~R5voE^|P zb(#B?ncW#TlqQ@pIq$XF9cM@sT#NV$4otI{nO#NGEv~mo8PWU*enRTR>ec_>i2CJd z;a}!+xmrp4(+vU)2a+Z91;Rp>+s!sZLP#<;?geLOBf|ELgRd9sXSNz#gIMUluS~BB zlY7#;&}5Y@_L}S(-e06E%6Y81lSPwxMC;Kk#r%7JrUN6ztl@vJ;}a9*L^-r;i1fbM zi;m|PXM*K}t=AHdqR?z>PyamXmsJJYc>A~PPTE8oOJZcC3< z#~{ub@vvbOgwhOBA?a)*NInd(>q)q755}pBnX5kK+arWJ!IrMYe^~|pV$VFWBmJw6 z0)n#srfzl>HPt@WWF(sGZbncP^%y^xd&U^?9@AmO+_YIP^DKlH?U@N6eUM~JI|mp+ z$B6_0P^KVJ!>QxlK`Ckj)K;hx^_uD&oCT~m$VX7XLqbox+R?(?`j{4gH3rDsVUTj1 z3X2wpL0ef1-C3@^BbA=T$z`D!x&J4bk1)_M094lsvzIz7_sf1)HyWD?kqe68nt1XM(UHgdEQsqmL}p) z%(OrIzdU761LE=F3pH>wAf@eDNl!B@60!BM{l!KrTnGc|@Bju1)|2azJ_-SS3-nJ8 zb%xJHg=kQ!Yd}afK%^EtaC4@o1g=*vJ)>SxXVmgh0zi!1u%ZMO5AG%1Hrh_DF`1vN z<`b|sF_Pv@z9b9?a`<9RDkUUsZB@iFA18`A5QAQB%>LybW$ErZE z&JLKYBK*f&CGHP#8jwshbKcKuZ9LP0*au28kc1@N_vaXWx6b?7+;OaCNGB124&K235L zMP~sI@!dW0uHUAw2?~09xqZ zLabB(+!-N82zwz!E;n;WmBvT{NM@5fkx+dJhg~+kiKEIw$p~`dN%POO+|YCpI9o_3 zr?u58sihJpHzKp9hj~$$2|$x+0TLsqGDVsz;`Jf{7Lh1vMFO2f9yRqQ0!PiahmJfA z0hY-nxuXpDQVg2A9BQOb+PmaC+YOm~#Ws`4*&}`@f^z4qNavRHuhOBsZqFRji$JKB zD?Jj3CZz%o+0Xnz=7cCn71P*6g0CR?4gdz|pddDNQ%J~~i=!OH2^6n?seZ-ljaW+p zX&w17)D^T8a{%x+G-aC%ywu~a@o;3_2-Ow0wRHii_Px5)Szr*aSvSD9=HQ*bzB|0f z=Bc)II$A%fDx@QW3=)q})S&DDblfS}=51#x?nSzZMqi(qZH4dX))+WhPGfIBlsgE-0y53WD+q?x0pyx0~yZuydA zvaLe0xCpQqz>(n-NCBmv5&@L^bwd=WK?d1ah;;bWds!#+XkCNRq1?U(yILm3eDW6p z6*#{N0(cPBqQFzHDxBYey32`SOc@zb|BV32ldUb^w*>oRA^yd9NlDq@9|}>`^(i-2?YF4wa#q^!t3=Zs!)(G0RAyEJ(q*#IO;5_9t z6Yp$I(I!0dAbWh203&wcQ{$#c(0F)Q=Y)+GX%mW;{zy7dlePkd*uaVTZh<=p0K^Ig z+UYNXNlnN3`^N)A7?_ICbQLR+l6L7++_W3JUU#ke_6TwHGLI~WrS$s}o$Cutlpd?0 zbFS+nzl=5J<4HnL)`>V$Jm&4&c>SGFg;R)lGV_#gJbaDdA$fvzT7rjYSnOiFB2npi z=x1m&mI>#i*2l8?DOlcJv=y1@m6plHm-i2rqYO+Y2+(UP2iXA-Hehn@$>ebDtdmy~ z{_*g103adbVH3B?Q*B9>Pv%_KB)I@Yk$;?jSArw~bcX;p&~@g}d3So8YpG8=u9O!U z51b2*B+?Vw%!W#mhKvo0VLK~MHY`*0IRdA)C^>=b02Y`?xSDW*o-+FR!~WU}e%?6% z6%Do`qo3t3|NaI%Q0zgmCFzrjRcR!U{9iITMw=tLfP5LIxJ>%+?H`ONiYaeJfV1Ht zCKb4~uTyIc8RaJ@)H=Q?0LT3KA`x%N1ON>JDA;o{$}>ChjW5RhX#cU`26)Bs01tYU zzI72DAjNZG_}PDxm3PTo8>m7hYODO*3+LsWTJSJN<|k)Ja&=Z0g*9fiPV=A5we?4} zW5TcD5p|Z|z*cC_s016*Q{lzk`ZKM{zTnnq5x~bPtVgv@GY+MPO z#D{M_$RJ)uRhu{W-YHYqsb#1WXltbe#Yk=@*#@GZ3tI>SD?e&49TlqM+{_KBtj<~f zmv6p>|Kj^J%JM{mDIFE0={{9U;aIi)U-7$GHwd1abdH1x1G}TA2xInCMfq=hq%^c* ztk*p+I_*<`s52D*P$af1=XEUEV$;p8ms#*5XUD=+!5%L*vFI(VI)L04M|#J{(-#dC zQ>nYy4zm{wj?qbd$I@SKtH;^QeG{8`4;TU<@#Pk$=Iuit zAO;l587vQmTxJ(Y zyv+#xJ)WmL5&5=?)xoturS*{=bZv_)HDJtZMBBiz>#l7Vm;T*T_xN~jQunu0e8?AG zQ$SKeM)mDfX6Z+&;nGJXoRW@p91WBae24>X1lrzB4dv3ojZg&?rhQbR9cC0nefWw8 zQ=7k5lxjYCJBn5j>v}W!t@W)*6KRZ&bqfmd7{4?{AOYBXsuqZ51u-);LU8~%@~_x* zwDKWkmDHozb=wgYj@7;!EM$Nb!cOuSLtcm`OU008KO%`DjDqX8iR`=p&0DDF0Ce4* zw0-4+xO0Pp!N30_d6B=8@|sjDsf+z}PpSE-tI9MWOF6i`ln;^f*|_mmjj6q}hb! z`ceZs&F?QV3H9tb&nk9|YbXiKBt2*ZGm~vMZqpfXQp>qV3?Ps|RDFCOOHBzPLI^+J z{exoAzzv3x;@!inV?e6$;ZI0JDxoXvkC>i(WFvkj^337w|Mr zsEbn93&VF`zN$f8)S*`!OD{KmJ;#43{_^9TgEScr&IXVz6~H53TyPTqJAz#af7LGR zp?roR&*z3~e!Y4?xGH_ZSoY*14gUqmn}p{#w4hdwF(cslz5JPxRb~Vn2UcVtW}bID zk;j!h=GGUTHJO7n%tc~y0f0O)$JcRWvUM}XQbaO(QjBc<$8yz&*SBPHzGgrWvsELn zwmuD1zN#r1( zkYT%rE!Mob{`;fTw_MOMguq>mOrLDFVzceO^XZw*D|bQ5!ME~ms|IDFl@y7g+KG~~ zsEu+%#g_-4TKqO3&Y0@<0RR0d)zw9_ctLbvi+zCL^KHg;^A(Yj@ZgYDa0 z24N6my|tbBUy^dvqH#216w8B6Agym435w{yGA6t- zEq$_s^dBBAqkxg+MLG5VRc0LhD%c@sw;c3jC;ToXw-|;u*!8wLQ@w zv%MdYRz47IIv%H|zkpLVtC5>5uV>sIYTX;wYuv~!Z3}yt%e$~f^PfoX{MkX8M018* zhr|ZmBL!asU*>7F@ignl*Te$X3?X{3909MpN?1tmUk7!R2Yvhzb{z2rf1;i)^x`we zt)(!z%zT8kBgYk?)$~Lj)J|osL!7TD9?oPf`v3hhp zHP6>B|LfA#ZZqJ&-$)dLO+L2Gl8hpH`!mO%RM^`cKSW$jJ5|9ee zUh0-2VByUR5-O6$zmbz@P=nSsWAdOC12tA7jO{eBw@WA0ouL^6X=XiB*ppB7{Otf{ zn!{^c(;O#g(^GAs6&vZqfl1pA+Q%0=!%Sg^HuC-}LfqzB=2wT&Dh`}Fy54sv;<;Vf z+1+VonK?@jO^qUjKtvYyA$I#ml34O>cToLzP|~{C{jmfHvg=A9YWG$Au>TO7E*^^C zM*w{Tk%h}w{II?p#XGU?pd%rj86{&L@*9>WR&zlO10;2l>JG>q4WPUeR=@)1p>6y$ zt~hKi3TNl!U?A0kEl)f5SWI%GEG6dw(jgFZt+aF^0Q*58m%IT?nNJOOo^fY{%20a+ zr5UGipnm-dEFQ)gZFbHrTY zToEN9P*U7aK6}}Ejh7cuK1QeX9AD4qWg^`J&;o(JE_tJ|O+Fkr=uRTo7nK3rr>f8vL6@Yul zLF&5LCJk~xpFir9x&g}DWJ>r5h5=UaupZF8UwG=kcFd@N0tg&mbS)ZT z68S+hRBYZ-CeLgCA$@r+xu=pU2G7KZ1Bhq4b$ec6-O3DLLa0ipQpkNPzmV01E$w!& z5GMEuV*M*Cp_ktdL-Xw6Iy4_mNsS8>p=n?JXz*X>o^U{#c82pI9M?tFFybY7gIzn3 zz`!_9^GWchNmSnpdx!47e28_7zZ#FG6r%QhP?zzw(E2;z`b|(2F~hkc}Z104-Zyu_1cYy^$ zOeqgHf7gYL^0%E$lj2=3R53{L-A+2cs9qwku542TFhj0!iVu;?4bK4F0muis`??6Z^Zu3WM{OGrzIY zal1b7w*SA~_v8P!`~Lg?ci&(#%qgK=mm*m&nf#0}L`F(Nt(E?NyKilM0CYl7DvNx* zgLX5Ak6mMFeX6s5_63TG_Ub2e3WU_oh>ht;GGb8*(f!9ZC-7fON{dy>AeOVFdS&96u8hXti>!+I+9AKm1NK-U7Vw| zLYZUO-?5t?al$DjRexS4DPlGAN@YTFMo`X|oyQ|4)IHVHed3?Sjo!}ZKEAJIas9m~ zU!jU@%r30m`;sHd&xUKt_bw`QfFBDNKq{Zwv41Qt4wdh+J9n!RHI`6$$P; zg36&E!wsk(#cvCFV#KLP)uN+i?jf z*ggq>0u2B`9u$~q`XJ=~B;_8-KVSFJ7MDt7axubaAy5Em>~p$Ip)JT=r|7vSDLFv* z%vZ_+pEJ65#~EWnaTrbZ76&AfjAI;u>=~24a68rTyHw z2hUIa+=A7c%4Lb5$tqk`q#KESH8~#Ph2PJ|1P|XUEmImJVgW$XnFD;*qkoN}POA5| z`^OwaTOsQxv$i+mZ21-1#u_>nmXi||xvtuneQFwgRv2DQTV;4??hXPnOk!CAtSjs} z9Y%BwNO>b}g)iNU+}e~sH+Qo{j6zuNBLiAHH$noyV()*18B?I z$eayUOHLv#H%H<#H#%>Od@HqZ7o);mrUbxV%r9?@hfegeC_$K9y9Q8@kP+j#O0`UC*g8CGPK#OdGx3WyGe(yDtdqp_%P6b;kbXUl6J-KSNQ&d_Wc}-++7rrXU)LLg5Aeuk%D+QK7$O2qfxqDz zmYM5?@Je8yhxna4Qr$b|$4PVH1O{R(|IiPOxm5b~#nvDUKn42}xV24a3j$z8Np~n? zsCjODeSo_|r$LeDUr76Wfn-ImqGVK=j~19=J2X-$D0UpBaP-KCvJ_S_9$PJ z1{m{}8y4UtSfIh3ZULcXAd62COV3WE?L+-ESQ*C^WM_D*ZnJtZzmw}|f9ev)cgP&m zw?pQMH3n$H{)J4aQieX%N4hg{qtyz(q}vDu@UGGdBSBU)8BYUi7-d- z_xeT>L1-|^ndjW&Uf7!OOU!#&2O+W;t;P@LsSif+qSAQ1V|&y4)a|>_@J2&*p4{i} ziia7F@zmmB<`4MHIFGm+iBqd;;ovjJRC1u+c!0YlchYBXj;y+oyDiv)7;+!3EPcan zjWe6WrCRY#GWKGiY|*o&Dn_~-(xijDM6b7a7UCaML?D4e>XCraSIj%Cdq>7p0^b(= zKP?M`V=9WWGSPc_18Ta|<#pjGT^gw#M_NpE!H@<71-Hm)%75g8^yBqt$ok#;dt|BnTgi~18&(yF*2)h z!9Nu&un9sY_y6N3cF;W+;=`j60d_3_bYj;17K0o68HBz~$2fA|Tef-iL&rrw;LD*p zSHOpbLF%@uu4a_QkF^zV)6@YAw)=l#^aVC-dV7xyf?F3}Z^C{LWH0fCt?DgYKP!Cw z{uUCUA?oZ6>wOJNs>W=Ss=eKi?$Oh%f9b9AUdx3#@|(^}G!V53cf1;A{@9+ZII~Il z@M?q`cE;gZziJvc{O+o}+}heeC3oR>(dqp*=*1h??>&*PWndvD;gf^F2^t4L*EUvg z0!pnd1hYg5T1fi}4jo)hu{cYb0#GT4!^K)+W@yH%HKUnf$#Lhp(5D(~&iPd_oj?h6 z*5~@gnh)8;O05cZQoN>*TjgS!$;?sSZ!x$0dk^@nF26m#n{$sQ75DxG`s1k&$sTQ1 z|M>e4ubyZ0t2eu!cO~C=i#|2-XRUmaf{gYJYifQE+GW z60RQ`m00`qy?@@$n(UVzO2)RM;BVKT*|?+oSsn%L!)yA7~q{+aD=O?w^S$ZF&}aOgY>^wD?P;^qF` z98O#bRV-Og(i45caMw>3_GY4BFaoj{$V6fM_^0&MoxNG%DBp+w8mnwclN8ah!Z^-f zP5)gIe@~eH`}u~m?uUZ(T=a{Fwx#pG6JDIP^fw$_zpLCzec4Nj(0`|U&*kUrH_**v0UPS; zf``2m5i>hR5?)U<&`+*)^@6#{^okC+=y@8j}$r{{HjrL^O zBq?cqm3F>BsV>fPH?az7_L_N?(|LARDN}B3!$A;ZKYgNRQ4~dc_$wN+^oCSVJY<20 zPqb)AwNOgS7fKStld%=SOE9sm6Od9uctlFeYU}9a3ClpEmFcnI>!hB=@KcC5>XKB=3MW0{>Xislh%*`BuJY| z=Z%D$pTY9ZV9RlY)uNnL6g;m!eM2)NFDyf#2(j0dQLhook590n06+R=)=GuGF-{#W z3{ojfy+uyNo@F*mWhtp8bva&&wUrw@%EB%RPO`?oT}UgY51cymet9FN%Fl5IM)0Q4 zE&1n|QRp^d3})0ko}W2+KVTG0ex_#rgSC`KZ0@`Ij3X4^dw*k*oiI{o=$Tq5h7-zs zQ4jw910NWd+H`n#Y0M{`8;T%9G+=UIQ%FX2+Q?cGKocKZ8BeVDV|f?P3cn7((ak&N z2{q8UYvsH1-1mSpsl`H@g3ybs1}Lv zTa^Iy9lXv@ymr8U^Mz60N&cszzz{NIxJ}GVAL6uABz~4GQRUa|4P`gtJSExe*udiXX-R zs-#O^-Y97@@DSNSEOgVYRFxPaAy3|w_jPJiHn{4X|WI=L}4%Zk_uaOg4tnJoX}tgG+4~6 z7@CoGrj%`=d|l~z^r2~Cw_)Ue#vT|lT^SN?hJ@tql;}GPwC>#!9&E_sBt0Xc%{Rk4Eeh0A&5!y)CZPtA2@mNT@LyOen76b^eb(AyESA z>zqQb<^3>t379@FCbbTIuT=aXo?N=XQ`(b^`ChEX8)Dz!K0pFFTu@Wwbm0lpykl)gjPe zWi%)xHg>Bn@D}26!w>f?af{*<*m#M7NFXFswAk!b^+^*V_bs{uHiAZ*a%Ak8VoE0BQT~IcblL=b<9K0J`GjIqus_h?13G-q33R zhe~kSSh6jOd|6|50q0;Z65{ZZ-vx)-V+9sYy#TVU#k{!k!i6WiJ5H47(Fe>WF zPKtsSG3I*+1_x2cf#vrrA&IfK8Y#UmAI&|AbK-FQO@B#bU0ozlaloHE_q{{mac}`Q z7u>q=9gk;VUuUq3hZ6-T`W_a5L)4QQWc%8ro1p)Pez!>nL3MVZMU4#x&b7se#(Lex z5@hRJdVLoi|fA^=;Xqt@82$Y+_E?15#T#t#1u z+=q;l1?JU_am_i(NNZ(!&;q|5HXau)xSUz<|C=0gseiP|BN7L;sHDrqA@1Ygo>W*C zr7N)ymQ96`sj$|aE_s(0NotE>0;uRBp*F*%Q7}EBbsce+TCv=n<7W!pl7JZWr4KnZ zwfI6D&>##sgr6GuZz^o#ewBfrr%h1V?l;#VF4Mb(9Rd^piTuCr;Ksa^c|&r)tguUL z{V-quc|Ih93d)`DpG_QCxkMvlX)j9$q)TaCVF<8rLoTl6S|eR;!ZS`-h96JkP1773 z-7_ zhvCUX4E;P7VPh`iqb~FgRJb(`o{6MM$kE6YL=%=a{~Hn04DBP+HcK0J7zQ68o_&$d z<*P?rKF(VKK6|WN@%942aQMD-*#tW0PvD#wGU_h8_95gJy2-e{a;AqAhInk<9~GPm zyNLygV~yefKoci2&td^rf3hudT;S4prQdibqvuUB#F+}Z4*+|S!H=+r4hmuk$uzFR zM3Z|?rog6ypG*DedW>n==WW68)mBe|+I1P^@QAC&Pb2}|((hqjl(xsZba$!n%R2c_ z&u?>1%wFd0iR_`&{mAAF$jdRgv;A#yUYdTcJ!GyuidOj8j0b!JPtWRFy!~n_E?khd z8)2?i((d}AOJ{-S{tFBhE(ZVyV3_8pOmk<9k8slq0Qj&gVh+n7qJzi^dmh`z5XUg{ zAh7mJ{EXbi{LDggn_SaC4~9XnvG&QUJgHYHCm%|)CPwd=&T+jfG@qCGUN-mskYw1^ zvnlcLLfn-bT}{GG*%v%sfAx@hBp3^PF(y^dl5;yX8tjCn8-#;3sS8_Yt8+-EJ^Zx9 z)`BDxyb}Pg#y+3@FdbXkcIe#l3@cEz1FPC8tg2*K=x@sb3}jb!-C>ycHrYVIkX~!F z@tQ*Q`a^Hwm)o66xp>yIixNOeWvtp!+SfAA)ZFaE=f%<2Er|s~{$$!h(mIcv!Zp9N zV=}A!0>|GC1eVTuCq=&!x=CSrgJj;qFzsQOH_tW&PZnsd49#eo>;O!Q49*GblI>&Y zxd=l%!!YbH)jlIL^idf4v9(!Gpkl$a+p@0=*7L+B;VGLn?pl?N+)<_|zBAL>@6r_) z#jilDD;u5g=Z46n8I9DR_uykT) zjBl{a60=M*GfZ2RyMkLxXo2bF+XKt8FBiz*SJbUQ%F-LAk!KW!je(`(CtWMQ5o9cb z)ZaB<-ENcPJTq!e9(CW03il{U;rdbjIiNPJucf0n?}xyOHU*A54KaA&b1dNx5C=XP z0Hi2GUKUH)p^;|r`p%qrJKZNYp1$D^ePKyiMm>QTk-_4*Olw$Xp&6z_@}|N?=u4q3 z1|&FWH$Kc+=#ff8Gv-c7~@4xWCpGqD=auWtx zz<=aYNfIAMau3nb5RD@KV5{l@&0=tPammxPSfvvmx09Fd{f$-?nip8Qg|m}4vrOUq z%xhsxFDXpu0fcx6V-t2u+~OU-8zS=0+S`W=Rd{$WnF0GB;zP*5gbq_S`S~CBfpEq% z+Ml)8w_D20YTx{Nu55W8OT6apRVLQ+`rel)w*EvBJo4^)f z%eLyxfa0PCo|L&y{aYJ~uRG2D zrCNM`^~9w+d<#_R^77QJKmP0K!25}h4NhUr>2Fdkx2QJcZju*&%Z&yb){s}#Qq~2d zsW~w-zdD0nHn{d(X`B>3;~5T{DSr}?-lJ^f&?Mquckg|{g{Vpm_vy9(Tdhf+ym`6K z8xb=Ls|MA8UY>wSwugC|=YOQ%F3mIX=T4dSzF}W_jOF&u6Bf;S$ric%;Akq^im~l{ ztom|a%oEo?KjCKwuU}u?67YQ|^+2^5zgHYVk(MkAF)Q{h9q){XDm%zTOjH?h1^DOP zHMHF;bkqNRRCpr-M<)_m0)JeZBG?$rn`xC&%QayZ5Z=Y0vTXgFWNce=O)y18)I=q7 z!vxM{*OQT5R)7!4D2mC~r)Tb$%>-9w?pjI1VemQFr)JFE%*HzGt=w;Qp!WdqpRmuC zny*#g1KM}nKU?XXZ+^Ub<##Y4&DP3#gcTJgC0-W6CVnAV=9gfdHykR`L}q2XIf*o! zQ)W8hG_Lj#D|OZXELVEN#D!EDk}zyxz%5<^9e?T2pw#wKj^j}WQ><$(tDu>-k@yh5 zRzAckDk7q0uRt@jPP(Z--%LK}Q_G9TNF^E~_{l_dZsVZiPL|f%dzs7NHO3~_pHpqu z<^Qgeny$zF9>J&Gu!6%G*q8Ab{)iUS5I)XQ>GV~E-t_o07yX%oQYYS3BfB}S)dLUK zSZT{u8=2;##T&c}l+_IH+jV@Q<;7=~PxSAl-j8yhRB5(*}h%< zi&D%*WMcB8{-{6#q)p9Z10hrC2^8fjqRF&O2wX61MZI;=kdN&Pm360lRtD!A=@3Wg z*swv(Je?Og9QiMToeXVfHTR6Dd-@HDyBURWBksF#6ORnpB})nxbDb_*tB?E1k9pq{ zN^a(wlI~jg3zDB_{#cax&KR--|>L^lsp4L9L1A266JbHKa}lv5o=0xvC*Gf zQ?Ycp@)JK2x!l()Gz*4I!OI4zR<+T4zoY{<&z%y_Fa863x)t%vgRV8{8QDEY!ATAW zy!Nk}_2{fwdut&-cAuK^N}eRmhM{rSQ!Xxj{&5opOvh%-%;TCF;Z%EC2Xpm7?0K|dQ%6O0yNeWk;! zoIm1t@$ZJ{#Uq)V;^fj7hzanuiz90|rM?E7EZ+PO&g87mNC*y+~?nP=( z{<2s8WR?2w%UL$jVu~ZBVZoE%Sy?o+-lmu>O(CYL%B`O$(yBe9Qg^Nyic;cz^+R^w z!B+Ghk9BSKQkezMhNHJ9;{{&BNYp1Jg~$ETtl}=13D*{1YjUKDSUHeYX0i9?KtVYI`E|mJx5OG9j{Eis}FsmF(8fXJ7;u2 zpI!?r+Es`<&(WBIiL@RYYo)tnqDyML*|aPpnHU`N^~SBFLIMo)gC(|&JLbI8%dqyCfQB- zTV01Pe*hYa2~tL^YIV?0S7N=%eE}MwX0B#Afx(^%gzl?q1G` z)RXa2Gv771mQ{B9MZzsrh6wV+)|bKjk?CvGWXr_A^{nWpmb2;6_ez&Xsj$;rx>}kb zi-Rt$<#q^ZB)YCKFNnl*7?!31_v}eWDf*&NVyfSYE^;i!K8Ik9FojHnlyFYfgw0H@ zB`*^L?ZoVGrCLV)wk4DpMP@dtwt%7MpH_>tx_tVD#4-c-(v8QQuawojK4}d@WUxDQ zVX{;U_LE>-LmemZk}L+#ruqcLl1@oEcqboLSP6JB`xqfVxuWwb!^(5)v&)y@2R5q7 zd~he<{VF&!VOUM@z>m#QH(8>ZZ$i|wTAzl4Hh7uW8r>1Vic_x`9n&$g>_3kA^`ZG0oyey5wf-XN}Xo{ZnfsT>)APLbB`@m zkr4;r6~a@pLOz7v27+!}PkbhW%p88tU`BYeI zrwvGQx`No{6NYly0$fu~31t~v2S zY>iH0EhT*^ckL%NGU1Y0{-xe~ee8zAutY$-3|`BBIJ$&4C#ch`P3$T1DqsKb+0wB8 zXJUv+!D;wCVef1sk5b9fR$^jb+u)BAyH~S?!u`zN!UDwOtoV0~ulIP$tB3@`zUZh^{h`jeO~H(iOjb&D_LsEk`_4 zCgOuE-d7esTr*sdXlOEe&&Xfnqm0tHBl))VRYG2GGF9i~m(*{UoUyp8)|*$CLlLSe3Ecs_DP=^xK_F9iybmdgT}c)bc1fSmY%;T}Z08iF(0=hnV=o zFo;H!fmZFv|1fla-rNrp9gLG7_)P0`Q}R_OK_-(0A288BjSCY^FFgg9jid@BlZ^rx zzuxQFFoz|7&NFz`Lj_ewj$Q-UjTu@agEcS5;prjq%F62vHu34t`KG^ll}fwRq);S| z;qZ-#8ZA#kv-e1g*m&zGv5X3m!xJ)6fUZ(6WF|qnuI87cjJu*<3&;We75V492ey@L#1>gthqW%H9oQawqZe%PTGq< zLlOQ@#YPyha83@eBA(rnV45vt(Y6>RN=6C{&5J(uva~>9%_(&2WfNQT1uArojQaC8zXtn+UFF#A^c5wi~D5R z&sh~RP&+E!>hvP$#D?y#8B`6Z#0e6{0HM(&%snt&sILCq^OsqZc#pG-`2+KuX1dgRN8GJ$Wd%5e%iW`Zr_j~1niHzvrU)6A9Y1CeA{sr3a=j{t#1)~>+ zf0w)sCj?j~vo%ek^*Mq~1^`h?433eLD#XMzkNUE1VbEOw@z%0k7l8+0MqF4Bf_hoz^gaRA{` z|H|5qs)JTXek~b4B;cAKy^8!xxxaZY?woFX1e!x6^Xp&bmZeX?(=RU#eV3)504RF_ zZiI_Bmm6j)^)CBlYHt|8fHWFc&9aHS$dGc2>kjFAI9~~?%iBix_UcU>ikoaKaze(j}#2(eQsKp_pZETvE9rI32Nbg@`zu| zpv_zy?f5Hop3DmWR(|oin@O*M$-{cv^K7SC)x|l?5}L5mY{({5Z;8SXv~d7veX?5z zQ4B_5Rt0fPyD$n^(fy`lSOW+Y<-;nM$l^}F=RHPbU&oyTjQuqtao|H@HkWML(tD-( z-&g-rf(85U22fvxkw~{-4Kt$}gpsGo__5#B{0=yXn=ix*SqZGpOP@%!dNY7zwLgha zOnw2&g=L(-l901plY6wMT_+k^a;U}Y0gZNnqSbZF9W^;rMC-vEQEz(tYqfO2L7MV%laH4tpj^j}Ys$NO$_XF080@)1E)+cVSS1?0l(p&s)j zeI>yT0FG7HCt*@!|8H%BtjGH zq3dSyGgCoU8(M9G%4$I2dSd7ufG(G}%8Dg33@n3I&$0AVt;E#k;ZLJwAXq%4a^Gyw zHfh#x^njgClMsrgk3#MW8FW2(GQC(jY5%3aIH@pr9vXs54a6VOGW+8?tOCr`B;N~q z!QPR}vyXTKJSFOAKMOud3(+5zp2+d9lXcZoNM9#O6wyJT{Pr{X4ab}hxOQT>x<|#o z0A1$&s`8PoV2>l)x6mxWV;O`z3=B^P)H($=cKS699*?Z-UsMvT+z)uA=wFf;yGkrB zg3sP226u6u_eboc-r#BObV&6m+Pxd0oi*swsWjbd)!M)M-YrzzVzR(OPs9x`~(mVN_++MxKbUc4-L_B#M7f3 zqJ0sMq!0pY0H{5_9{Av8=NsR`kh3Mfi!i*d6ltzBl^sj2n^}gKBB#D8F@Lv;jDyaM zz3McEN~f}(RrfTi6i2teS7}6gt@}GvX6Fr(hJA}><4DQxLO-TfH1}_vZ!4=!)Hnfh zoG5N?{uS5-h}^?N(g7~DBRGBL!yl;k)jz%$_YG>01hpqvrb0X_H_&8N?SgNDsHh7* zZCc_PHHTN6G@r7Fg(b&aN>iO6>|WtC^J2W+Y_S5ShGEj!UT!-0zW2a}yX&g9?`rU? z;NBV6AmYnV#e63UA2NQXx&T(rxIQ)iDV+xtV09tl$nA_bj9I;W*PnZN_<#N3?&uNa zBCMG_a|aLT{`zjiz7h{)HTj&qVqEW$iGhJJT|n9S4(8+e$e75puaX@YCzGDu);QpQ?&7S70M0n8-X70ZAS;%W=%PLBIZUQI{ zN)zAB{to}Ry6NPGE7GhZrN~FS0qB!n$6mi{Zx#4wGax0LcetCwO-1M$& zc;cqL=;TP*(n_^wwsHxyf^gN(w2s90KMzHo{T$y<_18W1Kqc7ikoKLKoZ=M{ zM`+P$WpP)_h8Is==ELd#g(kNq+~H2$^Oq~j5$KF~(`}hmXIa|qF;#G$ zss3a~C3LI%vaIF|O4fwzC~o&-T39r*?U~-6afX_4?3niHzoWi26D|e&T(Rj9e*+uc(eHQTVshP? zl{SCrNZ(6#@yst|chXEP9D#|cl)H_6|1rM8`)iTC(y6ayjN|y(x-huKlX|1D8_hRyTtwX1-_X0~+w1 zRuO3vsSXq|zLy-#>QuX{z!g23m(92EWg)j?y^&w}s*EVJVu|!;ua*f_KX!&CqsJ3b zx@xA&_hz*1eSqRg9w{)_S%5FlH?Z#sFeG8ax9m+FNwVjF_DIsr2WP-?`MB(}1rrDc zfWoy3maHxTB~o)Pt(DobP`{RedDQ6#ec$<%WJbPHtzb@B*AvyJ!Ny+IS3xuTyxDVj zd(LQCnZ1Ur5Y3$l&6;M7J7TU@6iV<#kd+D~%S@_w?NF9Hg^#i|nHR{C!&)G|>H-Yu z&pyP9qn;A@S(D%rN!F!b>z3`4qZN8DQ}VcVK33Wy;Q14>rUQ=v^|OOVm7iOwWNj%P zjd7SA52+|{>cu$IkovJ6bB40g*n&=hCG%rrc1!7~u4B(hi4o%jehA=kY={=Jwr%G^=~(jNj(fPjm78j$ueN=4~Lafi%a+VuCs2 zX&M&J0UzEj2JTr`PUr1cC5c~5UsER1Ju{Co6tkEJj6nZPZ!w8wx5d#MbzR)BskDNc z;ZvO@#0ZG;wU6nSp6jkMH|!)u0nlB^`Z4ag);1w0RJWS(1(_S=k4_OO&|_S}KCcBB zV_@Ow%1fG-KGjOOy<3(B0%rWbq`10MDy8U2pQl-pGwEjdWUc~ zX-5dcb}cugnFjH^_W*D|JXM85nCXymZ3qqFG5&gHaP+jQEdi1qwN zFV#!yr_P=4y-xpiUwR#myfR$M!q*FA=@{PQeqT+;f^vdV`ZjTO33eU4YCEanGYHoE#uT@x_P!90fNoHa%DYeE;D-7hf5 zqYlDvDlq!a79Mm<*_RqK_~IAYec*)LS^bg|&&={rvz$^@dzRJXU5I*tSJ`(0eabW- zm9E*=og?n?rTurEwY<{?LZB6uZ(3E1ZZayxQ^x-7u@qLzbah_yqbph~!aoTktO}VR zIqEROUxIk8^u=c;IXn-eGa15J#tv0dHd|En^lXvUJG77!b}al?YwA}|n=diaE1u#g z?Ov+u0>LHq*=(*Wh5@y){wy&-HF|w?pfv;!9+o@0`PM|{4^*G`)ZUlh;LG+^rF+uh z{^&&^t7EVvyr9Vox zt}ug}|K41QB(Q=Pn~SQ@0hlwn?C#UzIjOp_imOSBs%*bdX;xp%ZD=65P9g zg@A@j<%YVzCRVSQA^mXt08C*gwUXj4bUduWW(Z31n()9}N26nS7{dAH1OGZZ9ll;wEeGtFC zX1axsW0JC4gGYbgW>l=-ZgaYkl`)#})5-D+57PL72|rkc?3yi*Y_;sjiM(JsJ8=Ug zKL8h|Zh`UzlMts@&c?EKCjTKaBCbw?Zu=x>qlcW44NEruq zsN&2dyGBu^0cKiZ$tbdJ!R1M)0+>In*e@QdnoTEU0W#EO)cW<`(H<3lnCAKCNDf7i2m$ zo5km9QcYZ$M9CWqVqw zZ&_T1y`mgkSNH%+R3v*={B^GjDXDJza^(f@Eh$w=f8)Uc7(c!?XK%C+_YYkun^!gyJWJ zViJTQ!i}I%cYMGII+!9VOH~x3e8$V|5gswZ7tcG@c%LOvxu*fCzV)eQ9s&6fjXOuk zB)m)T4iEKhYYswh;c?T6PeAkCrl%(V9s9q0<=?u)mOEZJlV>fD6izqntHSk)&VlE;R~z+3O&8l^Cjzw-&#(R1jD2=l-(tyh|;>O zue%pBMs12ay_Tfy+y(htUB_3W1y%z_GVLB(&pQ0K%UBLFeRwQg@hza@8~Ow1?)uY* zDI(YAD!muv@XVNDXwq;2(XV!U78FyT=-S{o0pZ5$Jy70G94sl?eI%POC%apl(z7_6 zu~-_IEbRz767W^;_go>k|EDbx5ddXgy?ECmQ;+`C_;Sk~BjA~G#l?gp3yx%pNg9R* z6D1sto?Ve$#=dtX*Nyxlba=k6Q{Lvm=`mBr>&xzT4OTBT7{ja4A!kI~R>0(7o_IQh zIRZfwn`UsH;NL~RbyeD+ zNrL~+!W#_i?SIS$lpRhbsh1U|FEdU;B5?X_j)Zxx8Sel2`7{Yb-Dmn$sriqV%(#{# z=3Se0J0oP^-Y4T$j3L21TkRK3ORUTsmeVL?3mk2l|Ap>)S%@Q9Fr%IKr|{l;-g@UVK8=0|raKz*}9?mRbCj|+648Y*&4M7tBGx~M+Y~Jlf98LR3Th5HJ!*s{i zT_k?!_Jy9-r-u0WXFu0B+_p>QAp=m}#9xgcd77>GI|2oK!FEpLo4f~zmZr_cDqDo# z*1G)m9YcmIhn8Y`tai_}A-bP@Uqb7tpS45%)la@8_r+^D(0UGJNTL z>Hy~~bGW)nTBpYakjEd$%mD<4`2mW&0C*tJJcwONcTrto#5rIz2K&gp(KX%jTk0y} zfu1@>U%oO`J{=_5oO-i&H$Bc?fjrF04>SvWuk25l_MI3>y6&6)YWfhvv>LklS5YS2 z$`)~sylF!5&lImDvZ#i$#sN^x5{cSbpfDmcCJ1~fEY7U8M^CO}mZarQ84%ay`2Z4K zBPuNu<;(8=(wV;5xR{a+DN)dhulLWPsBTPqi>95jb@q8Z#L zTDvQy(dMkn!&7b%YEUYp6kso=O;QrQZ+ymm?TIVWo}=`W_LDQ^+E230ZS>zQ55IcD zT^M=r7kUb%Dv%v~uct}rK&p@ztlwFnZsL^Dd1CO+=tEko?~idD=PJ94%9%h;Ojx7_ z!)uMSHago=&C*EgCt)BtFnph;y#bP4ChA6ws7H-BJe|`pG~^`%m@rg@zPCJ7Y6jUg!+p{@QM!nkk>8xo^qge&<#VW#lnd`yPgTG?-nim3;*__P zYp7f5*%HEeg*K|Twfh8lFSzC*@Hc|MIf}V%vBz$(h>P{{2=cCVP_;{YW~ZU1JUXW_5`jo)h9nyT(j5& z5Ddz-LBK0Y{^I!92Pb)Qg7JzS@m}?|1{5RFZ?25GS{L6CFAkFU3~tvz>6?K3WL?&? zSc{8J&Px4_Z+=%7kD^5lz&?8CE$k2&kP)YM&zE3xJ&shNk>K?s^z*lm!52Rc^3UzP zh7}CK;Ti@iU-YHPQS!CJ>@dCme#bU===5pS)y;~RW)xTwX;!D`6YGld&6cI@s;LU25+dDLJ6#uv|CQw z%^fEJ$>q`}3D!zf)+1>Ne;_J2A^xhcN9-rkbs0_bP>p<`Gk^;C@x9?QP2rDLrN)Rl z<1g0!-utqEZIq*G(%6Il;#UXa-u}e1x3YsdfD%zwVmiY$@JnT}7rzXL`0LYpAKsV| z!xEnbXB-ENc)2`3P3)$?1%aKzfLBMFtSeOm)kQv zdvJ4nc;<;O1<$G4)t^M5kE3$?{~7>GE-UenOJXAG zPVhn{OPp@x-G8|E58sutGRVE3cy?#n`dDhosA2BPiKK2;R&rJZBivhSo!w2MjDVDb z=Svai6{pX#Ms7r3VO>$iGQBH66PZg*J&YzQQP;asXF^Z%dwRt*Dq8fLId zisHP+gJ=_Thk;AHcH}jH05A>2VGybrf9o>6BQv~f*TQQBwMi@?Ydw}0Nu z)2?g8V#49xHZseT&gqG{NqByH;Mqc}dCBk}KDJ3XOkq#GzMz%~ul`?JR~2W>=t)wA?;=Oq>hW_pOkUoi6SV+fX7~z)ZKay?C>xhoANh{ znJXh)eJ(zZnBT!KXB*KBD93a|AfF-GfBb>e&WZ-qX za`NcA!ejiOO9%WzR`!TQkZUK^J^qk z%?8LAz!@TWA@}pB6HGH~BN!4_svn!F<1l?N+^7Qc<8rR_o}Jto8ul^rKEz*`4MXNW znf(s!UXV?N6j$K_<68d!ae)7pJj~5TCGDiB_$$_?qq8_QdM+SAGGNmgBh1JU@iB1% zc0+9k0#(R8kh^)&fM?Rw6Du12ko2@>i{Wm8F`-!r!^L_aWtss1m9Z5z*gcYYebiSm z6E4n(1xOUIW(r9$Tjs){Wy!3&le4ANh$>*G3@0sNY4s=}0`HaH_H44!g`56P|zzK6W z*lt|N%Z!vb*>3%x33TS^v@S&IH;vn0BN;J`13s}OfYhI6zzQnwmAAVXoW%elazB>| z8~JF5qm&3wpD~{xAecz0js|-Z$?snXdolUFXdc_kuVF{oSYgJ_cN3K!#g?wVfT362 zGa-B?`WL9(uF_k(J~a&Qj;@(YFOuunbH$A&>()#qWXS}^pHb3gnx7Vrj#5CH7!pe( zTI6B6S#<9j$*NCMjOz~-?5=cV;wj3_Huw=J^h2MEV`os21Bbm%3bcD{wqou4wahX4 zK-R-)K*Vl1-Q}dwbG}55%TW&&y5+}Z=bL#}6=)ps3CK(ZEDtd2Qf`0sWYesIbjvS8 zF?c=H?xEe7akOS!Y|L}gy= zfKP-);V;J&4)Q$_=6Ht+iB~~@wpT6%mQi45SkQ+-BoH$3K=+M>mDhQY+28U{-C@(> z77ty-XAp5zkQ7FS%mx=$WqRT_uP>GF2}h-<_wWAA{K-`b0_Mc_BX1{jt$wHDG^SR4 zVn1gzcb#QtM~^`>2-gSudz|{)Vw?1m{DYi)+`lX?ZmO zM*pO1<#cn1xy&8Y6jvap4ltCH9O7#1ub=A9RxN^|G5T9RxV5b<+H*yijcn|OT_B3a}q zki~*uY4o{$0TNugp-~sb53i*40}h^9C7Tl44Qo zcTY1{%G$pUQ;a{@Rsm=?p(R3&cuu>U74+U!U5$e}^4}PPh>=%vzMj-y%bHVcFvvKb zd|M!<9v0OVNkhEgLvi7R5}kvqLoj=JSE$f^9DA7X1kh%dYmcDWJi4%4sc#K$7|!k9;^$Pd@ObmtV^$|$L=Z&|1>B210ff~ zOy3|6lKTj(`tWC7F?IRwX#MdN#o~tXb+E=f!r|moKAKLt^6nbw8~GH)0eGIU8(c2I zpbmf*4|C$HdfU(+Ks&&C-Sq@Id9)d@U6($)avu>2;xX@DpUa7X0P`uwV#5$yVbsne zm@)z6%)`}ivZh+*P?MBzxo5A4!0mDHDWQj?KmnYd6qTOnq6IwZWKd_vkFc5_@}&a zP;hr}{b&b)=9meo>fL47$8)6&KX%-Co=Lp8Nci{_hn|UOxne;CZ8Jc_fZVFW+yYAP z3<0560H_)BP&(R%su?Vi#Qc8VT{oO3kq8v4l0{LW77OZ_;pY~(h}!v+cGll52kCS+%4M@B+*Mj1sYm6q@0^UL@Dcs-sk zAes#*a@mG{W+4hfN=ao%aSnlX0US93T)gc9xdO2FjqvN(&vDtuAb%FsAffDRi?9j) zn+V}>ZRSU4T4OoRtSvW7=F>?Aw<78Om>j9r93VRYwwA#az${uUz(yEmX4Qg6p~R57 zVs|FLs?dwq;;AxL+nBMDZ3tE@u_6j!&f?cD z5K9!`v1FNLmR<>#js(ldZ*$(iDi4l76!Z{x!YI2lb0d>E%|j&G2-414jiG{4hSE%C zgx@(wl9>WhS6D>37NuM%2&u1f*O=k7;{bAteC{3NocO2OU%`(El7|#lWODJ(U5d2#54i>8SZ+q%lUM$L<_g^6s87BA;7pkYux~6QpUz~FCa0Pq8(s=lUGV4P zqDb;nuKbYWB$qSD!tO|IJ=IOcl*a@4(E{r9NCJ_)c0p-aUi6+EN01iARZbHL*hiVj ztS@Q)9T7aMR!O&N2o+N>ivzX;j-tLOT>fQ2n`!aLB*K`Up!_KCc8VD5Fk1$Yqj*be z+!8f?YLHv5aaW?`L5Sx2K%H{;Ha~qWMgWwN@Hb8NONOtoBSJxk<%U1ts8N9P*Vl9V zA?A8*COjbPWDzmO1hbuBCTwZVT$9QjHVd&ZZ1AO9+^2ay1mA=i9UO-#v#VRnOgt>+8>j|Hgb!{e{!~#O(4#jzKQUT(*VH1D7_B)3lj{mL|M#@k#Mt@z|Eyl8%=HH?!m z40&tr_&(3Tl@TVtB7DKjqHonwUFSZt3KvAvy;Aa*w~(2(v8nS%uuuD^0hkWinb-mJ zbXd$Slhl) z^9oYn-=Jp3RKMy|(_+!IrKLzj%w7B5o5zXK;*sQ#N;}NqPf6QdWj;XdcQ^UJt)|x< z3Ksz|94mQ3M*tu32+o=JEb9$JgHF`}d@jHb0V-%yDwo z;dTDNC=R(B0`5j(5gy+OdU)`4tvH>qNJ)E;8XBaAb{0Uxu7ZNf3!}5+0Re;{9u6T! zYS3kNNJfDLvtu`)^S&O*RYJ=jV-W{xq{=GW82n}U%DWmWZ)0HA{-0~%=Xs@o6ytzf zVs@Ac$UK8*ErtE<3y#nRdejV&3Fxj&0B`QG6g*29>`ssZM4VC)Xsn;%Vr^+#~0q7db~)P2d8uKG;oj~vIZ|Mf1rhX2&cB(iue^nUY6a1jM@ z8k3flKxeG-@@_EaRgwf1s6kQ^w}!CeQ3yPW9l!+Fic}r~Sw==m1Jac7k*9!yQvk@b zINq%L0Zt_*S7#QTG`{;%^y?iKc-IZm@bLAcU)I`e=k1r9%@%ioWMYwl*}2u_35(S9 z@qK4ix*-+k;V)rkGJ(K!s!|U;#|#xijINhmWJ6+D7Qf_@Nc(Kg)dYzP}^rb8(q0Hu6fb zk@w_d`CI^2xYY+C#PGo!)9`d`(D6&7}zT@qg^b_)aw=U!^a`NA+UX5QjgU5DuSFmMwh6f6--=b^ z>Ny492$8bB2T%2--4e9n30NhIGlza2kv0O<{N}Sm%H2yh<%h5PMt2F|P&8d-x-#x} zw&ZEf2YoDTTk4R~my2IHUVjnG(^BXM76dTub1?;W#-}<3aoANpz}~)4q}VkU=4Js* zp5Bz9F4Fh(>ge!R!fp3)nyr9A7 z_GFIxMhz(ws=ay>8UcR{FHk7nsaOvjk8Z0O=QL8i=aD)s7>%S@aB6QowU=`P1L+q6oCr|HV*^Z?*l(q(hFq#(JI_X1*T6EQEKPm+j_gv+X(}hDV!Rzfu#4!~$ zT@-&#g6m8dT&qy6aGs`BqcxiBvS3;g`bfB(ka+5>vtnG9hLDUMQ`3CN*;Y%Tcey2_ z+NDwwYxMMZXm7wiC_2?J|Kq}JTC)&t9b!UBC-(gw}A#p!Jz`_R506|B4O z&x+kp`l4+03+awVN(JQ_eF~RUsdl*7q%n74K*Mm@sgSFSJAB3^8$Fq7v>w6WKrFDj z=e6@4)la`X^xc&F&~%nzD|>N>LkjavgUzO)a6JmWAJtFPC5;UWi&!0GPbk%0+fl4A z_L_W`d-KMy81uhltAgPse&~yTcznkyAXHVgKeRfMooJP+(H+2MIsD!M=9%+7G zxf%%!{k#2;^?L3*`GWyn+4$#+0gRWb0%_Mt!CXUD{MDT&xo=Dpl@~CadOaSrs1*qc z%JZ#^|AVmdHJRtw*AKh*(;ppQ=rQvCJ?2OPKEficfnV+McgLJ>m_DWpq`IaIfi)=G__S2nyVjISBQ9U0I$Wr2L-+-7t>ypAbgpx5T|ao5x@qEw;Ey&d({( zRshVLKhkj9+|z}V=~H>&f692zy{N}4CU_LP$MMC)Pvz~kqkmr`wObcnyzC^<7gH}R zfb5^Iu)j+?cfBpS^5K*3rQnx8^UvOg!3A}yQXap2&#){1SKjUK#^ncoz>QPQib{NQ z`uV@16k5O3^5xTyA_sJfEOy>BPcF?JIiqzz^l|-y09u6dSC*=srQ3FZ3M_#LLU3!4 zG36s9Iv%wc??5UI2I;+qqu{~%d}<2ot!?;;IOuK97+_t6I{_%~h>Eyq_n2Y6>cuLC z3xUm+X&_Jj^n9&eD2EzL*^ffgfnb^vwb(;e;&PpJ&99ym#fH@;=f0@Fh}8yc9OF!h zW@;E^z0=RGMEC+KGlAhz(8uA0KE$QE3Z|J}RJqR#Nmxg4zWRY&7*BI$7IEA*Nnm0c zlp>|{)GfD`sz?8$ivl=wRGR4crAGN{Ei*tc_!D$P9g@}Mbp7XFYCMAH zUTDH8K)s5)c|q)>;rt!$ob6f5|Xs{PkZ&<1WJac(l0= zU>MK9A3;b+DDk&r16mr>y5-xtBzq)6$V!gME^49MQDXJs+ko21F0U|b5mb5OFIdS72fZHz9xT2Db zt^;F+*^|p*N3b>C(luy$%GU47mJI~unAJ9la_`4Bu>N6ksH90?kMf447_WKT0Zfhk z+FV>y{A#9UQrAr?S7}&%8J4rhSyZ}zfg0NaeuGd-F+|Bwc?}Eio&)y<;nsBH^ZnL| zLG^2rkUfs<5iQk@U!_; zzq|Wu=ar`H%GKPN^65OLM8XTTqB>ylsIf&{L*JPqc_o`}3>jKNiHctS==_CV45OJ;GKBdWcE!7orO>R$ zP6K@Ob-<^A-fBa={oL`b9;<}`pEm2M&QjDTdd$#U{&Fl6f6VC^gRFI2^lXygA&}cO zR{C@|pW!(h;EsRk#m8xeU8N15zqSdTip#CzOtw_)1hcN+bIqkDn%N&HBIIm@;p1yY zUy($+ocqWF!0|6_bc+bOT@MR%qN! zkJhz!{L!^GURBkSM2fmn(cMZw`y?4V_&nix4}U>-^d*7bp@Oe??{Q~;V!-_f5EtDV zR>F2MC4N_sgXZoyE8R#cBkPl&o}RUDJt(xCYx9h$WTU3pAP4c@C!(iC1}4|2<`KWN zzI&^Tb0U}}$sHA}Ok5Lsp!RGgI!H^{9_eZV8Z|OqDXVxfh5y))49oQ6^!AdlxtkPG z-<~*|=Ee4GZJH+0BFU{ogi(%Qa;pNXz9S`Oi^7SANaRV&|Dts|v;}i0$S2kW#_P$d z-PD~3d4h80Q$+UY{0DLc3D13ydF{QB=Mqqk{9xyEJurb)_iKeh(}BK+%4E9n(SB%79~{E}X+8k=2-o6(2kF};9V zZE0(Z==;l+`giO6&PR>QdvULIGZ{YHYoTFGa~AveTb|gD*%-Cilo?yKsvo)Gyo~0` z*0mBNc@m_ZTI1L_Z3=zLQpoG;tJNdtxy{)SPVbWh(Gypwa4qnXXN}RU;p~2A?0|$T zG}VwIcSeXz{b=_5&^}Q-quqDB@!tF1H*?o02n7{wv?XDEIj4dtJ%VJzG3>bd@4T~Z zWy{V(ZK*7St#*f}URekCrsX26-~JjlF#iSMrSZLL4v}%ecfa2~pAH{9TM1D3GIg_f zb+wEA?cF<9W*WYrmfLrwTb;@r&F8jeG=;@SM z^*EFkXiy$8Mf2b=B~QeLBP*^&?op8W6=&D7>F)ffT#>NI%g;M{3Kh?F`60hiigB3I zWeL-Or;+NBE@qkn6;>`yzDKDZza~N?osZ94pZn49?_y^;-v;3HN<3x6dgjuu60lTW zuVoAcZq?*d_9JTV^+(kgH$HgbZb&ai^b&in49bS<)vGABr!F?4UOo|$K9FD~Li{3H zLmL|JO8!uN?w(&~Zjyfc#kysCo^xnJ=1~%;1GY+G0imXc?yMZIv{d3gr@5xOy0px9 zt>0R=zaf3yY-uWJ#Cksus zCg@5APE2g}Gc6gY-NVTWyU?8fsPd)PHniEHoGm>UL^flZWF+BKMwsL_y&l|!Ppk}3 z;ruwFDOmwLO6LkkVn^b)1%b4>L$cS%V1(T9`PdyO!1V>kV*huoHsJO&NsjDk+GqVos>aCS%_;QFvsbDKdlVFx`za}N-9p@Z|4NiSzzj%Ej<^BAB&E6mL;%TI5$LLL zGEFVHP{o`hE}4ym5g>2@fzkp<04Y_#6#y5I3kZN;0+6)4hOLz0csPrM^JHuJXc7q! z0oW=Ryh8GTZQI+o365o=|KHDNn9zzF8_gC{ar-yaMlvma$YsUMyFE;te~gVs@ENnZ zmdYBkOYL{#so7VQw}!;)PvQUb^L?NxATzp_Ya=OoJ6lF(Dt@o(Z6x#OtP^iww^igI zW2=1;U$^yk&I#|I(+mnmGJl=S6>?vwCdEH(a;wX#65Kp{ayDC3B=1%2YuB>(lAsc_w1o``~*5zj>*O{d3TsSkm7QNc#2L zbiA0MKQn0`kb!v)o8A7}bt+TjOOAUN?H@-5AD^UI^$+~6crq+=+x!;P461Nua3eNq z@Qk_5pXkIT{}*p%?S~F^;@aV|ck$SB^|aSR3Xi{w=JbR!10iD^tHC09m=|~3#0jG; z5_wp@|NhMVAX&<6;n7?wrWh^chy3h`42|Xw?02BB3rZvt{}zxrh{9;Vi&CI$<>FAw zTRDu_6Fs_+1kQ@!+j-|>90J^U$JBboy87E$c6>u|X$>ZyZf5(7b0s8;3uAM=*K`>SI}(?R zl?GMg9+o{ojCHt>>kSxiTd<@$%Y(aU$Lt;-A=8Ly?jnB zzzBzfj}eJ1E7%~y%+&n`oW>NvNaT2wK|SestX4Wa#?`GF)KS_+aOlKRamQxzz(pOF z{~7(gM-`Fn_mmK0<1@|#Mw%qZLf@wWmB+gP$dJT2l+D3?ar31J?wZ1Lfd>|WHQp$u z#D}hVQb(iKR+>R8LZ+KztIo+b1X-*1tL=J>2k{rCHe?*jCQ zb3bbINcnT~rB=A}VyUG*dFY1>8i?dvAUq6N<0<6;5)+1DIaXLu4F?R#`!WhUS@f;` zW6v=O6~kxveswi#u;cF*L&L)>u(cP15tz(4r}hFR<}keo=BKhTNROu)+W1daYh( zc4o8--SFyyZB}1)TkNsb7Sgr00o8O0>+!vl2L}+L03;Kv?g<~%ZD`>rJHq-YfSF(9H&y*vlQe8qBs}cbisFlPaDgrLZ z-&Hq_w8s-+bQSy_svzVi zM={m!D~(Dy#XgjP-(2Nq4xT~3Yb#{{^GW;HnTNePOa4;o2Ibp$x8$Qg4{>YTzx)!^6rKHT+t@)&ov2`xDAoDCsZ_P4;X8(|qxX){~`dl(Q!B_AsD@peOGZ#ZE6C`fmND6~d3v7I8~3<*GDULQwyR@pt~u=4%-eZx>x}+< z0Ka{Mc~{Qsg0`xrDF41hU1u~Cd({(*_&z%->{)?MKh`yqXT|VeIjzg*TgG?EK)4Du zG0HdRov^w?iCI@4V@7L2p9ukqTdvs~IEl%ewmq-^F%Vegduy(5Yw-AdP|yE}_hJJm zfC_vV*{!pFM(KK4XJ(NxP@eJIbCgG^$P?K4IU&h(SMbg%oXcD;a`9jl9Tkz$o*tYc zpXT=77@NfrcFpiY-GKCNYbKl$v_2Gehj&Ni-m_Ohrm@bq(CXcnz4{qXOP_uMtOih7 z4)TUXze|BMt%?gY1{#1{2#=o5$CTi^}&u_iES~UJ=@w8as_EYs%`IVUG zZPPPz*nbMZ*%D?rYb)XL+9%PJqC@pBkzgZzuZUFpEGCY{g(UqB=;w#~@9K-jyZx{6 z4gB#imj5yPG#(Id5U=C$si>C{hDkE?&yhU2|FS9U9Hw%T_-mw>EC>&OtVi&2vg%l6 z@d$0+i{92n?)KO722j{ilH6z_(9mY)+<(O%J$Zh<$xjbU@>bf5 z9NKuy_-t%+U{CyUNhj^%7wl}T3lgv1eR8#}6|8yBjfclR_41cjPU!4MMZuqs%TV1z z8>aqQp_D;}_t;Usc_81(ANpV_fmbZUzrv2U#pL+>CQXieXpQk}?1IJaevEz%$Kl+`PzqJ0>qd{6SxMU$={buH`)#%ON5oTVOk3}&5*1YTof7pmt*0~r& z^{GIR1S}olvTy=<<;?X`?d)##pAX9a{R*HV1Q^6p?81XNLf_QH`VL{Plg=Z`bMA-G3Lx zOw$1G(nR?u#j6?;XvlgAZ{;p=?x%c}~ z=pQ*6Yb^9pE$=H}416KZ9j+52hu70CE! zk@1a#T{bVJzB>c*I-~H1S@2|LDI;y>3H;k-QEuoYu!)ftlAZg{K2wo4>xXwHgeyvC z67mom-c}2KU*Pk~+hkXtXqO0Qs|$HyMaqpxkG4sU6p21n!t$Xttgt!gvt&=B3@I{T zj3(rTL6|?x9pV8z72{XrqBWsFT3ZWSDG(Dz+Nep|*1+8O$XsRdyzsk4t%Raz@w|F! z((+y)rG_@HJJXb!N9`iB-VaYU^l0b;y5b?OXefU~dd`}E|M&bxz2J=mc(z-?6_A1h zuE3Kk(N7gB)8Q9n6xnAK-uX*7+J)EI-Jx*qwz_J6}38Z8nKAqq^s1Ia83`S2!y zJ^aDH$eC zFtyeYZROf8#a<8WBGg5i@ZUY`2v!%x1%zuc`P^dfQYcovb&O$9g*d1^E;D zVK@kEEl_bFxX-;voA0&TyH7MKsIAkxhi3=<{i<_TQy^_vm$?`0S5Q|X(fnowpoWKH z0-LjkK!=x6AWwA5SK}6otoj-}4BPOu?yz|#xdnd+!W);W9JENCBxTh_ttr)RCbm|K zruB(I4sv{o4nfF-!(5HD@7#h+{6;aX9`@m?nrI4 z%a}O2;-M*l&3~iHEeKDszOb5wW}V+pJ%_+4Cfx~6-6WF^eP0Q~)N=Y?8XB^OkTfPIi-BzMQ2hm%YhZRjO<3(g4}7L=F(vxVvRh8r{S?cB z+Y~V|f(YL5Kgi!nEE(mhsHv8#>4KE2AB_}JJlB!fQLQ3 z#MFQBk)Lsex$1j z>Cs+ZxL4n&k8R}ouGRHq#z2}u(f$xd_EZDgA4z~|8UQ^7a1{VHJ?S^5!fP-vVGURh zWng0lEZ#Wqzn4JkfcWe{0AtJ7U(K&Jn(--!{f5EGNysZeY*S!vzHjdNPq+yd7EBX+ z(wCdO_Pk*O1~46hd=ByBXgs$Gjjd_(dT6$p=ScTiN0t41HEB{6D(U&1fX4@2Sow_~&1f&eOCn_LBw-VFeA%-=fNoj3K29VM7w751q%$ zUxyiMB*{j3t$!p|n!pS;Tm3m=Um50G)&;(^)$OLqskdpeW1P^iYTtoBd$47C%fNOS z24JKBw6masLl7xOXbp9CVHWwud2(HYF{>3JqdAv0H22>hMBgQDDdkhQnq}>^NsKV4D6LN zLdI;3Gz-tdAzotF8gP>_voGYE1~gicE76Fz8{G-N=cA`Oq_Cw#lWvLGfwk083rvxa zMBboE@o&S-ZLJa`m0lcrA<_uqG63$<3SA8EAN$ zR58-;VCa?R-)=6@Z{pu&;gOiPFXT0slBC{fP`fkKkt`+ky%c0QBjQQ@$U4u`vc_CG zZui)yemQxaaeXCwp-jzg+?l>R$En`?klORtCm1(W=J%*e!Q~`z>-N?E{v$pF`sC!4 zY|;Sy2Yb{D6@ffiP;ET)$}DXW0IZ#bCS5MjZ?*1k4bktM>~9XyzhvCGHn`I;geW@R zxi&Yq`oCli{<#U3SB89wJFHz%>Fv?k?rAJuT?^^85`1bYT5fS>c$==iQhO#(^)Zek9H| zKi|6Rb^m<)ul#0h5TM`rDD3)wZ!VknW~AL^QenDSAvwuce|nv8Xk2t zPyZ2*O5sPn%-VUo@b={bvU3QLWVWO9@9nQU|l-iHJ*oMbe@q|-(cXTa^pFOqM4 zX+R@<(2VCL)iiDO#+XdU6zcf#sak3W`}+@)(?BR+>|FEs!1c3OYYG0^^bcivBh-@zc?V-GVhNC~OQMKq%iuG{m*ht37$`QV(MOZQXi_eXD^ z#`|__mX#BHKl9z3KRX2RTuy(e_>mPj`7)peT;}}XL$O!l^RxB~*^Eo>Te!{1|G=eir@IBt`+e1iL$viP#3!9LQxV?Uo;k%TA&`zYK=~k=EDt9VOX5~{;^2=HX z|8g4{E8;v9zc;_7j%=UI(yAIORlVlMOE4uNcBkMdG)iGBmtrFB^>CxnCccr7!;#1scBYL^e-4wTdi(lFPsdN&gY)gK%xMB@5x4Ca) z>vaFz#vTbI02m_H^we(!mO)W034}W(@%z{IX7Ad*feBt6rL8G+k%)U$Bwn63&#to5 zr#O3Sf5wAD^9eDb$E%CBhD-6F^s6&v@RrA08|n;kPASzB=z4+18sL3(M_Hdjx8Vq(&KNc~*hv{SMyO8T%euiHlFYE5*M zNYZ2O^~>twfY#E&+K?LGmqH&4bP5M59vDZtbi8S-uWRLQem&wa56uV??POKFeqH_*I*7}Qc+-;4coj#$9=QI#}8EE*) z<;P{^C*JWevl%8x$hB1G1sUNt)K_5W5zlHDKWnksw1cBgg$Qz^p!j<jHR&gH{+;MLLY zDZgq0Oc&2%(KR&92cYS&G8zoahH(~A;Hq#M)z<9c9fdkB{!M-5F_?({XF*}r>2c}7 z({$$;Av;rAk_>lp!%?6CS3i|D_FG>XWH?bWjTz_z4?->#C%?Kq9O_ zf;=F&VM)JXvR!4uRgIxIT2m}2DenpI1G>s~_+7&TPU%wdgSS$>-wb8-%IVz6+9J>M zrjD&G=~b!2w4Uvvs^bT0erh7Ghdz#`D9i|TdVgS0ZI?-zXcy`#5*b*=CpvNa6y8j5 z8>$pD9b~hrVrFsXsKWt06N7;AAME91ttPUy5(%q$&NpMHC6+md=sWkJlFUZAc0&T0 zS2=Ukesd~Z)yg*_>E8T`ZX;JWLF}?VmkCX`lH}5cb0QDl()K(-R({?VF^sf(H2v{v z;zz(O{Altw{^{oQF}Vue4a3_y;*T#%hs666rfmV9mi@aVSIK;Uz&akHt6OmSK%^Gy zQLGBRsfAAC-^l|8tIa)5wC!ke!_$v+rn_LZ6L+l>Xk$(omwIw}x3YXxqQaP-{7WEp z&rC?mC6Bz*dPUcRsp75`dhx_p;}qZ8`E?eNj&(xJ}fc zVXYQHV^T%!x;2JDu90tM*pkJ8x>8i+*S}Xhq~4tuD1z@*1rYV^13{sOpo*Yp(j)mRYRVf&K!i{4U;J zHj=c~FBMrNsW?JK1p557=$VEs*z@8T!B#+(8kg$(-WE^c@k2cvX@neZsdBhf;FCGF z$PjC%*H7gwgu|+4hmXRBQ#Bi0HM_0a%*Zv3IeFWrAK@?b`p1U@{O-&*No5AlvnUzp zghnL~hU#rdcaeP55GE0j$TzUop0|3-tiQ&hf438uS%&~HmHU^#%ErUX0NbZvukOa0 zo+U-Mr|I|ybI2|WRISn|XBL&rZR(m_n*N(>uDi8;!P+q8&sdo09RbocR*webPN$lPnY_h@6v zsbGW7*t*h_k_W&UdYY5b6?@-~K7?XAMOwAm$1`IWPj`nhCEwe&<-e=>WqLhYAiZ8& zFQd*(%&0bBZe3npOSg=RwZ#ABvamvs&KZyS_lj7VP`$$68Y-@+r{6Lh_pFU3bcbJO zj|PjG2W~UnB$9?yvOt5hASFq-C)RnObzG9=AY1rAbMtQSWcQed)9%r6xQ8}Fy6mOr63{Z9$>Gno{|5c* zVuQ1Ajwp$vN7b{)ffvzp(aQZi?)pU{vE`W}ainEmk}Wmi)JXH$f^zp->iP!ZCL`V8 zVsDeAO8mq2X>O*s;K32YYNF)zL?p$+;W~=~+j3yMKbnT!FDHGbR?a9RaOpa?aL-i> zcEtm-u5mK2*fZTvWG(evU;7(^Qrh3;%cdS`90+8}4{JPm(s4z-*945EEEG0S5b}T` z9Sf4JVIIVEU^z8GcoNy&szz6geV#>t7J=#fbS~p}u<=Wp^1X4%L_+r6Zo92ImT%(A zfpGRQ*z?q!v{vec-49zlA?=g_OStN{B1yE>9<~pC%vmAfBp_zA!a{w-T%kNxG*akTi(Y5Qy`qo?HS_ zH46;yVEjJSO9;_X7FJJ;2WWHybQc=cg|&db*_sNN$1g|Qja`L@ zLyuQG^yia)Nm9BxVy_MU*cD|fhVnCf5!GQ}mPR)JqZ_n*U7`H>8I~n@hWzArzxHhM z_n*mSD$sa2aH2-)NhHK(QZL1n)g=LQiKpxAN9)s8YBIs&p+!V@>xrg2`nDnZ-W@tV z&QrjzX}*8t0Oadr!t)9VQh*rS4dxe?BxUBV;H(+voXH11(gqw#3{CVo;BqbXp%tHqCP~{hufgkH>Vm zn>hc}=A~~a5>R2#V+!nA$QzpI{ME zdE;L#NN%Q_}J%=u+>eUUwz3tJ0)bctWb3IK6H%s9=3>6Ge7(=drbYR#aNCnbHp8ykLb({#=>(Jvs&l=I*qa$i1De1k0`Zd zE)Ct6@n&BnxYdA-nZc7^Q$S#A=sRnu`J{-;H$BNf6FssC=Oiog@3?SluVn*aKw&EJ zVZ5w8;d$DGLcKZJcWNXdd-RVuz@BEk-r#0`q9=YX34PP!?(q7dLA>d-s)N~Mr$RR! zc5>EDA-@~HmJO1#G|HB=$|m`$5^fBBy(zv6U*lSMHIpLZhC1I07B4`5oZ@j)n*7c})vu&)`-w|A#5x&J@NQDVo zzk2Zrb}lq$E-jpge1?=KzsJGvvp!25$}ud3HWfjO;vdmJv<%!<$;c`oZ4*I$IP2CG z={cKQoeP(UUn>%|;MXWdkh8{rk7Ta6E+ZBvQH2wIFzLSUQONk+0j5f1<`&fCSCIm5S~?m!K|h#X+1E=;TQC){5~z(=TT7R(GWoup z3iURp`?jE3B!19O7;Gh=3?1@sIY7|qg&x-dwIoWpL&OlQYGF0-uTU_#X)@;dkyA&p zdUAV?o}w6wtGZ)uYQOo1<^L-CzwW;ru+j*cLT}VR{}jPZq^~{O2FejfOlG9Hx5Zvr z#a~)ctL$&#Y;aDnPMfW<$*x9pNQqM~{VE(f@m(&i&_{DNe9?l2g)-%v7|M?k_ZUsmpWSOWpcz>iQay$l^D!^zskUHU|Z1z z;|{dP6Q6w}61Qw5Yr(JxK>7gAV##SxQ;|V0UUEM*_lS^q&3RbY`AqsY>+Vuu>x%%* zBooMsH`7xwbDi3i3fh(A9DITwW708zh6#CVyQim5vN9NbE8^(6KIw%;I{#&0lQAK| zAn01izX3e=}h0e8EgL7;1KT%2f19x$e8-nRM+2C;)YpfIB;~hv2O~ft@ zX2~==UL+SQRNDx|tTN`Mr5_N6RU9N!00R8m`Aw^S6}&QHP=O=c07h_Xx5b(1GLMah z!hvz%lO`{f<{UE29|yC>lH92Bi+bxv>Tgv)-8}x(b45-$hSX2Lp(^SC?TH7s9cI)N zLFFQAQ;ivZsmRu=knHnUmYrN3HFtGwccu9_rE3>lVhPhx?nVV*`80s3%+w?{o{>a= z?r&lC2?u|&E3M79?&ZdGIl*O0z=6`E@Vu(A5`^&F3QfX!uqdrlzFNFZL})+3ld zC(J<)>M;qs*F#&|**DeqeksoE(kdm*C!=42LBzS^cb}sn8J4#o@zw2`O7^v~)?CpX zJ%b^7b4IUZP4|%Nd)gTZ*UndZ?(ZQ8yJ{F96Vb{q+-Z`3vDp* z>W5*44_3Ctyo4J!wpW8sfGY5pfl@c``_M!XXrfe-C~5Vf-?;uLCVDf{+&<25#)_y3 zF`#lZf}QX|T1_s50&!Okv90D5p96`hL|$^@6KYwE5r;}0OFeeMkU&~rFnhgWX^!#f zRP<*z)VyK{LQmQE#_onc*sbjXWo#k|l2eT5?ucFFB@`3anyBa~{|W3^%w`YuzvUZE zO3eQo^vjXU1= z#M)3!5%Ld99f7;2JrqOpt`2-9G1f`~0f+@rX#ci46JXi3?qV;eBgqr{f>T%w2 z&?I3jHP__qvF?j9vIgkA%cbvg9g6Q9t5%ky0|m%|w1r2&*1+|7&_;8X zQY%qWn$V~O!YYHZ6ylV~Ep0l3TjoJ*O-u?H@UEw5G=b)tN}MHrEC9*zD;6GAd;Ffd z8q!MhrBouGs+35ExxoDF;Uqu2LK-fEOPG5{z_97h%Tx?Zq9*vsR_)>NHfO~XS%w-1 zK+-V|c48an)=eMBrXeCH>#%HQzhC2AOcHBdQEd6X92Rn|e@$X?jq3qH?J|se9>i12 zXf_2>Q6R{|L#e25jJE*!3Ks1$zIrz)+~vem74{O%Bsr{T_@UCnUG@0ZPy9bZ@0Cd? z5aHpNBxe|{|Gu{?oaF4?aY=BWQ*bR9 zuf6^61O8(&DF!hrcp}SWFG99ww+}I$yihbadg!(AL9xaq+w~sJ51Nw|!O1+q*2C;S zPSjN&?CnuiM&F1Vo1aRm~7Sp*HLzt%o3N zgY>r|XafsYn2u|jsAo>?JJNHJWyJHR+BUVY7*j(h_HKFuYPP~X zoP8^`#Ljhw25t{>Xr<^ObG71V9cnG}CD?MUOIyY2YbO)3Xt*VU7%?H2NLu7=Do<^X-gVSM7>pwT6$DD z?5W86%o|LN_TIbjzO#2$92sYZkdP3%!^w8`NIHAVjzV{5WF!fBfGWCy7sA+QmvWUvQwIZf2PVkFRZ0cuC@P)-_z7Smun9Q zu+@NCV&Y_|W}^X#2`O#vS{s8yWnjllYCRn)0Hdp1UBENYW6x?~R{4TU-HAoHv*E3?`cEW-n?PijElsqv#=XpU-UJXnnc`Dl5yoJ)?1mR^ zm=1hmWLT11+d`XEbJ24xsp(mmS4!sXq@||f(@&55D^pfWGe@QE$^z><#uL#>ZTz`m zB2%ku3jLq!j?*8nHpwcm8iUV=A5j_Qpy6EdG2im(c$J@bipEuTb-@Ic)#r=_Le#?OA%eIa&K{avJy{@uM zhRG+=U81}4zZ+zw%ui#Vw41MHMwmM*Qa--KT;o&tw4tXLvY>H9O>~*s@29nn=T7Vs>Sn2N>0oUz?_GLF$Ce00!yakwgQA*&V0Bc z`-TObK%^&!9l9;LNs2J`=k5iS%pSf;m~8&#Uki`*e_+54B(mih?_;L3lzbU)E@k_=)bwG>AmS(siD zpD(L3t4*7=wDTEe?5k{xItvv(#2X@$fqQ}^JaiXKil5(p_$ZoAaph{xoA>HkV*KNw zle}Zf-5rC0Y?$R?M#4qh+L@gQGE9d0t1Til@#?bOqh z(r%~yRL4xs!H-l3+BcR|d%zIaW4ibkNpkMA7r91HQ_$$N%o(AoEl3Q;j8qGTp)mY? z9qD3%Ud*rha-8>!>bpzk1uyHE>K*1QGPVq#+#%_ z7b|Uak2(_Y(ekN-+XYXl;bMEEcU~!S2YC3%lskR_nH6GvJ$=spuYZ0g|GNu8VKmj5 z`E=WQ75KFa_F@7Dj#@?12<8A-UX3hQZ^xB-ho0m&N?E2Xad4=Xy)HdzYdOWs7llu{^u4y&vTIEF5G+2X6o54gG zo4pz6a7nYRFQ!**J7j5(Ibic2xv$?S^kL?6rdl$Ai8j}Y>|)utb}%M8jZWecyUpkH z-!NbLW>Ub%{g4H{=ML>&2)pMJLxOKNw8yWbi1%)fx4ag<9Wk*aeGOtXq+X8v_M@Ty z5xCjD0^z3BO+S%PGAx8a5k7DU%DqVC7Nw2yD56hA$s^a*McI$kpm}kG( zzKc7uQXf>02&J52S3#2nwd;ea&YJ2xZUuSOlu`WI6`AR*L3t#HA6>y5ksqEfMl!Li z1izOTI9+6%8dp#e;-S2B>gsXp7&foqOp%dT1i=SY0 z7KYF1HcK;k^>l><%RzL~n_xzO?i4T1=lETGLFa_@g$t&&ki3%X4C6ObhhLyyWs#S7 zc*Mf2Fu|fAak<(0g3@LN$@r~$%{o(AsudE-67_asi;QVlu}*!h(zk+v+m@>&+4Q)` z!YhCGKV(xz6J;u2`c=#ZZ;0Hg5M93jLXE055X5)TI?S699a(wCcRNpzce6CzF7_7*f){D%LmKBi! zyK{UU;ovvs(1rA&!J5n{y*`0~IY^jZO&J`-o8kq=68L!?-z*Q;)0v5I^9`2pi&^^3J~F%-u>xp>^^lMPZ3hZvJ1X-MiKL_QLIg zUhL`HXnjkJ#nisgD3cXLaF!xVh71g59DrDzUO<3s2*Q_UtcU}{G5U5(Pai;j_|mDd zr?`z18wb5s=eFc0cr;Yq+?Pk)M26X|J+&sq?2 zHaT;}OTS_jMCu0xkw)>=sblO)$%!TXd767WQ7N>2>0D;feC3agW2yV^-;=i$HpE4F zbv;D=?e9YeAMVE2u@|8OW<~-e?E^1b=OGLc1sMM1;itcfjBEl6T?tr^gLDZ1k%}>Y zac>PD=(7Oj5~*GpJfx03aIb45A4z!HOK}83-jl%|xc&Q4Dc+&iGQ7DfKgv9;N_;pe zm<2wRw5hUTxYs@5V&^0<4IISH@00WobGJt@Q50n(Lq3x58-P_0*+8J-c_i^q(t}LW z2^+lCYX!8;^5UE9=iVh{GS7H@263L6ycaxWk@sor!y#f?L-TT@zFMyvAM7<&WUmCK z);GN;TaT=Dg;x2RykSkrl%?RSJU)=X_8-=y5<;(A3+}*D4b^MV7XpGDTi6I?!`jjY z4Nc97lNBx|kdy*&<7jj8?DauWpPTHjldaN?545wf9Af4ZwUxmF>fou)tIlOf znj}g{`XN}+aCwAB)gpc1x4ifQH0Ez%&T+{KSBRlCA2}{bTRKVE5h8yD^6E*AP&$u0 zu|Y0o|F+_}XkfC@qxgvT8t%ry!QL2?t^G|VBLSRWuJ zEp&0&+_7O;EtRnGHH6n5-6-p`;mDc7_Bm&e$E$R6WOV7*&iovVaUYSi8>Hy&e$8k- zP|Kw4AAo(3uGpDyK@yOi^0Ju%xO8dNTE8eCDn0?zc$Q#1QhVb0>-yZhj~GRycsU>* zoK#Vsw6=rh$2T4S7UiXYhSR9LsS6{wQn~&va@kc6Yu9gBy{EI8Y}t@t$2e-hA=)tS zA1TFJ|NNTLZv1>O7S##wRg(E!9>zLO^@sjCYEZAD4k z8z%^I9wWt6WHuB(o75(zCh{rMWP=T5&|n5OR$gC&21R9;d5XVm;!)bc?}4&+-baec z<=~8$rHeiL6|C*;u z;UEzt!_ZLPWAXh=iFYG4s_c?qz+&Ziz7vdCIhxUkKeVh<$$#fTYj|AXg2(9js@(mK z4Rs4@u5X#}oV7v7?%`MD0eCpR;b&X>PiV7hN#cWlyXk^mhB>76?As4g`y*be7l|QQUzvH z1$hakcO%*V+|X76vy^M_Hbhuv9P&xic;rG&ZWhF@M7pu>kH|dYTS|_$ekgI;rFgws z`=f#H&hCkE>(9s(8TDHZ=e1PPB*(ke9kjJp@$3F8NM>J9c)%@_OR8DH=M-@At(oP| zy+tRAsfkSHi2(VB>r-`RO5}-`#l0gr_azOYiHX1xQS)4KRW<=Nb`AP&p`^GEM)r=>?M117v=P=L}EiTv-gAhdMc zaDQu*WpSBL;j@~eThG*avH zcWZ8cuQITw=ua*CnF`?x4^2)32l8Yn1<(*Yn3KvA_9oA_`})luggpLV%FpT|Z?hbA z^WvW|#RjN`-dLqDldoVgW-||WWsT3SgZ%q(OFy}e6Gczcb9vK@-=E*c_3n@~Zph!x z$$QI`_@~PfaXa#I&)DWv^0(bUtWKoZ|Fk1a!T5W3smyV}>eySLJX!PJPxgOqW*H}1 zKAn{%R7SJJ%$KKyMSlFs1|Dh0Eu|fCrhJ~${4p#=&8ms~xOu)7?rJ6iLwOMw4wTxv z^R@1!;xyOI>aum9htekGu|ubVy6^b>7=HU#(VbsOf2IFc=``n$yln4}zP54y0+3-^ z`+1eda71u@_bYL`PVzX$vn1I( z?sl>6t*=*7Lu&XPFR{nT&f2G{Y+LIq#=hT6A78AliayVdiurIJs??ImL;@Z??s_y# zHKBXz8-Nn{^K^u7ZuFSK+fGHwCt31p|$+N+6&C znA_&w-Hz(Ib5;obWYZaNA<%I?QBm1IP2EtThNAlM;v>1uP#U471MIN^_Pke#+LEEPg!MrK=NcIM{JAC?);k>)s2wOoddM^pVa&F}ZO?lYB%A56@G^?dQfEA|b`?fWpvR~tkbTq0}aUQj8(j60_lM+9@7g{|C=Z>}E1vhK9x zL^@`dOP?fOA)#Gg{%x55sJa}dxlBvh8I*QJ>PG}rTJk9s66Tt3yU>6IeKD`bb?b{m zB#<}7zCP))V#-g8pgCbWIDsoHTLMcBNf~(Gb?M+ZZbFa;O4~@?Y6xKkYwP0{CrL`DzwOJxZ5wINa4O_+BUb7TSFGl zBd>9i%i1`yP}ytT%B9nu2qqG)wcs$s-5NXqf-Q8%a9p#wPZ#~;L%MimfZjIOz zw0*5*sjTr4XOLqf9PZc?%XQtU1*m%8x%lCn|DrYnJFohk*C?0HsmYJAJ!S<8PAx%t zcV35FeSB>!6BCwooFZ>{rv%3(U#Do2e_B%Y+>5g(=Hn^y%HFhcmoA&O17K;4 z#l0>yceoa`h;ezm7sILf(V#1EsW)EWXGrVQ7-zao@7GKI%abJIxH$4^k9hcCy4+*M zjgYOfPsAOqH;NwF!qv-F-<7AB&pG6VqA5dwzBG;AD%001Ny(OjH1U8@Ub$B~ z!>-P%>4cVdFBr-q$}~D3Sa9_h<{ls7XkEI6#nEY)jcC9$&QeY{bqZK$CyLA<7 zUYDWEQ<)6t$mZEHw#*ZEyJdAQ@O-}O7%Q}-M#m+1NIFmt$S|sXM%O|-$zX|GHbNk| zPr28^yu^wfBJ_+OYu)nny3NH8<91L$d>|T)_&=F0ZnFdFnoKWKs&sTkv(7l_2fd=rmBhvbXaT$pTNyQQRMOdIlEhO) zJ0PIRaGzUJ^r-jal9fq%h^)&73vlaQdSR{_Ov=nq#A;=CQSp0QTS5Gv)6YM;IQ#CD z1tOkHe@*|rV_fx|r{e7VINgeBp(710Nj55Ss8TfO&ZP;}cN8$vp!Hc|69eOT9R&Eo}KBZ{?2x`#6-h@ zm?aks67)0y8&m`-7@wK6p4u}$6~DpnOo$#SSlyOQ=3)` zYI=N~7iokOpqmMUiNL8)h90nN`RkDhUA6Rqd`Y94MxlDDDX+X)B1`!wl_fR;P_spg zW0e(zP$Gr`$a@YD24*qaE?aT~7Eb)uME@c^0n$;J+~f!ut;U_0n!Bzag2#^* z+3nL?-s?6Ox&{<3gUEDGZE47jpyw(QWOxxT%(0sK^j^)Ddjc27JzHdHfc;2&fl)B0 zl(gO05It83nNCVm88VURSR*kCm6|SHDGV*bJox_c+KppKKlOVzgLaZZc&tz=+WXPc zpgVvws{5*)oi}EYqqs2j=53HkU-xX{&72P}lqdkxD|-sFKSe>ci0jE*p(05CoC)tj z;(qFLk?S5WI4$9G#G@;y9ePOLH&lk%h;#AZbsp9?Os3DSRc_X;@ zBL2@;sp}?iLuj7{L>>3T96%fe&#ztt*g*8$!fsI?QpTMZxAB`2)4;^lWYKY`ilA(c zwtN6J#Xx05f;-KuX%72>LeJ4?OZlO@|AKKDO@GlA4W+dcSftS)Pb_d4-m)UZ<4u7o zhB1w!c1n>hhHq}UX+~aTF=?REZz~8VRKy7~!a+>k=Hd%A``v8yrhHeqO^OS@3)j;* zGd=iNr**9z5aaa%HJbF?=Q*Mi5KmX1^waITorw z0&$cQsE`O%qc`4P3g{FhX>$4 zc=~DS1Z_Q@xO}AKM+4Ev3xy-UetKVoZ8t5&p)C&46`LvNq9c{#VH%q2M!t^K{0-PX z#_@qGbx)(O@+eVxg4qa;H*g$YXh^|FX7|Wf{1DTl*tSBBsLo75rvBw-wiyzemH283 zGY%ci*2yc!NJxPE0waDHGFeeXhbO^t^|>8>Tid8Nt3Pm$L#XTMRR=`qI;(ec5o=QZnSw{pd>GaF^^nhqg>`_ ztEbAs9iB~BfyxkUyK~AU#R#y_Pz>F;HTzFY%hQX9BYGEUIFSu70Gcz8;Kd{>(&2Cd z`fO;%MjF?~==XhG9_XZyl((R_K^=-&gk%vlQ4syVBqXMB(PC3_SsA>^jOZa=4QM&E z@Gp##|8T+vj7_s%Ajv06{KVqxs=`ogNUk{Yr(RP)7{wI8np

C0ywUOTL5)lMJf9 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%0A_4HkB1lLTG}GrIQs~RvmW^ zo*JI933nT6y!*jgHEuIhA{~gk$fluX!ou^u6OXz53ON#5no3C0D$HR&= zK`vagukwgOAXc#oD|}!y&8&9C+cQ3yRE!yY@tm6XX`l|kTtpjfpQ~tpxx`28U zEK|Ls+rzkQdb8fh4X@|03YmMyOqL7%@thzvc?;<31=>Wz(jq}DY|qnk5xoO90mHrvVP_oQ2L4fa8)m%oMA^TCh2W z?@cYlD=wPiAZk9#TA7RDYcuBot;Zn)rlJ#B8xxd-s z17xP3Puvto8(!64r_Y7-%`^Wg_4lE*-5RyCd7(MQQj(1fJDeBQZ+!8qG_rgs2f#dV z_l+qEYU;3nVV%jdT~HHQR?%Ocvzw7s-cTtAsrxKa$~OSQt*;uYuAR{rUo}jih2VL8 z6A<9!y*UW={gNF6db9zy)1QN6V)RNUAG-oTj;l-;S07IU+=z%e+B^+8c4G=bqk~ND zP#VxvKvCN7Ta@nRwO_)};QfZ30Anky4o0bpMGJI`}ApEOM3Hr{>{TCmZRpsd%H)_d)Xu3 zMve}%+-{KvUi<|J%^|H6phyM~NktAjuvCgRvgsVR9}Ng=lcx2?^1K#o*4ke;QEVfQ zee`#WaH#0%nUM|nC9!5+~6l{Dou-_)xw29>!aum*$|Av$u z|8PVhoTyM{QDg;*@muNp`lq?`83^8=Mcw*ifTQoXn_h!%*S6z&z=pdvx+vyH$867b zhgdf_Kf|IvpG1HD$$bww6_0%V`KQ>qF9~Ocr%U%v#@P-R^_TlzKnxh%3g^7uDE*RU ze9&-sTXe2fi@mk!;Jx_*INN^vhTFSBHWVDm&5xop`T>4p-07;5Ih;}oc&f2$hFP_x zV?KA{u+>DVRv9HpHK}GM0j}fJTy4h8WkykOX$jZP8#hfwIeKheLb!5MP%8fW-OT%VPN0_Vrt%lg03UfP&cJJOO{p$ls>0DRey^wNx zV2KoWWTXVa?F-)dmi8UL$5jL>p3>-s4SUW&<@xZOe*-Y-}l$+_(Kxq@0F6 zJrM-u*tU(A4OXZM%5xo#%>IXAOlRll+1Hkumr>kQPE`NE#q$Q z*q-3-YsMtAO3SReDmXNP=ASI^uw9Ikat9+$6yRo5*M8m;n(Zx~u`%P}U3MPO=eJev zM=E|1UTc$)}tR7&bTT%Tv^CRd)3G<%S11H2D3iIoib4nclk#U{%4^s6ubw6{xoT7k?5ey2uFqkN>Q5Ai$0b2M zLnzUHUqX#220vD-mdJ81){Xm&m^&cpB(6+xZVP*XKm}1@F>y{_h2n4e@_)%<`L-HT z*E#YGr-OG|(M#Wg5f`MwTpK-u_n(?+NG7;pxCdQn-WS$2_9la3W|k4DLy;azB|9n| zmmG1pvGB&uGeN*c>bDcwED@)Y{xAxyW>HJR<-2Oweg0B+r;gi?Ez2F?@{5aCHx37H(wmj`cYboq76d9(7 z{qf+MCq}ND;4=bPIhHHiWHF{Cu;0lhTleEQ@Qh_TUb*Md>4zx%IQ0C{S5adD6i?5X zxw^y8vwn7S6PD+5$(pUCXAdf7u3sJ_k-1HI-G+Be1hzJwjuFL$jQ#PcE1R^4xSiazK(SMLc$tFpAb~1W6 zBbxFgl@whrpD#W_rLx_M5Nu=w$%u)Kb6%DZTm<-kT#70b&NoxM8p=!z4dwHDMYMcL zVM)V%N!~1gr)t0hSnrHaqUA=oR4?}~9xfg43IOd?nk ze~%-DvJ=^Uj65~BrYT4sc#ky^p*E@hf?P?a>QR6+T7D&W+w!ZMNu;gD8EpojWeupOf8${=iM54fXr8Xk&)e9*Q|->2#j8%reYn1KbC~ zZC%>9Gw15tqk3FwzNyIGy3|~q&F^JJGSvwODka4_k5t2zwMDkr?>{K!;mO4gf;x-l{i`x+pH-O8xE(yG+xP8bJf74bRfGcpAuvI|z2+l*CErNK)0S@bW9F zD$52f|63Yujw%R~{{33rSWnY}zQ_~dmn20jz zM=B+m>2{CXKS{_hzhZjMfoISyB(z=gn*d7st8PEwg1fAB24$I^tXd6!OyU>kP;<83 zuqSreIY_IK(gim;yShiF3vunI)l7dG5JKQptrcn~V2%JyKC3&*3!#xQsXx(#xB*VO z7*-e{-V4M71Pax(h>A?o6`_r&zkl9!Kl|AS&UkuzW%a6@**KiDITy=wrKizo62}XYETv z{<0?ZmuyU@7;at9U*+)Ku~}L&Z7H#;`JO`vB%X_IhA9EOPUGlswc|}R5f^3jaEQrb ziK=xDU~=PnB<0xmJ0i!DttePE=Q~D%TY;8<+M?_NIz85J2DkBSO@aEa{?UyoflIU9 z-aUIwf@I^BwFb8E&{C6k$YhASDio1<^;=>km3Efc1QPH4ThlIPKLyE(fT&id%7%w# z_?!kj;A$gT$~-(gpZ>;V=R^}cy~Y76xfxi`(e+yXO=4$v&9LNCBCG4_u#)e5s$x)w z7WfqB6Po=3U@Ij2n2;#2_R8m9rlfWmgM2H$pV=p3?S8aAI0r;=*BbnJ!Ob$E%x?fx z`=@aOkK->nyA4sB>wSxO{qx1S#zHf|Upn}L0Lyd)6178a7u&rZAU>1KZM!b3E0Mqq z--f@CG(cjGy3hM%7Yq8BkBkZ5{95wEi}4n{qwrKCoGm--iM|*zd%Isg&LQz5=pXt{ z9f?NreI0=6gMF$b5k6{YNzp;P2|S}(A!q$pnm%0rR3IKC*5>=>UQ{_3MUQd=j}B>d z7klDLjpu2?C8*ck?caotzUVpm(TYo`inb`nzPg z@d$)qSf7BNhwDES2twe{{B)p8W$--5W0J;Fob*hUM$^rnbIe2uB3LsO)P*KBI`sii zWC<#XOJHuaC4`(DOkbf5-Z>ng+GNKGA73KKUHIPrqIg|>hB)MTj()Qw;k zkAtkNl2C~WsbTdmKk=mZQqI&-*$tMmpp}1C5yhsp_g?J2Ml<}yz1 zi{9LtxNuyzVyM3KB7OfiQT&o>;4h>X9gTVs{ zl9pz*fg}rJ5==bN=nGd=Z=<1Af}Lej;#O%|HoVJoV4n-bNvIGmO2(8KM;F0VP==Ox z$h~x3w`F4`+hT*d;xm+qYPg|VenRTkf(M=);skKHRigPkMH!NV?_lDDwA3M0?6yy7{@Uy7rC+JUJUOmcuj0*%^lgcR5u>_0*kwKc$Z9N2h| zfl}Xw<qll2HP14`*CFb&lJ%e|wov!(+g(0VH@#QctZ5r8b>W zw_zYPnp0iUfr8xuG6+wBt$2>}#Xw1*L5|hzIefeY$%*;I5qDN}=e%`i? z9qnc5+y-?&2eH6OhRY_9JECw#PF`<|$(%)B5GUZ&V&A&eOcs2j5-7}1R)$#c0p?_| z2|So78%Uz~O^~pqEe{n4bpWs{$nYGuru`y4QH2Yh0`a*1T6hxeG}&h?*{6<^yCc_U z`FvJ)s^wT(S|~Eln?0RC3Yde|F+=mbk*XMwp&->T03b{R+wdn&{T_#MslRVZst&T} z&P6S@Q7~}k;V?rXLkDsa9a_W-(0HRF=p2@tJi4LAqXqSUDiF0UFv66|)sVZavfbokwb^UFO- ziK#SCqQID?!6|9=x$4sMB%kc^1)vMASz8>)6pKvy41DE*DswZN{*g*X?Ic~BOZps1 z_C|pLtOjS|q=!?aNKBGc@PaRP#xs?s_?Idi3aQ#gYGw1dSJ=NiZ5P?It|KzH0-PVS z*tAN{s@XY@eo}T1o2YC;8%&%xFoTbxFRVuzUYr zI4LJDj8kl_z>WLP!u)I&*aS7uvkI?ZsN{_E(}UA2Za&w$-aIShMSp(By(!0C zlZf(CPQDVF>>Ib%)t4MbhsDs7BO=x=DkoneKm!R$TyY7qYYE_HTk0Po`@i&>Q(%Y6 zI*&s_y8e84U9PQ%I>lJ5wWTMUXT@s_pYcz;WD?3ZJ%7w0p_1zHKJNt~zjwT$Y2?-# zadE(P`Av|Shz3pDNoB%WIm;>$p9Y@P%3waLqtPWeoST&`zPOAQtWI2KDdfZCvh1y* z@NX(E6JfZ_{Uo9iYAtr!+2pyjas<$k0KL1B9MQJr&_IZXOy=ht%> z5QTpiO^5Xa`>85HIrlPc!cEU!HMU~#2}9~+^Ce5wxOLoh5hq3H>D}auf0r>D52kAv z86AvPtcW=#YqL&!PNa+KO>`3#(IZpqyOg@sx-)uoc)C}ggK;e$*^apTy&5I+6}6vj1YQh^`m-0mM1R_ zwFf~B37M#dv%DZOpD}7Sn;FQwXEdzoD3_OP;Y58qOJQ@z&Ih|K`MDjxqn%G8UaunD z`dvlbnfa)Zc3P2LS1NftiU4!1w2j0Fih1X_ifD${}D z$Kq3cADsD1FB1J?lwO6ym#*8-XKp~>O{TX2mTZ(JN*a4I(pDOE%jD2#+b9 zI~**ws8ar+y}a_udy4$?ch}R|#Xvxn?x&cyZXxwjdoTSaR=q(99Q>pYNwX+R&H~>{ zpPJwPxpN7CBOa=x$}s9Y>F>|)2B_AqUG8LxqcYtrV!B04xj|zJFM?s~5~^T2Cg}BV zDiHW|YLq|uZ2da9MHWgmz1TVqX^9bHuHIUhRy?_>))hZ|$Yh@FrHl_hkE}j?1WT&d!6V9Fc?r zeec9wl}i%!;ghieq4VM15|04{fF}H~%k15J$h*rAk01IT#-%dd1YE9^28yAGt4iLl z{s3^64yqB5s-;v6zYy^gERX;Z#X?i|4&j}gyAMy=-a<8&_kA?V&FXrb=?MkxAmf#b zh6_iRl$k#Nhqp5-f0XHTQ|U8#Hy>%l<56Kxkw$eb?=gSOPAs*5Jch+vlZ@i(Jw$oW zt|pvm9Itk%Yv)TJ3q^04L|mGwlD@N23CM=XEAMvoeGDl)Mi^d+D@tJ=jkrl=inat- z{dZjcDI~Q_HS$)1s%4@oZR}iX!o5H!LBjKWH`E-Bg}=R=-FMQK~1QP*^=d2RBFzlp|6C%GCs6@9m2dqLyT^W~qh+!rFNSBLXvh66wQ0(t)v zgv~t_~`vtdd3-VKB`(;#evj_UIsFOm$P;+$M53!zQq-#u)K?4cmEcA zJ7MVgoNOT9hA)X(10swiwK0I2%b;_o%v|h#CwE7_eyXkS8jL6{euYb@$ z=DV~ws`N3AY@_++t#s{M@t*K~GgA1w3(czDpKKE2_1~5M_cgjMrx_`~|g zDL1f8SJ5PT%#Be!TVdMIkts`cRXFaH!H<$Db;A zkMMOBjmUD3=G<3Duevkp%ohg+FMi2f4fIlendvuSe~zb}8dd%=T~#ts5C9hsuPoxI zGPirggw3##TR;M zsnRTS3Y!2XMkFsSqzw@$uijk9z?Bf>BRq@Nm^g)FzZZ0#WjOx8*_eVxfo|l`JLE~XG zE4MZIww?-ytGzV(3S@nFekdyS3c^5twGR-#CjGtQkr z-L+Qf`BiJHGOz9oj-kB~1uzY{n`EB#X|;z|OuyNBS-t%|MhGqnn(S3{en zM&47>Udef-wbe&%Bf9lX*Ew^t#h~p*mMUeOAjg|hLZF_Znp`dqNbR-2PJ(og1c^_y zls^V2Q>Hd-brF1He~1eJg&Z3RthXoHVVBFkX6aWWJ@;Jy_(R$CDPKnS2J8@jZCTl} z%)rCBa6)~edUx=chk6;>`uuXnEqi(`r%s(8k@ZJOK*p=qGwb^`eG_;Jt;8+*QcHsL zL{_7Er&@Cdua{7(9%FYb(hkz|KvwH~lQ%i=S^{QSCC z$9SvAwymxpd8vk-`1;jJN_%qW@?=fHmnpTrA|?EJS%XD8t=Xl&x0+;MD0t2p*_f}T zcNY7%3-n3Y4J|ZB9DfsX!c{;zJ+G#Hk9Lp#S949n@}q+c<(ZV$b zbS5qGlqdzn|JT+W6P`bKzW%bgBL1tu!*aMrwxy%if%w4UO49Y_+afb}VkOWBSykic z`SiPOMnwrhX>Nh>HE|&RAh3S5xsf{cN!#!P58J2_WBN;~%!UohS5h zsdqN)%wwGKH6j?3r9Ptd||L zV#`b%cP$5zp@3wtxUwSA5-3@6az3g5smo(ICao{V=L-J8Eh|1!_uSldmcAR4t0l^x zxTFp&WJqg1^f#4Y%k5p6N@mK6+lds8OmH5nJL7R;Y_?~pq4>6?WlWpwuifD)<4gS{ zfeR(Y5&;lQt?ZTkg>jxW&AgMy`SfiG065~9#jK;M^aFKNcNx!KUj{b3q`oxp*62PN z7>@g)YoQgD4H7JavfQO7>+Dp_M(dfdXkZ6Kn9~XspI7p3p1#qYOI3X-S!1%ED*5S4 zD{J6#Wp4Iy*{tsfQ#Xsa>~>h~Upt5tI!_X(Wwd zDqnrljy46|^wfB_A5kUWuA@8iwG9BrPkYrgZQe8Gz(%bltd@sPWK$_!oE}k z%*KGme@^WpI%h=@YY*<4Yf$Uj$#Sk|j*b6j@L8_a{r5m|Ajy%2S#o)m@T~G67glNx zFh^&roSPemC7+A(mXNKkBw!!5u=bGymFrtV1MoSHIWHRc8g)1Ktoas7n;k4W!*W)B-CF4^yk z5#2^dT_3`YSoY}?Iy)rgTg!SlRdzh?;y;#m)zCkGm!ft)^-O={Qb(qsJwNhI2G+ihobPxCp1&B%RU zUW*?IH;kisi0&7SsLhgudoeqm_)0^6CoxX5mYFYy8@Zp-6a|70CQBh zbv{p_eGC@Mc0;lxCh_&8#(-FnQ_PXt(k( zru0csr_eH8XpE@m{s}1FGYs#}Sml(4`9mhc1Ng;hpAg>X^_+w9Xe;L7@NmaF3mvuW zQ#o^{8l@RZzpno4{I_!h3ypX1kiWI5ay4o+@RRrF-+BXCSD!Q{3LQw3f*nZ6|2?*5 z7!d12heWgdO1~et#=F^3s!9Jfmd!Fos9(1}U&+r>&exoNCvv9^aX)K|ch)1cr$4UT zM?F;JnyI=IBJC`+ZnFTpJwyq+{Uv`;tczPkKP$K|Q6-$_wy=*jEtg`u4DTfhA|P?t~7Kvun#2hL{ubPU#EZTq04Vec%Ie(O2xxar|Vo zq&WcY+b@zj8dX6p;}-es;mqscVO-&^jiAIwl*Yaq{PGK-o$nZs$-?eC47M6Z@m470 z3Soa`R(21nn}W3%Tx}ZVc-EqnvNyUl4 zW=Nbp4%t?|JqJ*_+PZBP6>sl2vJ!>hJx%&lh>nlV;zdU&@RRi_nWu87;m_SWtLj`Ne3 z{CJvoO$RtZmMWK8rYnO>Vh6)sF(9ZK=%{1ZyT{sxZb5~K7Aj71&2r$f)@1=qASn(U z2V6oi7~wC1y%^4qEk?GsnZmUrf6gX4q{eQ*+%)0S0#hTL+pcB!O4O2;(K(W+bI%Ci z#%NxsG7zcU9r;u>YqiBf(-5r^XY+P6yL|FaThGChDDd?xtyuXHIf#+&acR?J%8|9T z5mwV<-mz&irOC1+CCggSMN9f%*u1w|e9F>W2Xs`YX}QYwxu2swOO*2$fTwbZ=@-CH ze`q<11U<5a8RBS-%LAm}+cYJMw36BLBf>Ta)GTJj@H=|qB9Z~_!{qWw`%CV>-2&fU zffb|BD%PcHbLHReUK#F>ywMG&1dhnJM>6GTy-b>Z_bvLhLaCl%^xH}I8*#^S;ahKu z(X+G1&y!Lvb&8681tW9D-#R*vy`GiFJ9uQ}MLX0^@IuO)+!D64VpYhN=E9$gwvG&_ zZRiDVZz9y12=P8idW=*1Qt?4KQ%=F%`0PlefPvK`l2Uv8=X~s?{^1J0aj#GA6jnzx zB{RIrj^wR%BWcrU)aecIKEY&+qOjTfNXuw){UFPt{(S7BLm;$8sPMvy{uf}Q3MfQ0 zKdKxbA+c1ta$Ft*7hKHuw#D`ac4=>p;A3LA4u&_zb((%$tu3X+%)_kXI{x0#D zSXo|FrR!Dgb>bgdZ!O>sPZ0mvJcCfH`5n&s7xwng+1T?R<#vthmglU`p1O0@Sqv9# zDholsJ-NFUa<^~_{3f|!4K7j_#j8q)^gM`;{0>r9WxJ>JoL)NX@t3*aY@zFM8k=wu z+FFCFLG!d5<)v!Rbs{F{m*%OuBd=uZiH)e}F(Hqqkf0~>s4A{AP5N+qr@+Q|&Ra{O zw+1ryz2{ez72zshPPx-O;(L#{A(F|O<&g0Dp%|~)rnzCR?aVsi-xP`xR_CVQ=G#1{ zr)dIhK5w3?rG56#r|w|dgtJy%D<^M@F{OAj^@48(-knhc3+7$Ui#7}^%Cl%S?rB2p zt#wW<+rdKC5v)Z+oR%7_EF=y~>)qF$CMFe88M+G9`mYaBRjxh@LNw7nf*wb^WUeZS zWS@le{aYlyt1dC$6b<6l;O(kLXjQuEc^}yHk$?H9L9M~gU_7{%jMIH%8=&=9d$WAh zwf9lOw8_DvYC9!((=*C??k#9&hWGbkZ^?x1?>&)I^I(!U*l8_-w?Xq7dZP~3G*Z-L z3*5btKf=*34YkKY(Q-_*FvU%F3Dw z$b0p-zW4nB}{b4Yr=D{nsvS?-k~=&U`V7TL;oN4~cV(mA0prsbV3>io7Ay z8^&OG5fFO5em8&UL_X5U-a4Uuw24B~=u$NHL7yC9DROf|xI=>BEMh`tO()vt7SL2u zIpS-M;88ls?M$RiX@>qrJj-9dAGQ=qQ)_@gOF{n>TfWz?6@yPe9GeH2=ul|m`i3>g zuC18+`Z}g7c~ey~X^-okeN1t-`R0KDKfBS}aQGFKs1flMMh;2*wOT`^zf*Zq#xf54 z5?)v9`n8mkGzQ=R6(bP*00-+x(Q8RLoi%yKd+E?ngk3dXJLrITV07irBGfbUgiBdI zt)ah)&k0h71%pND6J_t@v}WRf;;9s_Knm0zN1HavXP^gF|4T7P1gXoOm}*Mv^M4z$&Cs7$e@`lieV62tOnE|sX3 z%N%b#0XHMLP4sl+Gg!4%R0GHTH^byh|K=~Py7OAr8VK$!MmlUnJ&Z=N9b%x^@dQ#d z)hzH2AFUh*q%Rr*8i43gI$}|aLSj6enmitBo;H!Xt18yy7+w0{3Y$yByL=IICl9+# z^!eGLuSlTi@}mwvVSm-Y_Je|I2cnTYDgR*Wr$7r6ZKZzcC+5s{VeO3CgUrd{^=l7X z*8I6WHrsQz+c}m6UVo-yf40gR-TOB!LwQe;e^v?31WVN&-tQgqT}7f8cv1dn;Y68YfrcEz1T#g(VM-pz_1+&o32NK z?cdaf1&^xl{>k~SnYavV&^f)_fF&Ufh$p`aK1tTNhW%+&q;xr)eF?v8HFW-H6esit z6bA+#>YqI5`FAUmPtNuJL3sMK!nX)+jx@kg=MmFR9%A3TlIGzVM!=(XwdobpjpI{gwu?G5CMxs?x@9QK61*UTZ$4o*FQ7By z2%{tzOonn~Y0%@>$p0=6%_q-j=W0KvEf)FM_-anYlmh71$*4yi-|)WcWTIoFdauhf zcMs9`pLXMb2(KiA-*D8*F);iGo8aw=;tls?xtPxSc77v0=o_zOw_YTUU#ysQv( z8S_BtZ`#Wt*iivvyN1zKm6rbP<S)S`b#q|q(hM$Lq=6c1y^=FNV zNgASY`)JRuq+_KKx$qIBg+pn;-0lEfI|=sVUk&If70EqO^N!BLYA;o5GSlScH?xD& zp|7OV7!>LTY1qbag2)k?+?We7tpihut=3u}5zR>TQ!w)?csr|v9 zxd!jYCfj%ONI)Pk+=y|V?+v3yTd0A%T)pGYUjtD?>Es(cK#%GpQio|t>Y12l~9L(1koQ#UN3|a#<}B4eskDb z9-0;>cvk;|5U$etcCJ?!cJ#tyt-zbgp@NlpDzUCri!yaLf@gPii#<|mBY+k@PM9@! z4FAx^J%yF?NN3MqC&Mih(gfl)UGFHyAxnFi#-60vcUk?fJCL#hLXk^yi)75mbZA+c zCN0zjmYJZ;qfRAW8_yy{VTP^usS3=4pvY+cqYt}OK=Uw*Lp#vC@Le}4W#EUE6(7CU+#^JxPzF1uk$xVs?a9< z;y1x9vC1j$nf5h6v~x(xR}e71San~0;fRK0AFb-m0p-&(Li}Q~9Qpazgx85eLf2y; zHxOkoPwF`9HW92vWk~zI`4;p2O{YuMu67cPU6A7yEFfRv!TU>d47j)*0@K9H-5_FE z6wjex4oYO276s^Z4wa2|j1t|*L5n0VPENYW+e2EIM0y`rim z=EceO&m9l+BV(|{^cPYq6-)QXvW+bfkj}5RxWE80_le>;0Gwc=7(QsyB~ud9={cq# z;>{1T{~8PJvBr!0>t_Bi2XJXBPlGXpEZ`{-Y97)Y)xs2winJ&asfyj}PGhg;jzJZF zElN7p$i)`YEAYx2JKc`rGaPaV>~AaK*@#wIshhlHfJ0>qiy1@oMrf|D;p-b=M4Fq( zG?U3VT{*6I!W%ajLgr=UJ_o-q_R8B-8rSH^jjCWTpB#d(;lWG|M4C%TZ4AU#pB@gR z@#7fbSi%X&Wg!icLOirB(jtUa1(?!{J+gDsUM;j!z-50$^_3F=FndxZ8^ylB+LJr0 z_e*w}AU(jC0KXgO%po_B`S5lSU7uvM=iCAR^qB@j>BWkGBKP!<9HoquvlUf*=K4g! z4CcUd)MagQ-AZ_frv2AwsQQfxi`N{tA^z7ihFSJ(SQVZ>&imw{xvgt@m=US=4XDjt z{?_47eOZL9MoGlnCY*yAI*uKON*@(E^Iit$Pnxe7ei0afDAlje2e3hSVIxsCBhyQ( zB9NL#%#hoYnt&n=#@@IO*io5Hzm*?iMl!zoX&`2Kwa;CWEiA^(W~t{5XR1ct)y#75 zT7C)nYPi$A%9M8$Na)}FJlVh%Sn5Yi*B1={ zUZI==ngFdY{)Q1#sA)8M+8Hu_#1YVy<*qqS9?gSKRp* ziou1vv-6?(GfHt0mw4TCRBrVP>M~%~uy{^hFgtUa@vYNujEwV&bYVnmUQ`8l03%e8 z(?3GFi9zd^k=*4V87lnu=SwpJi6IN`J}LiLE_Ljo>vfBv#eM>ej!nLdkqDAbB0wB5 z7BIF(Wxa<@x5U3=0U+wIqiE!4O(M;UKF1WbCk(MAeDFYa*%J=A1hMB$^q*LuS7MsA zEkyH8v=cz}0fAs936GMmC6qYwaV76g`j;w%!0S)PIbjnirc+V1@>$zSJnvu=imSsp zRtIF1NbPX=tNsr_OA1*1{J}HculWIbS+Juf?~?0U!oi+!1d1(?_BfdcO#;9eIhbGm zeiHqx%X6gHk)IcUCCU*lcd0_spKX%-TVgjCYx^MKRRr(P*{D=k$sgaeyTPRiXZ@d- zRBfL3w)C5~sM0#~Y&0ZlKKvBS{yyrha>JFqulJ))zNxccEY{pXDCOZK0NaX}mc+<_ zYm2l>6p#qI_z~#gp=^H38;Deh(rn6hbnYE?{Xu^VsdcU)QC4aNEo{ zm8isuQH_YvlK=QVhhl|eS+Dn-?t*vX^i{=EC+44D85ZL=fA2EMY$c}e%G^*7bnYzU zafJb%y_LQ{xaR0?ea zCE8fSfMb%Rq-A&+^}sLcTEr;*Z<-H7ISWPz;DxXAMg77B2Dj9@Al>-@0HHwe{GF5s z>_nFsp>r{|1eVY$5d21-DUO_QJgodEuW1$sERq>RCXAVI;75+krafAbX$2v$>6pOq+y3Rud4$Gm2E{kLE@uQFuT-fLYg==P^HA z;X~&j?KyGEYR?pLtqHOFqU)*XdgnR6b~QhflNpOJx{sfhLP!Kr!TN+$vJV|e7qGco zaEV6u2R;w-ldiM8#qhhCA(js94@I6(z>F;~+J*n$b+QaG;WZ4Jo0z5mt0crOs6H-per;SlgDsl%wb9&wO3yFgdTK3AOrxN952P8Nd#8(e#3Rt4}NsbfKQB2IjrDuOP&Lbs(gkTOtX%DPf#ApaJeih(#cPY zB1s657?uD`PsgPoXzprHXMAH_Ak(VT2a8Z9SMOIv&5mB}8jMjC^eL@a*9V|6nb(GB zAR=>`0~itj`^g#_VH2<1XgO1SzF3)hi`qmxXC8G`G)A*MoTy{%_q)Q?-vLXb& z6IE6#x)2L{ToL@8lK7PuD|jX$it{(WjJT)O*q*5n4>Ae^+!*!f;}Y)bOy_1U=T_eP zE4?I^L*s@m=k;^tkp$AzQ)cJAeRSpK#3_&l4BR)B#3S)5uaYFX@3%t%yJafQG__H_ zATWTAfC@~=LlZ@9Kmvd@OGC*yUFpuKbWw$=Bt8fyGHDnfcp2-jx|BJgCcvv|wx?95>5rwSNOkkYSU6)A>fZ(ZGy2@^&Q#qy)Q_ zX?jcJqzwyzqKN=s3Xlr`3S`zIIh%v1zznk1C9}!y-$1NoEN+%$cmFH~<10YU{P!^} zUR2mc+#+^I>vbMn6+f3yRL-(Qq-h@yDY;75S;qM|!iunG#>Q|{TY7cpnjqIfm|B3E zYE^h;yQrhWZP)MMHY)9fE@iO21!PPjYiCwc>DT}gkya8jAKRJ$l}{t-xyTo|tAXVT zfD!=nU}{c;3)dHj+ZZgjc9O@-Lx^IfVo#$IOFQu&>s9A0okVfVbj|z|tl)-**mN07 zeZ9k}6_Y-J^=UPC$t+HO_@16Z!dB+`)091zaf=fRZUTkJb-}Ug1G1Y%7IbD5kD-`Q zAw@2$J0FAj7_+58 zPv?{;DSR&bC3j=Q;K8@Q-lBT}UkbP?dG_2LiYG2TDD2;a-2uQ4$yKVWimzFqY&e%lEt?=g z69C{3jL39mY5N4nnN>FGaV%L4)F#L(5(NPT;4ieoj8%kxa>4swXb zgi9vV$f(bGzi5?@gx77#RGqBsMxferSXbM6LKvhCOW^^YCUcawL}C zX1a}|>(-Desu*|a!spMiDKy;-l2n`4yW>YiNv}O!wI;g(XalV7NOcDD@6)|kMD8@#LpBs6}{mU zPk4MYt~}ST_1V?=uwF^!cqfLwAVLols*;J zAfNnuIv0KnKQ}YpW($#0Ece1e)#{?Y{)pn%HNg|2Ns;t;HmNQUZ4$PygWnXQ1;68> zj0)M6rjf3Wd9(8~{Y`$&gmUqZ+?)M+mhbXQw0hR*wKbwraI;jnCc~;4Ji+vbp+(oKYkF97@rPWhLFb)j0+0uUXY`gP-v#RQ zMFN!@irqOAsBkKP92?_7v(fGHv#!~nyI9;)Ig=Yx200eJ-zt?n6Pjj7p{WEk#w%CQ zp25$4HSVgU?h~6%Z3~>?fG-=Du%88vwN=p&)2#iff4$+(IgL$rPj>gDs$*)3_qck2 z?g~Lc_`Z_(@~gsWAa+RU#L<0YKtu6WU=9$aPgH$E6DGSZ0`D~NX-&@BxSvvq@*r@! z6?O`4bpCvgR3yR$NWrEQdcGnberITgO}={0j(v9%oRZ3Tiy>?CQVoa10$Ga+!z=8t zmrZ~4%69{AAN1PUD+em2ci6Q}{pJ+Oa7`P2XjfB`Ex=Q->t4I+9-bjuE#je1fxNW? z>=h11x{0_}-3^jZ`&k(4;KY5qjA4!1R5^wX`5nZ-)73#lWdSO#Y|)1n!k$un#r~!! zON3rQfj$BXz(2c_!7spoR~}T_a0)CHAA|2-u=s1*$UW9lI96fzXh-wO9id!A=d)az z+SCiKIBD{7mohrf!|#G~oQ%@P!DNB;_sJ|vK^`RnSIbo87_~LJhv@Z*vj_JZ=6+C+ zR3r;#c5Ey1N`F^25!GZq_a@w0hDwjYj41Sv+?MEhVF^$p(s(^un96N@TA6c6zF}(J zKUVQ){ochW*e>0*;E9jF!Id@AwJ$T~(X5n^^yNE!Vt1uih!DtD;6Pnyby;Wuke7KKpi}%+`B99JOJ=3L{&mk6u6i-d*9p&woX(S>9|vnygl;oMd1mNCLE`9 zYhuHye-v!DVYW4Dcd;<{oAV;@k!+h--Z`o8LtkUy`!$Ep!JD;GR4oNIGyp9O4q;rRDg zcjAar8m|{CZq(VZaALQIj@Pc`UzMx=L8+bcd6f2?-Q>ci_FNx#5{dPaP_i+f>lCG} zqj_`Vz@xB4k1okk`XVB!JhC9=Lg2;FMA*=@1$8o9#~a|V2^oYaQssJAd}z;P9VjO+ z2In-`z`WKO)MSuslOR>Gv;WkC<*c6e|DsL5I)OtH4wQJ8k4A-bX zONGu%4xQ6z64#B;6(#8nIp3|}e0k501=II;3luiT8|~V%cQ37FTJwBz=kIQe(s5VI z*tL6(mpnRMy>G?Im67wB2r-zG(60);*~euf+}Zf1GyB8>Jb~aMpq`-P9uqe@yf=HF z^mP)qdIC>328@D8Y$7gMXd95yc?R4A#iNv@)Ur1g%c%4e#VH##MR$bmPU4g+o}>GA z#1Fv86Tu!}7D-WqB~Ktc>Q|gc%idTj@7SyVJp4B%^R{Py)91?a82c_%b6#0b-jvr> z#(w#2Z0d`uzoc~F^8fK^AnY4~b)ETEbU&pWF+?afI^)90TL=i3kC}i9*_Bo?AkiOqT z%Pf8$_ifpyb9H1-j%aY>QuFwj8{MIs$-X4y98@qQ_E||2>2{xd2#kkN2 zC1F8R;=9@AiNRG3OM09_RNROSh%W86=l5jgdr#eVenx{-&O1iwFM%;&CR(m)LUFPJ z2PXpUAiC?y@_3a$mO%f_u?z$wA>u{KIb0GX)l^>jullzoCoj*^*vY3E@AK+y$cx{t zw!A4PEYVr30lMOe8=DTU(tf8am|TPhUm*l@-fMFCxUrf)xY0qOQPJPM!l+#ds6jm3 z@Vr_QqUm8%3h`6)A(ybCi5;Y;-Lv;!Wr;Fg*1p+*&@-Ih9}UPxOERZ(+&^P-p`Pmi zVY1K3ZRr{kQqeiD%A`Eky-wF-;c>sDbV?&^Zz-hwXcws11LL|~JNzbF7 ze5Fg*j=z&wS1v!Si*TFtqJbOBBz5F5d=hUNwG^eeA)Ky#)?&QJp?`HUN!bYCLT^l? z(avnn!4<>l6_-;ceJ9;RUyj!1A@#;}ueLdjogY$*X^&S#wbj*9z9rsP^huO@-rW*0 zL=Y-^^#0uE?!7mIT$o(C`x(0;tq7OTQI~Ylb;X3p>$5wZ&J3FP{C2uCwGZ2z^j-x! zHNrR&o8W(R!PH?6zGB&F?K^ZbqmoyYzVf~6SK1$e`EKraK9Q>&T#%QV&b-=yiGP2B zgp4CPr)gE}$_tgkC?7a7Nu5k!uIm~grSK|L3<(_t7@V#<>V1jXqW6v@A7MEiz zZV?AKl}pB%S8(y=xIwQHMiBih>Rq#`Poer2|K+4baEVfpHn2#j05JwAUadi+N_J+6 zyRrR_K0?xhvn*<&03w8Ab8iM+vPsHxJK~$&MqxBkhQY%hWK8u_kygm>9^D)X;P7RB zgapQMSmOBU-C+D8Eq9DY7f6QW>cJH%TuyX|UFbXpD~a*3 z&AQ9ZON`(UZ3bRHTK=fya{X;KO)|u+;@UMB*b*h}H;NIFIkg^k;xh5O{)an|4?1}i z%-|VSnL>BpEYabc6L%7>6b%Jv8*rQv!l_`o+h~}gyc26jGnj53W@4}4o#}sk@I=is zk}iz|Q_3URM|_W=BbX(|4P}D4u=&zB0s`fF1QZSg@0cyhQTAQAnElN73H&KnEZx3W z(we8<{uC_+TH5uv1P`ccrWAZ%vV30BGUrDSkxS&WFS+bFE}n{RaTC%V^&+ZTQ;Zh zFn5pzL~rc4bdY~u!OwcEf1j(`IW-t&>V9&h3?XJEVFhg zsi8KC=S?2mXyqKT>)BXmGB86z;7QlksBqq|*0;OFDNPAykMFvOA`Tztw-v|)4?92S zdhSPa<$O5uRiOm$d#^X?OoA`w!W`r-4^?0O_no`nnHn>-0S@02z7m zXw(lMzQjb$gAeJcdy8Y3pa}V57eU%2kJpN=iOJb6Ke^V>{`o_j+kQ9@QjL0yh90+Rc4HWf9AH-FgNIK99< zw5EU#+9m(&{FJ@8IZBpecDXsb8j&>U0XiW=-z&cexq^yOXfT`2lI`glYJKsohk1?o=MF9YAyf5{Bel_IH!-5f>z-`0MWY)5~mBsA= zoYX~Ba4?h&01mf-$O?72O|iycBhnKrA%dHmMq;wUA3hx23R#vrmA|4zr{-|B$NIwW zRi?Eg%BNSmQ2zZ#<$1HzqG!3Sn|>p&RrE}MZ(of4l@4uo%-!$28$%7k@ zu<=r7(1S62@eRZ6kr1}7{hQ{F$;o|-`$CdoG6Of?D2XsweqV}56=%|kata>G*C;C{ zPTvjO`r9Yz2oe0u8(7A$eH6v;tGTA?t*wZiU0h5}8~a@dTh#F0%;|G?kMz$;vD-^a z5@E8hnv6RHUkpF{moBY25MZ}B@Gl4Ao8ymCeOohK9RsQ14&JQ$E_ zw)y&q`!&?mI;Ifbirqr~x7z<{V3*+@f7C~M{AgFs=hT-T(^o^X-rQk}4Jn9yGK9Oy z&VKp05}Camx^5YCDuVc~3lxJr`+W5o zx+3hmyL7KJ8<=+9!{qq8RdsS8}7? z(r87vn7`d;whIc7m_TfjpAPs1y$=dHzWQ)?5qTCwlb;5E7p-t##Q6x?jwJ<`|os24Z&uKUrr7ubn&CxilZY(&q-Izm1~E>I*By&Ks_~U- z@jbvJ{0Jb;G`QgyR!TI%_gBp9Fn7}n>b({C$#ct zC@*z_NSpwW9_w67hY2^J>E6eLzIXFV!XnBkq}Rd8LV3vFK*fe)>yJ90b1k{cA}Nya}*=1pV66hc>|D>kr*4B z@-rBE2sFm0%G9BH33_!D{)^zu|7sIerci*8+z9}R((EsIM=lKpUvoiWV}%TQU=?Xu z?>n=~ap@;)VY<=Dj%%z=M6k$WJdbip*<^O*QP_znKLDNMB$navE?6}WfFc91Jvn9P zbYKv(NK++n9VdC`TA<2t*c~zZR@9#vcPWrM;`Et~y=dGvn zDF+`0J3kp$q@^X4Di;XmdjM*6TdBow#gGe!Xk0CkIzs&2o!DxVx$1}N@XVb8lm;0* zAxEG_&gs@Eqy?(^nhSDK2~p7ull+OOAQbU(L_kB6v(_$=X?UKKRuVOb?c|JO141?+vwVo!X>MAAu@$mU@Trx|BPvHxV$^NzH9-CiP z#cAPkBq7XN=^{t6h6*BCIX&BgoIVxpiH9(p6y?|DU)(NZGYl`uFAKxwC|l>Wj}>oo zmb(ShxS$c4S5dtbPK4*7;dyC#^CN|GM7nJNJn+3dFf_0H zyi`Cxf?pI7Ye3eHPabbZcrHGbSkq!MEHgXFew|;I*HX4_Q1D{1iho1bkBoGzN2!;i zn$r^d^Qw>6%R9s>ybBOPLMTZzToNC$3#G2m3 z{k{^9k!e#5Zj6)j`d z;D;iOaiqHHTIW^q0>&^Yw`1?OJ-QAjx<2bUrEG}K;3jdy)`4Fo0T|jTvj0q^@lTHm zb^lUQh`!JyqMRB{>s5IPuLW==CwgirR?=+j)*}027Cl=k*7NUq7MHa^_5N^f+KLVy z6c1*>-On4V&pmCp5kd)x!l#!Vsv(7<6144$v6C3ol2*v;^H$9-Npaehk8|4qCuukD zrA%(WYlNWKKL`X zY?bS!aFO5O^D314%a?&P)|jRxwkEW0{n1pWI3f*P)H<7n_{vppb;yWBIo4cFR=nSa z*pOE|5Gr>IH6((wR)$Ov#T}gof?@O(Q|ijlwuU_$td*u`l#!)z#M2DXmV zFT>Fo%UrgTW}P(jCKL6>y6x)d$&(5FW0rSZ5PlRpi7CS0x^9oDd_5!%hCDAo6wjjS zo5yXqC#vnMt!}%P`GxlRM=YDr!-Z1+f~@Mo?wLhVO-ySUNTF8(4KYo69i-}stq0@-(rylBLPcm(Yq+MGBSj# z0oyJ)=`A|OaDUROsI32NKHeMP`Hug~nb8apTuVd%q^77?{aye)e_}NtgfiBg!>PB} zNC6pAyL<6-S2J9zVzOS4Nfo#(#j??93g{M(_F?#ZxP%Hnsyo}O>Q2EtQ{`>Z;!D5` zb*zvZ>ZmeBJ@=&gg*e_xts^6v(NMGV$T|DedNQI2P(6M_KqP}%XP~za*P!pCwd-9i zNrv*BKjr$@K=*u*?+L)FxU4+=^=f(J=cFYT>KKk=)rl8MC9hNQsB_yyNuPBesZ}5y zvgjPFc5`_nyi_>@oL<`tntsFJE&k%XP7(mNNz3+gTSFO{rrtC&FsfS$cs=MN1#2#* z{58^~gloX)9eoz^w^w}!W_ij{V`=M!w`Or`D=y^q%$m7AiYxx}28b(pRE3<~25aPm z-#&--G;a1um5uUh^b|E_Cp3PMT9-UFVrhm>V`m+?psT#wK0XU$luLfOf%WYt3(bow zHN_hnMMw*h{=fXJ=ZW&Z_y+BMWV1Ka^qMgIK%S%fLnX7tE ziVEi2{w=u-|Bw1p5_%y&bxjS~2M~@s5NdvcWSE=NQbx3);X2gaD^I!l?zU^NH_H52 zvlQnKBY6DU=7%&(nf)=cqJjyk%d*n@KfL$X=%{08xUJvDZauOs4XNhawaXK4P)CaC z-BriaVoHXgWv`CT+8^@QVYJ@mIab-GyjwNjB z89(=Y{yUU-GthFYL8XkO+lVwehZz0$EGA&^%31SL-OSaemq!~Qz?zd8`sX{K164+P zKVxT=N`<8?ZtwO|UC01+?5xcVxp^sTGM|gOA%lt zj?-3pk^V|u7647nE$S~xY60)@vG3vTMdZ&UFaiyK^Pzjn_Y=MMr>XzyYO!mdCf>g` z`OrFZVz!g*r!;Kz=Yu2|Fh1~}@)z>t)fP~CYT?PY4;>x*6{s}zRId2+r}u&(j)uNz zJ>}dpg?v`7h8+6%_H+R72?8J z*njsga>-QeF!4KaE0= zbw2*(FM)jI_sG~^ZJSQ`>HPQIm?64HY3gP%*x%m^;W=+<`v4za?yRl~{6tDm4e(J@ zaWs|pP=-{nAr+$+{$VUE8&o&*!oU(t9*x-1 zD3fW%Q~w5BfpUQ9kR_)8Mqz}K-x$H)iF8?SEh7wafAU9hCcVj~&3C)t(J)5RdRWP6 znBRa%1PFnPwDZm1{l7yk=RsQ>8W+eRw?^|V-p?1&g#QQO`t}}Ju9M8ClV*AR{|;5{ zHM7-;WxZ9S!&t#1anUTnffVC3G3I!lwASsVcd#NH3AxU+ew6cp65Y%)&kJiRAG2e0 zXN_VtUL&Mpo+pLpTYq-SR^Z({;Is(lj zgI61)tuE)?%Tj9O9NT#Jq;doHXNaU0r@bJ zX=sEY$?5y0GU_^{*O%8q0uESM9FzQ;oCJCpUkLkQDx_^ARMYfLSbkv))bHB1iomai zWoVWwt@vq4vj6j*LAx>vBwJz1vKSQ}_rP>Icv?i+^_(D&n)C?2uT5MzX?V^dV0AYI zDrG5pY-;0(U}@C|5pQq3EXNvWncZsx;l%ZzM_=02k{qkDn07}jmu-S6M`LS#eg5j5 zn*5>&*{9Y5idO6bOxgM@znoTW?pGbZX`p|np!(=-BZ8Q<#O%-NYNF@-*H=aWj3j;VhiVIl#9J1y{+T^D|G(d`?n|>{52o{ zU!;wy!g)onfakvFCzn8Mim@}fQ{M>t9_3vK?;l_0^LOPtRQ=%^In~qp%B>W`DxO@`;9ZN=4Ebx(#2$9tfVFq5 zx@(<*fo>s9M^VeB*6ELyB?4Sbls;t0e7e|K8IIia@8a;cXZ;!f`K)2(=Fz7TpCvjlY4X#*}wwp(3Ik(_g+Uw*}0`&e!4z~t%1?%kkp+Ly@3 zcm`-~5kS_ThC_9qD=m0T0Mn9SYgy0ee}6~9fmCkOO(NFqGZOve3wf%K1J$0#L5 zAWhhLc+004XFM};02YKWmGT(H1mH;Ui@Lh?N`o!w9!+|y#{4gh1alz(tAx9bOqP~H z5z7`+P>2Z)fp#h8D?%_H9)S6!>p@5zp9hA9WrNR$u5?6d>S7r$<8 z2KyykvK@Pq8~a2wE(uyYCI%eL5~C0X?NX6$2os7+M)u9ogl_7M(eJoX?wCD2m54 zjJgi4e9A)sp#7}3BN}$rTc@yvusP_=9wjT)@hqL01;zwGp)H`=y zXfK8jG}{E*JFT)wtIw}NE%d(WkcQdlZdiQ-b<_>iz3&v&Qpg)Z zwY}3oJoKL)?97EqV!$Yt<~4CFMM9GQIeOC1zO%XMQF`>aU?7NLZ3UaM8JlLo2AnFHAD*CW-ru z5Ibpp8%U$pOx7)!Id*d!LiwJ%Gs7JbM%|oq=O5W`{!}OWuiY!zs?;(A-jkw`VOLE) zKe=O0DB6xfyy^Z%P zE6;zV^uNFL$%R`{Qpis++URa#KG#D=RV*0aD7E7ARnIHR=Mv44vM422f}35Wj*1l7 zd8V-ehCa;``ftqnmlwLX-?N3Zmr5n*0wkluA4i5P1mB8~0J5oL-v)jOj^ZsQ(#m%J zcCl)Sf9}-*kb^xQGpLsdGCy9^iTy(xZ8WUAR$l7aHa1nPhM;@4-Q*<{oDwy;k~`U7 zbZ<~G*?%6wOO|W%x_7T>qvUhh#LbTqf^6_V=Lu$*OxBS1atv%kL2B2Fn>?J1x?0qV z?^I)28w*?J%FL_+IO#vAxo2#!UJt3Z-1(AoouWTajJBu@Vku^i7S+Et(lt=dm`r}o zRY3*wSYE=6vgc__@L&O@4X7DWM*_xkW}8hFNmNnKxg6a8^Y)StVA%lTEXj6o=DU(v zR{CMZb04h6+Y%?C4_qs3aS)8;$Gn`FiBIgw)+y^xzW?&aNWVQ&>F}W%-+5bISchm{ zX1oRy4hCV@SDg|7i;4E}MD~LSxGKU+S{DrfOpOLllvN^q%_w^T&Z|q5Bw-?il|bs^ z0$ghmqRooe(;9dwB#@lOq>;wCwFaB_&`%_wX0KN_Q%Wu%()8k*g_-#9j2f3xgj6jF zMY-Djm_ct%C<%mX7 zLhA3d5huXd1@MY>gm5iTmO@gS9#Pk5le-ieHOeYY{XCSZugygUsuqo^d&PtQXc^0o z(W@}93Kl(%OiSof68l|jku~<*qt41@OkS{4G=9wHK}`2Mj3z=LY>MBM=ak^;szV(XMVgfp&t_3+{6sH%l=;?#v2!U{UySIY--w=M za0L9}(h1tq)6yWuj7}~BIKj2VxTuuW`q9YtZnDyNlKj+}-w^P85@C2Hy}dhAWh(C= z?Gb8%wt4Dte|thvMq<`fi9HMGCPugPPsP?U9J&I(YltYdG(1L37v{wS&Xa)D9%Ca! zi2d~QtnwC;ZV^?vaPfaU-Shbq-I*bT5R%TQkcyJjtMYw(-amYw|HxB{JT^`3GN5=`bd2Tw|523;P}Bv80EB=- z{~J}A;YbTAWthasCGR;&tsYH5!1YosI%>u<_|-!Ll(rMo$6Q=OStb(AhoBdxj`7it-za*o{?vK<;OZBa|CmYbH<3_2sG zN*wB6xBH|ZfrPG>wa#E>HV)Sx`%X=c)qYZ)^~!8e38!x@9z~znsdy)m=spbQ4{5J6uvm>77!k!QO$=s|HTOg zf;2Smx17$`rns(g8RU%HJiBWL(1Dy@8Eu&1g^mfxQ1FWas-s+1;m1k17+V)CiA|4x zG{^^u6#-RLwJ$1HBQbkfV7a<@50DniZyEqrDlb<`m?_URmd69Uu>G-AD z4w}u?#Ok%|=Th1!QImEl!kl8&zFTD5Xnq)@XHx2LfeTS%404@k8_376LEkP85Qj)0 z)mP$nIIb$Hf^$u-1W|H)B(*8Ianj~*qrw?|8(zKDKv?1evPkSN5Jhg-=GoPv*9ScCE5;EkJ~!dvNrA>3uK&w8h*!V8ANiucV-QB^02JL2Ogl(&A_6c-1SIiuffsjXBLhq(Q*~6w ze;4gA#CvSQQBr72n>XRhI?jg18K?{j-(m^7VG)*QQdw#D3&sajL5%RIJPZ5&x@cFi z+ZYgrA%Y?c(I5GY*xza`n2+i|584*%KsN*f$~s=r=FVq#K~p!R<5(;l<8RPhlBhRc zGu;2&V`iRnJXXfgs3bWU!RLkEFumJ>hHz*sn6OjK@lS8iw7gU*tKJ)mRg{m@b@|dg z%6hg_Z&u&tb3M5DX@_Q>ltkneIvT%;x!#sYHCFf-5Aij5mJD6Eg*D{6#oQ|pZQ~#o zP&vod2dGALB|hDD=}H{`-BI}U?yuqJ?-0OStgb{D7ajfW&2;2N%D2$}Joz_OLCmgL zR>rPMP%9r%-f2qzxEa9nIESny( z$V7gNaxQ7hDXYGAkK!@6fqyO_crzNRzV{BW-e?mc{h2um;)j3}Q!(GZWyhz!=UF*5 zk?4BG$TG8|@Y8ihAL2l8Y5XYMsB>=AcHw)5jH9c@aJ_bolX?nH;@ZMe&unC+eF1Or zMu;PQYsxr z3Dg}q=hoBU%Zo1KkuChFhoz-joiOv9jflO6Up5Gg^>!$J4MJSFiroaVyN-i7j&1Gp z^SbKBlS23urdq$PowRJ$fUo5GAuFZx9|8>m>^{Z=Z@Jqx-JGd){;^7c24EPpa33A_ z-K|>#H6LL=16+rhUZqfebZmg|0Wz1@rrl2;7tgi?YQI>UOE~R(V2a0YSh=UL*%lz~ zT+@w|vuKFmxi8#96q}7-j6Xm4PE8p!#_)RBcZ@8R1dJe^JE zZ0+4Vl-8-IK5#TzYUHDV#X4;v5*D=Vp1}iQ(>SO}ERE5zLdK;%!IiLE`1I)Q+hGlq zGu;T?GiuXz_vZ_rzascvo!B*CAX)(f78mD&C_!>8+p%VW}Elw=`&_83869%0&F#IVonK=#f5~crFJ$l z4EQI>{BePYX^!oB`8dCV0Zr&P+dW!8K6t0FJ^uT&>aWSgc$-jAki7!td; zay9``#$`qJ01k|R=c$~joe-*r3!J%{O)Z#|i^<%ww&8hXJ$Lj#1)n3A(lb3cs8(qA zM^jnkLNdiHO;KV@;}!2@f#AmHU> zbTY=^nxUXzhm_%o%crKjcY(bN*_&$aUeZc6`L#HEM~hrVnPyDf0=`KEfFqCuj-`c)%ZC7QhOz@KdS1UX0@M3K z2`s>mdHLb|`u9 zJdrz=g4bIu2449Yd)jyuX0q7|j*cKb)%^Q9S^A0VaKn%H0$Foj3Dcw2ics8&$5b6p*AnDbMFc|n>4e6 z6liFO(BuGwLEz)n^1t7!WK5b(-$mbgssF{Pa(DJ}uusXC@{b!e#x~!*5db85B1BoQ zvmh8OtcqbKzt#XJzq=LqF&gYVDYYwg6*Eoh-zYv$`q;4<|FY^Wo>Nt2@9Di$=1jdW zKg_z$t#0wwE86bT1rUvby-#Lt!b8cgZ_O^>vvq;!QQ^Q~s40NpT9n8=al;n{5)Xn3(eai& zc#a;t5DHlGG->759XrN=)s#C?AH2VwS}|Z^wr|0tm#lLN?rQmm1+Mxq;Qi%#ZYwv! z4O}74bf$6uSXwn|o=kGWf>db`OWO!l05}>2+LZRqcYzwsGpH1&UOpqT>5!MtpW-1L zWTBk!CSG!LU3^nAIlqS-ZRS!}Xdz7Xc0Ro*1##0x5&zyyZVvVgDaNr=iE#5o9txl- zhv|+i#5o7j{J)Bo1(5MqCMup0?25m4FF2mb7Q*G6nj8#@roiVJvye1k+G;BAYU-6U zqTLys;UuY~2iT~Y_Et9A_3VyGerOeAIwh4c=I2G1nwX#)U~Rfmn>p-J-2Dov*fxvU zdk^E-DS$R?hBFq_+sIT-2ZQ);Ty=pNVL|D(nfF#n(zu{h7bveBgcS}h17um#Af>8V zsI)9`Dn1&YRYlF>lueU|XTR#nb6SmduP3ZGWNV}`{(?CBo~Htj8n1oVad3_H`ANQS z6z}%?>=yp%efA@$kZs1D;tW?ByqN~l(8*1{l?(Zm(}u|9(9Pv`gm{O5AeNbJ6u5|7 z7HSH(_>l#A3{P{-t2$z^-%E*3w?sIf(i*;^KA${+9W7pDoxn!p1LucJ(~ zo337fULxb2W9J{dCCY-LeB`@salqn$IXJ~efF+*UuozMfC{V=19pHu7{gnT!QfY9@ z`BFCu2C&w;nn+~!-1scNI<2CU@{SY{y+S)#wn7Jm|1nDTJ( z<fWEKUVfV9B3SW zACgnaWS&^kMC63s;Fs3t@rYEbpP4l@ey>OHqt8H@`atiWF zmX&!uw+~(&jV|(Tu4fJ{nwkQF2}Qz!*|)WVwu93o5D%l>YkW};dHEP*<@KEFu6Wn! zUvhI+{atg!2vld1){B>7#nlED*K(Z8)Hz|}xL(%+QFWi-H+o#_%$w^&QxUf zp{=$TW6%(_WFnlacu?7ZNT%hl;6MF6afXt2leNc?Vi)XN-JhXH1k<$yMHrNy;bu9 zKNa+%ouo~@{2UmWQxq3Zy){K;Eewz5hIk7>Vz|3`gdR$TwxDs{!DT>UA&>N4efK4d zCr(qvxbc#1<(gGx>h$A3Hvo88=cf>Vwd=W`LUOqaq5N(UmZ9*^@}-LOT>sxyR+k%o zS~2I}?#jK~j8UNW|LXFe2HLAOuwJJ&N%mbf?`x9G#!zCh3Q*rSecTxxff?OFZ(7pF zU7vD+?#)B)QTw|_byD+Morq62nx9UR0r-!NPH5o0|I#0X=BAkg({9B|6qPpGvQ!+@ zT}gOkv)&{;RWBUU`|Vtw8uY7+deBtU*Ivck*YGHoLE#Ar20c=MVgN;vDCjZsGutDO z3cat5xnD@3A5H0&V{-mftJANbXNb~skr-%GLx^vq5t*{576ao2wKK^B1-~=Y6f&nC z4Lsigx*>8e;^E5~OcjFlPvUyLf7e+u4>k6+@4V=JvRcP51rMP0djIZSF5oe+W;lBE zOhq-WIse)3|3=Y?WB+ROG<_5h{TfI?D zWT|%MsPNio`uWDF3T^0DKbHk^3f(ehy)l;1r};~AyvBdri3Q^H2X+OG*x5&Wc~0L$ zfLtFx_T6wx{4Z9ZWjIK&v%noDgn;ML!HV>W2v3%QOr`>%0?IU;$*M3RbL2`wv)QMS z{|*KV^`BRVOkRC7nR~?8JusQU^33fR6hH-UuuSD`O#Zq4Fjyb>SV1pU!`d;a#t=Im z^a<)xs{H_aIQ zncjX)4#D%e2NAxYuh2gAr%9l7p$W0_^3MV){Dp+gqG90d_3+t^@)d=*i_yZ24_d~2 zFVF2}cB?Dty;sz8n3;0f7?)WWfp5GjPn>Q<<{RB{W1!atc($qc6G8YT1=%{t6bQ${ zEFD&tf0CC7be!&974-xrr?RRWY$&uU)ZIRml;ZKj8vOpou*H2Yt-^3BYBAG z`O!pK>v~tt2(Q=7FTsMc)~ z2vkKB$OA@Y0G2k}vdR!k+mT|*eEy^Phv8j{10&7rOjp83uDH)2<<`vvcfFKmtdG{u z3}^q&zA>ThTDL(4vfk(;==K*E8RmAaz3FnQi%e`A@5;xBE0PonPL^#BQMHK_kLj__rbnv=5){#)sxUq=Y|aQ+<1Gy1ibp9oM#PsniL= zf_fEqNLRXcX5n{-*2XCi>QU9@M|%-0%-d|t<*l2((-5=uwtVmXQW3b>=9e-yX0h-$ zCUiy_I_OLpQFZa)PvyZ`#MeM9gADzkJ^TG-RfNYJ7djK%D#Y+vtiSKdCzef+0{(+c z--l;xheJdC$rW3Y%s>a!eQ{;PboN^o6hQXn;XlTC764dMakJuWUE?`|$qG@bi2kD4 zvKb(^px^dl*Spv5H?dT;G@|9pr#aB)ySon8h+SU#)0g=GAaWO&a%HYe>tdb zJ8-)9!~Px!sB+|Z|0~qzNaF9C$j@MXJ8%Hy+1OhM2jJM;`ZY)PE95({z{?NuR}TrT zt*CPq2<0WL;ZP=fTka*m2MgB1+jNA1b93gK4ZF#HFlq4Tvo9Y;hG=@{@r>t0(4$0vBzxvs z*0&Fr)|lpVBPjq4+L;dxLOuGZru?h71+r51VmG4Bk^=Q+LNo`n){TQ4s*M_LJ17P6 zP8cU^jS#DAw$(<~0-Ex6BjStCEfh_%1BTOHSv*k0M(tXRNpbMqJS^AQ8Zj-sknO3X zHaa@fNmy7dpY0Q>+z0h1}_?)iC}gPbE9(2 zfsVK9pTBvUa6ax7!{@ z1~%A~YI^mwBrL;9q*}gBw@~NZKhZkB)G#ae3x;jqA1J3^Pk)9$p)atgFXiATP`4G; z86b@_kEe%nh!4!u*COC@U8q{rlF_h9-76!x27Xs-aS{t}s0K7yk2jUhI+t1teUOn9 zGg&>Cxud96=-6q(VM;}f!ssT=b9#r5GqU>6g4gd$=-75Zm`$;hN@=ojwmY-+^ppLE zXK^)G=XAf9Sw3rO>LmrQXo-1JbrEM<{_X);Q;mVSS8AjZSOE`xs zFm;OYq}piM7>B4WYFsvO>KbpMn*F5N{kC1kLi5RaaS)F<3S4Mw-7%H~3$(?gIA;2{ zq6$=_^WcF+Ef#6E#W7bn6#f^u;>+@^g3Y=K1z+9$9b@oLQ-Q*ws<#IES=m_&zX^T<-i`UI+}E!d}GZ< zU7O#w#D&$2-);9x-!eamZ)kaPYgYT5t=RCt6N%M&K)YZpEJ@J3aZ7c@wKfexz-cID z$V|q?sA!$?6NNOS;$ug240P2Boc;k|(LwRhK(D~H_q<*;vSxJ_*=NL0GTcX426n#G zT_?3*i&6$ridLIzUgqc*@nGXLb}kLy`BI`@5)EjWOGS5D<<5NJ?EZXUGM#y$yS&g! zl#ch$jE})W^7_O&E~VT_5il!5{$}@-Q=d$c{gumfj~mvA9-u{$`I&b|=98oYuu5Ds z3{;^9lo7?|&%XWQqoU-w+G5rhhitghfyK3Ea~&hT{`qm6ejM*5rHHuRLw*j9=h$vnMZ?5 zr>W?N7*F#jzVGfx1L6psK0;q*7=}uSd~16?!smrD6(-}-Djn0?ybOiBs8FRyoeUJ* zaaeSKM&!9Z@1gZGW$yF)m};;uqy9BD&YGE|0y(1>v<@S_&263wu@KgJ?7-6gJXpSX zm`hx2Ova$0z?~7!oVg=J1jv~6=X?LgVnMA=)#=U}K$fKdr2uzdaP+E4r@<&9pxVYD zTL;P>*YQm5{O`APS3F5@{Y?88#*gRJV_XAuEIkw=A$ar9MN;w+YRc-f6=HbG08DJ{uO3&GYMB{cb;V3 zi211h(~^y1(**MW+^cWd9oqRis~#pEo)wM1$F%sAY&xNrfwo zm;?_4nWc5W(8Nz3H4H_K=2C44B2zmn4$#bwDYTk5Q$DtS0l5)J13SM?(Yi8PzKwk3 zR^_`AB0FvqTL12?U^RE#PyyCupNRruvOuv6GlTyUC>#F~pRK=chqhuctm&i???VjR zwO|G{sw+z@Rpp)-%|tGtn8SO;SpE@-J(iz5hbd@a84PeL*jW#jr1RlkvlJ?}b zU>X2YS`Y;wvY+2Qsh4M#Q&;M9<@o6{o(NpV^$mGhC*aJXO_8U%g0<~s#^v+Y2#!@i zT1X3Mz`x*|ddnY{nC2}*162FlnSO5VMr|gO;IG*Ur&l$0_@4dxVMST}&qe3_Nf0BP z>hW!ajKB?7Gni3{e8|Tzg^5_sN?c&Uke;rX4l&I`Ybxwno$><#97NN4 zM_?n4!KlVF-IuGMJ7;oO?h1`$wtAJ@d!k5xRI$OZf#R&60Q6d5;r-LS*6!GZ!T*+M z)cJWUw=|btCHw$u@lsjA<)w>M>RZYRuDNP6+w$ zg$+W^cg|EA1NG;W{9ba5INucSz`Xu2KmMt)HiO-LVbJ_9t;}n1uMzefF+T9s69u#C zSP?2P1$YJ!J;O2d5sraKml^uT5Oa$=m$d!Mr( zr6OvX#D1W8mF?RLAc0X6lI7UKGe<92#cMI=ScY=FqtQF5~0BVCw1#9qc~cs;1^NCm1tWGRhI={Ox2j}t9aFuE7Vah0*89h zpHR^bb1*rGNM3jW+VFqU+6)$y1wY~JrZW$P z9QDSOa;a0wo;eJe#p$W9N?ZhStK}%D;X!h7V6r7;=$k@&4E(bK|0TQfR3XKY1n%P< z=5Mb$t)iZ0r!_tgy`+|@*x#=|lRy;2k{qzr=e+A=FMN_|BQQS{iLs~$G!o3;NX|%* z{N|zRSdySCZ5hMoZJEXIi*eOq^`;0&***}b7KRdpRMt6^EQlKbX*Vv+bpnC2oUuHi zApf&vPcSOKgfZH$9g>0MM}P18 zno9h)vPAj*5)stdtIpeS}BqaD!rnrG11<0ui*0vrp#e#vm zqX0k>_Zi{eDr(Z2X}u~SzMNEu=xR;q zf{AamA?IP1V5qVaW0l1`(Y`$Mymh@)4@FSJKri4SE|T5}xOzTG)-Va7~N1E9g(!QrdJ zNhf%uK5*G1aZ?RqXT${Qq?>gb=?*}oD^UUfxu`>Aw*{(EIha_;=W&F^QUd#4-FYL5 zpT>EAzDDpMS15|r70sw5I9Ydq=EoA95miz~tjH+V`|}{anaS2Q-S0G_E4P+{0y$bx zA;dpPw580nr}m^74vwB`+biMQ6OfIyEKX%gqDwpqE;s3WNJ_}>o_{zYF#Y{HV8i5D zxa0KcWvj_(tAgC5b0t~ub^wXX0?0|5Zm}+9Pt~v=ZWN#qwtaPw=~vdyM$K;%7X<;B zGrUYsp0FiI1jD%zmF0IPX%0v^qnSIVLhu?5tn(nkOpQ5?^?gr8S|-Q~mt;$Su}Yo9 za!NDA0g!Q`-nI`ZwQ4hpJ-ZUmzfV6X%JX6zWZdO=> zSS9H^8*0?vn6bHE0%G2>nf9|X^0*?n3W8FAo1;KM+}!)}t})}1JxP)bZq8Xyd zm%{dX&;O+*zjK&}dg(FD3W+c>Y2&&_LsXhcQ)poSp^$z%_yWP>BXqrL|b8 z*L+9T*gn!h#>pk_vf*qCye1jUCV|CM48?2xgjeJ%qfS3s9-PTmF_%?a;8^#f7d>oA zRYnf2egNc=^kbrf{0r;)GKXV#c5NNPg-@o%)<$Z0us=&qyT3}YDzXga82jIli4(J_ z02Lu?)kDH>WI9@A>07lrCg}jIXQw4n%~b(lO9cKZ6pU;HUUdb=ZxDHGfjm^Zb3p*a zxY69$6_q+pkeR=-c^ia`URFVO6r5=|TM1$)1Rjg~fB)32{z~@B5sk4LN+67`{YsW2 zFV@D{%ieMOQBIDW*D+2ad)`@mBu*e3$ZwQk)N!>hVkIJ!dP1%%{Kh}zLUk5xaLDdG zlEQ*-N_8@ayYQ`MKYly(Im2bhXbIpT8#JaKJmYfL$?ndNjC-w1>bnazH9+&?0W}nX zBt_6P81lkBaG?`4WWhRTeS)rp3@(%0R+j&ZZRd5$7v==^?09sD7W3&+X9Njb!ZZSc zb|uJC?B!?4k&{rJ0ElxV`AMkl?+5mT?`v~?s$NuikyWy1v6!nx!MThfImBjA9t&vO zmyRB>Zu07jXkGt-e^AM9^igQG&2aXS1+eXG-7gjnzec*)On`h#B8V%pfQUDOGr;{W zZ(1gLo$NLS2>tJEApH1Aqvs!XNnDI_X0BvYO8P|v*$E4ER%P&){l6jhNoe&M9cZ=( z=8Pjwt3ocylK9ezDCisjK$1BkJVFbp0g@)?>7o`qB~IYYS@O$LQJ@I+cSvo5Kz$C; zczOJ7RhBS?POx)Na+9rc=pj2G?yH+h+l(2C;RzScbYE<={Yrbwps8}~E+L|dgbUmF zj(JyP8p+N0wURs0xDoPk60a+;L&rxYmH)?+*_R8qmj_&D3EL_Bz5*kB6vBy zmcVf{i8CVU^%TRik}CJO^CnW)!D z6AKrqf8DiY!H@rY6x#h^WctGik5%?@;6|q6op8Vz&&T=!#aIYfi=X`Z$&UA#e>4ha z6cL1;NbYXJudKlP~^qwz5>U#2-U^jrJw3z zmW@DO=!NynRzaXm!Zy!f&=T`-y4J z_YB>EI>#kXC_|mGNnScoufetAUh1;p*4;HPoh81$t*|Byk}S={GKugM*dQ+p(!oPs zMI<2`wH}zH@_94aYEAvN9D0UPndi2-ElyHf&DIEx`uaXx2f;0qdB6wQxkoJC?hf5` zj+k`cVZeP^;8@+$s+O1}+-f7c(<0)%qrVn@jG?C7O8s_=3cIZXQ_zm=_x`#RA21-z z^D%K(B91USP0lH8@Qj0=d#Exf_>)atd1P)F%iR$xuc+{B{I2(rIygmG{t{LwVxfQ# zG6hI;9TA+9lD@l#o4ng!@=oHL5SmkrQhfwRKWV=W%9#y~@^3MUHBP<#%}+?18>PCV zp6vMk%1&!U1nd=}-}w1897&>`>>d0`s_I9)8B8_>7MBByr=-X}jE;><)U&FsezB1|T(Dl8Y+opZkE9E5t$vYi1ErQ&3U2bEsP-EU?)>_c&(m&#)<-AZszH z1Uez)&wSS-2bVcCNPIACFIsBTQXO5t=8Rl~X#a61s$s!z?;bomIHCW07>i)Gdwtxe zbOV>Y)Fv$u{bk~Oi35O?B};rI<1DUYR?faFM=Cu1U&Nc55|;z>Oi8)vO4gu)m{6yV z=`6H4v858i;|K3O&{ z>l;EynF!Q5+j1xt{opiIUa94=8HBRS36}H zC*f;7b=ALQ5O1eb=VXJUpb&_VurzDa#DzYtj_MT?vtvV=2xQGps&Z3 zRwsmW**!S_soMM7Id|Jgo! zt^Or&_si>v3qM-##$8E^W9epLpn~iWe{O#GGGhKG;osRU{`iS1m{&?l^dyjz@@E>B z3IIWgy3vs5OoGV_Z2SnCFJ6FEm<18^r;$A3!M?upq=1%WS# zJ=Z^8jc{;#vC`<(zog*@30ZC~v%b+hJiU`IkzKyXD0vkl&g77x@fa&%_nEJN`0tpy z>>|@c2XXMFJH6%%-k*2&z`b`OdELrdb@917h+4&xfdp4Zn-glWKY#23KA=!nv*a3U zfEhjr6K#eLUM662BpczmW^%HcTyxhus!2k6KV0L>BKj93*o!rw6`I62?}5o^@tlu5o2vak16cb!`^5f)bj;XK0SHOtWbN_b=kg!ev58@ zRoCK`jh0xPXx(MZ9!0j|ppNcjko3DiSf)5ZEZM){$(Tfd#jvx7M2?+!ip1uV*WP$2 z1EhUGYhg^(aK@t6U+2T51jO(kV_i-aIk}-kbe=jRpriV0H-6V7Z8qO!rQuCM-{5yP zgOlR_-uLXR@32XRK^_wwu21W$3GVM(0nHk4Upx~xR| zQGn=`f}81FcOT{3r#p0SxJ=h_826>t>yhQRoa;+Nqg}0VjSvnilW*tpsp5+TMrlvK z)o-UOolHOCGyEgJ<2Pm$81^_{>h{|G*#u`=C%8loE-HDJWBg#<-3C|iWAD_lXM5!P zkJr8p{crT&FNvoM5#~|o!SMd94={zW4yZme+=RrOal)A$wg*Vq)Py{GUTM{`r}65p zj+kuvIG?`vWup*~Ei%C6IEPr1q;E_3?e zTnxj-^97T6kvN*Gf1!Yv+x?3mTFc_7cEty^5VSp0{<@!`&{Ovy-8+T5#MTJIgTVct znr{^CKfKv`^=Tf4&5@o5MD-6((>~68`1$VM#ML;t?nL(jQo(xA`LX(abLIH)Z=Ly9 zY*_4d`AhC?;MLlX(5!(dFMJJvTdK>735l+NZld^>JLXgp3BnmS&H6`^P{A2#fUN9O zeY%uF$T*k=%+^L&=HP`s(H{=c&T;qk8j^JSy?=A|J zh?GWkdk=PNuu@IyF(JHgYoxNEIp}_LJ|;ahZ;a^>o3Vne zMb=}%{0$Z}8a9x~nmwr2+ya~O2tz6UwvBG%RF-{?B=T+C)rUtPQK^{ea_#sXovEh$ zQbj3PrViE_u$KA{D+SBIVewZ`FWXJ3m2=N=%TOg0fo-yd;jS1-0wY_DXF3T&ldS#q z-~?qI4K;+6cW1G)FoBWI$XD=O7iYni%@kGe)Kac@qOdGBYUQ!>wBnC3DQV3dJiD$b z7wZN!i$ZJ_&anWqRpQnwHXkvx7w>CMZ&@dCFqPV=nd?+`Fy%FVY-*W*DOhArF+!!v zy_*Sre)`HO^*y~J>*xTuukMV#`#y#;nl6z~d0bR+rHvOb;xmaT>S^T5GvL}|ytYJw zB6vZpN{ZJaPz$?=kbEG5CJ>FwR^d2AmfT5EdJ<^(uqV>WH&2A)()Bjc=2*{~$Z?PO zi+4^j+fHUPQU1TgKDs>854bPq;$UZIELy|D>rk@QPjD>RkEH@x+_8|z93uBRbAS21 z^-T$S0hJp^R$lr!be5F~KK(DBUzwLCX`7Pz_I376>{9L1rYz#9wBy>Ybp4a1QpINh z_ag`MbR_2pst+xUBVv~>W5uuNPR2skto-!2TgCaOkJA4eu#!b^=IO8WKt%UDi+0HXugPhC(CA1NZ56AWEG;pnWa*E-f6{XuWV-c+Q!Bg%5 z&4+kaYt~K0pk;DaP#q>6izVp>Ox5SzZ9@K4zW@(DYDj_5!R$RfrOsgt9{JnL)QIHe z#D0%ez)!!Il)(6rg-UyVV?20lYJ3v@)*bchwa?&vYKm~jt<#774quenlf*aKdYRU# zAUpoNf62Um-oq{-)Y$;W#i}MK(Dj?0S*w{oQ3^I4ne_mc20~DB*>#cAY(=fJmio>e zRV{|>YtKdtl{W?q=_{S)a-l~MPHTxVFZrg_l<#a|#kF2KxF$&hER;WZn8~z}C@KDK zOi;0AXJf>-y9-)>PRmNP0tba^I@~oYL}#yPuDQ;%GkNLBm&oZBo6X#~*m3K0O92n5 z_;{uIb~XFoR;>5suKLzkrA*zyOYt8099@5h+XP=Y_w>d!SgWguv?3mU5 zO;7u$2HV4@l!J!NQOtk&ve(=0-p>!qV2Gm)vaf|S5`;EjS8$-O^)ci#q?8C4js(K< zfzlL^yeo*8j^}Y5=0aiwcF{^WV;wX*1!6U6IrSZDyr)}`9YxaoVIS}I$EKQC+%3JY5)#81`yLKqgmRb1w* zy=M7#+~;iT-Os-a|L#;rLc9f6wsadwu#3hTyGF7}AeCT}U@AfE15G~PL_42kJDB_~ zX`_4Kem?rDZj!N7;d6B~NWs-1-k`vqF6fZvFpkSSXeG)z7R3yE%UP4g5VkRc4?Y0w zUzPyzjHb3Gw)=Ia>7eFlZ_Z;uc%xM9}M8g&tAdGt$D5^c&Af zdif;1BY}0(LJ2G9=E3^|@PKeyGXIUyamvP{0^;3Ru7fo3_pw&viOVgul_N%Y z1rz`cu0jlwG*6TJTHo2uPDI32y@hfFt#M**vXW=b>g#KryszQ@Oc>D09I`JPV)-Rw z!CFh;(O+*WpS*o<>HN+XrFXbixi!J+RRf6tYXbReJE-bfHvVoh;qF`jY^m;PNJW6P57uzWcL5V)Qj6H76)}p~ zMWpo+rmlnBdl}7(ml#e4CRn{HV-}^~$`xy$dPFLwL;`|vfakxxN&}-_^x=$q2g?3K z%s{`*4_H3TTA4^r&(%mH=nIr=hwa7;nvhs>mdA~+z=n-bJQ%oqK@3#dH+ zGzB;5Vbj39hiAhJ6hkM3_GF5a3D#{GM%0c!b?wB|_ln@kW7J->XO%JJy?QzGhT(Wj zAE(`Ea;j3PWVi4-bXszKA|)?had?#Vt&d)GTH4~4Fw>@eANZ!8sSesmKVT=KT9C5+ zAuEF85}RO}4T(Poz{W!1cg?(vCQg)#9JGQOHBud8mlOU8`t?0%5&5A1%UrqKD4$p- z(1Z4<7;l;RXk{c+6x~!r+-G#9S(onH_*HO6EItl4%R$!~2N1<^#{44{0z;yK@xIq5 zJl@eJUZ3q`isb49zIin(&PbRuO zM=g;vldVz_-_~r0C)87cyv2Bgfg-$dcpO>uJm0UC%yj3^``M0%Ez`}!9xiwIaO!M@%;QHgdR$!IH!f<8~GN&S{kJ6C#1;cE!{w=+L7zm^D^{%NIxiG z^KY}Xt(Et>X~U50VFUI*jJuVe6_Bn3ge?H9iss4ZL{>CQ+lS>SK_@~LZ~k>}w{tO{ z-ZmHv^7A7L6z{UFkR^bhrg;@+{5+TsgSf)Z8!p@=d?(`_3>dgaN&^2d3TKvuFyP^? zpzfQstCS^v&TF+y>$W93&YV)c_MfX38rZKXX^pLG#VP6OjTZt^9A>Ily?6c*rq+~^ zdIsR-a+8OLHp47TAEQJfITT~mKB9kT{qLj%zB^T7RkdWSlvn8bYGXj2Or6eo{4iIo zBrnTJ6p%NWzD&&F5zB=Zy0r!9jWe?-6k~>q$@4SmazUGfJ#UO(z}tNzJUC#&SCbZ9 z+yEG8%Lu(1Bo+Socf~@oW#rAO!D=b37W+(R%hcp8asi~~@y^d>g`^KYMf9zt-qHT_ zVlyQuvKJ_M0-6L)XEuob8B==u<(zl;^Jg$)k|dHK$l@Z`rJ`WMw!8Q8`J&15>4Ri{(S_vd%Np}D;SZ+Zu$p90)Z0+gQnT*M)XpM}#`NA_{J z07spCqM#yFNMl6)khQsfeR(4IXF}xgiX$5x&7+Ecl|TFq$Flq9z5{B__u@G3Bh>Rn z@BBM;`fkv~(qVqUcyvogz~iWn=(ZX8Pl4h_To=vYa9(a_>dQ@Z5V{sEiRURM>bVy7 zYkocj9IS8QNLt@;f}dY^opUO9Syq0lqAZL$MMVEA@ER1nrk{|;c6&-U$5{J>z)S_2 z^OLY>yVaWSGw_XnU~R8@ z_kNAw7Cqpl6iBWOxK;~s-9!Yg3cAj6{H95j1J?*q( z{)@d{6IDM_(uhmoHc0%@J45|G0$$e>e7)@$g7jo;gGgl0hGREBRFo>dxf!)_gJTIe zZVBR_2e1_n<9<|Qua4@+JJ}y@_@A%)gE^^#4$6n2_ck`=EV=<6r#Ajt$d`xh^T!}- z!W}Wk;H$W7lj{un5WL)o4vOFM$xXLpOY+@sI1l##UH-^?*??aAnuU0b zE3W?6hZ<|N+EZ$bbxw!^7Afc!ylgC3u)s(c=bV`bPC%#8<03r-i=Q=(dR+o4yF7;> zhxu(;Ex69LkU4n%untANo6jFV-8M3k82Fip`hKr`H{j!PajPQZxMF);1Vna;+ZxEU z$_GiIJ++(gr+m3Dn)-x@NwS=+SU2p1>T7WNdR@H{8y8D0m|#a(y|O+&ijH#c)`RfRiRz z;+_hO9q{K5b8rKZ^9QP;`?*HCC;`9w(UQ&p`+^tRg5cU-uiZniJ z49ge*R2&a^xR2!tR`1rmhZ$oiBkIzdB20d`yu>+w`IV|4N2>Ivym)8-TF3?b(70S(J_z z$ieRrhWSjw@{5A7(%oW$eu9#{yfXSpjcfd6 z!;^wn>mC&azds8%mTT#GMa5)$v0TTaGRIxBuWD4!3Tvw#f=VrO9g+M?7~#05uz7&c zd|#fav4&^BjkMwC8S-r07~Vt-)DhqEy-_gVVEQN0mQJ7U{8K3UX>p&4(~QPvaIQbM zlNgw5ZdZ#k)XQkQQYqKrS7n#n5Z3<(@d?=WX8;WPJ+-vdAe^6;)$z?KzXi5Ch@Lva~j zDP?uU;XUW+~pda%|evD{VNd~S#N zwhD!X%gji1H^$yfdEIMP|Dy0jZ1 z6ujT;E!ITs5hD`>4Y5dQ1N{7o>*+6FlV$<=Bm4L-%rIZiubQr2}Hia zKV<@hA~z5o1E!)SB>7C*H7WPCWKq^2#2{o%6rD9km38-zXI}Yj*6b;Va@QeWRydyM z4kI6>(6L$lt)Vn!*(o@EIZq#54%5a#R8vi}UYJ=;E4ov+3s!`;w0)jY{vqSn^&u-p zkTDownV6kTr}|zbX8OG%$J$t$6lgVM-dt%M3==<@znr2oG)8mVzKM*HUUJvja;4y9qt`E*B+a4c27U~H$ zdum5#jR%FRFSGh})2d|Mt*PQfa%hbyTN_T^D95htul3wjKvv_(flP3x+eBVrwS*U(rcn-GY2Q~%A70v5jF}s9$JgF6BA(6@z zEV5guajN+y8M?O|@CC`zAIR{}JkNnm_PQYb1o3JfzaF_SmSS^B>5VGQl zH)tieuEjQYP*qk6z`o!U>oDt#!beYG|I*)!kvh(auH|VgYhAE(wJwIY!cT?k&p%`B zout-2SBcw{Or$vF2{QM=bo!5Ut%KFMTJ3g3Teq0fk~-S_5-4@qIJ2?y(%>xb`k}C#zQ+h@k9t;{vDDS0L1vV3;kS?By!eA96;MNBws#; zVlSCy)w0w@XFtGoM4I)Y|nDw4BFfT#bT-7w~ z15J`7r6mAaMAbX|#t1C~Lv8$$nNdeRZF%HF0XYa)u2!z>(+D?~civ7aML@yt3(580jznk^DFauS%* zyt;5O5Wq;%2aqUW)GTQ}PcPe&FH+8-|3V0|b!)h?L0<0C%=((Na>1-WfmIqL?*xaS z`c83({ijb)dLNLk7raW$umfu+K-4MUP^DoSlujjH{Kv#(fUw8o`DZLtgbpM?8KMAQ z@mSeXs#zD>4x86huao^@t*KUH6^={%N+!Iy)s(d%2ESAIKS|bh-59tC58F(EK9!yt zx>h}$0+JU)xq-M1$ft}2C!;)#^0vXShxJYkX;y`P^E?Sbb~UbT`|ZP*rIPv0f?TWn zAXfMW5c@LE;`j9fNwonIM?xfB6Cny?@5uEuwKj~NX(q=*l$<}`LjP1Jn@j}{gbr|% z!E_e~G`Lu1F)!8qe$d=;YpwY3o71b{mNTchY1rhl>fp<^{e&ed4uk)jY|$ZE*0xx| z{>g*nbigi-uZ><(WgOUE*OlsK=9)hbp?lg`AhbrxYo>)W^LuK&)R#MM&T)9**l9L>oxA zm85#K=?3u9(u+cAu$Ue2yb-?V1a12Ma> zIHntbJ>P@4(UpC6*NmjSS=P@pUqjC<<5>Er^mJxW z9sS8F$o08q8`wLOp*oF;(G^LgUp1DkP!(F{w{G~E9jNw0s)8Vp&`*qG&*Nmx(eP;? zD(lUAbamSPF-=K7JTQn~?y88;kZX{OLx zc|-H+k+3QODDV^m=KTzPALX$qF5Xd)Q}6L0O4769r?#z?l<*rAuSXvb)l1z=4%O#j z;dBE_jb=Jr2%*dW!SGeW9*^mH$bWOs}x_wR93!``c5%6?>oNCpEi&IVk*z- zeYbByt650s`_PVw4{sHb;sy|=+*5c5HFZODR{DPo>b|zd$1wh$CIH92qHQX z?zC_+7Pv!>9d5FUtk0BOG0#Owadt)c#a{Ui**Kq&0p2TPp0L2Z=$*aCO8V1*ahF<+ zqQ^i1x5RL9;R?oDN&{C{EQN{(Ns7Oa!~igC5(mSnQ7;mXd_9ua(`nw0Q#fV#3!!Bd46M!SI&36P5WB zli-86RZfpzo)WK0s3a-1%mCClih!tx+G>MgS~JRogt-i-sqRzO;&JFZSWVj)>nl4} zJs|85qj#Ke*V}tchXAw1Lylua#n7rD?NtT$VV&xd*q;8fq;xTg~$T|_nU+c8)UA@1-8W_WZ z?kB(H0FzmxW0D+4>8B~8$<<$!s!vB^MnryYmd@SRr)nQ#n^$IQOJEu4r=~6W#d`)5 zF|6wYkjP3t$ zLuY4#6T}JPjHE+O5l}V>eb?0{3u_Gxqu4fXGE>^Y&^n(=5RPIFN2Rk7npDoh2%-4afH*b(8!Fj7cV~W6QX1%c8#v60LWyx8xuctfy6t0cLk)kr zxrUH|t>If`lbk5ir(|@|8;-ubu6S5!0!va1O9#J%uZstK=qBn7qb{`$EtNo)kwE)C z)2;-vbn92uob4`}rjgn%7bhf8O2dZ*lB0!_PibvHXXnu+STFvB0fe3%=SIt93&(r% zqv&GPiWjL^;RV;ZN^UzX!E8xAJr9G^ zD#cdDM;b$>o79r*)lthK*}AcU?feaBvihcMhSrOHI@syI6HSxX87KC zMfe*f1&je8U3?h%sh2V?Cg~d-H$BY$2n`NZ=E|$xJs{JpiHfuMsBtR|AsC$tZhdqf#*_s2pwG353TdUEPELjkK`9E(!)F?z1wMFhvIv;aeZKgqTWsT*48UNcSarS5Q>vi>v>*Q)2xO#d}YU*^S< zQG87P1z*-KYn7TP_Nf}b?nAL!)A7yns#M{B$tt31&`%)O+xv&2Sz5{68`_x%mcb8` zQj(P=Jt?yrFPI%=`b4-6F4*2GlQm(eRdZ}LKHDl1O>TWi+_02QzHqFm@Nk>3+#be@ zU^dYPPmnT~x@-!ii%~pawm4osZnK#5asHJB_(I9fd7P&w;9#R}6*enu5W^TN)H!Cy z(qXFk9~R2o&zQ7r)sUccFMG|=wXi#0dzgp02|ZS7qO%)JjQ}< zWRxFfa)hBAF}r}MPaL%X8s8u18B%tm%J0h?B^l{i(o|l!#D;r(xZ&+ktCsR`Ex#w{ z=3wr47$c*e7XN7gw%)}-;)Z*aorv;?q?^$j?EtRcj>J*U8ah3vhCU(fyxY$F2@f~X zcdm$bu6H1(C!%CUUEca)z{)-3m%9D_XLA%-WthtA4m~Iil!bHq;y+30E?Q8(WLBoC zeyRS$NCGLv=uqjB^g>*CQp$YpNkh8~NKP~^k*v{EQ)5cAd3qKdO)-g;s;Qu8PNlp@ z(XIg|hPLp%Oe!3=V_yD@I7I6aO-(|skOKhjK&*>MCk#=cOEv!|&~Hbt!IeVIU-JvX zfWv$v%iL7Xjsh8gyDXabF!P0?jy6p>hX{8UT9;Gq)k_6ECl`fDg!WWj^uk8#_8{LD z6h9LsWuv9kz)=%Fte+-B;y;A8=4o~@bl>)M`mkO5ps+w$00KVj`?keE5g@mex4nA( zc%{*`WP#&|K#~DuDxZL3?#7%{&cGNm+$10nI7G1{KWtJb`Pu|NSphN$j(ybS zJP7zREoXpGr^x7dM$-ahbo1LsM*s=&Y%OqcWhS@g-AO%#cE{(ldI3W_e8nObm*-WR zoB@A4T)1mp%*4H8&()QT4C493f_2lJ7p~~JMs*?~1Of+#Du7!V?u{W!*=D-ykc_yV z2~;a2*VmyhljJC&u*SoxcEfJ_gFdqdk*8qo8d_i-mRzBLOw>a?^R&!o7n#rP{lk_> z1Va#FOxb(XiP^2@*Sgl2su&Hh_t8e^(v^CK(9~4q-~d!xt>v#~IU}34MA2mC;%Z!!^?S5+S=|3iH~6w~QI@F%7b3P}zYv zANly8Y;t-gkq-(HB*bDiY7#wV#8SwT1;hJOAr{G}cCSlH=Upy}$64RV>uNZ?7NcY7 z`%v_vlsi@?+-fw>is^o3Vp^rSg#9Vg5FUP&4;=Srn#O8%b3g`5@;NLt`=-hh(yJJw zQDy`MNI$#z4f_rq>UN9)u{>Vy5$rcgeKu5J&-(L?->-HHT!L5uhF8$8J~!L2QgVOJ zT=fH6uRv?Nqa*88O@&nrva?g(J;=%t>8zlgZBmm@qy66jli38Kjz~7X%#pVN_r}1j1pP?P}ZS_s>gQLI53z z{3OZX$_sylGSQ`O3jEi&gYGc2D=t3$TBNQ~N)0*fC3TL46Ahd7|kUH|T0s z85g}E5;7mtkks`3sKd~K%$3QH#j!vp6eo7-F`hOY==+>zt+!cr`Fpx3jm-*|o2Wof3!mG2`nBFNyEl0AvFFs1gfxGy{|BCI&%lVv^yYDbLa=z8$QAQqjCOlj2>rhHW3BAus4Un;1d9JcD6(&k! z6R5NO zE*NSE5xxqbp2sr$dDcI-nuo@?^M|A7g5KUcF=nv9$1?)IbOVBK)X3{6iK_uK;knFYSWa zgC(&jI)iRVY4-s@wPa>!86Hk9Srv?8d4sBv^_(5CWXtnBoOiJvRWFiFt+i;jt@lcO zBU8UzZ(HfJMK9{r>bbIM+rt~=)!DgLIJ`E3GD>4z3VgQm#A5Z+@ZivsErjdmR?}Jw zWvijxL?ew9W{D`sua-RxQLUMq(~^?I&j^9;h<6el9$+?#$wc%yG!5!U?+>RUd2^a8 zmHegm!^KDm%l&8=o11huKs$h&ZZ_($TGq#-G0j*vaJ9|ZuD0;GM@0RvcI&miibrx@ z@_xa4zF`{wYMYI2Qk9Le_04)uIn(S@WUf%5k8?oGLLCWna28D>e&p7<_Jt9G%Y)c7 zfY4;5#U#|F?$5aMnn^!OVqNOMLAXLNMNipq;;Y`nKOH~m`?E?y5mO4+#=tq0wh5cO zqccLx>WLp+n2jaW%-s5=%ucAQc7QyoSc=Vaa-JDpCz8hD+#W81+E8z zW_DKXOBRu<&-^T8QD#>}{?sliEtE&O0gN0QZlKk<9)a|_?OF#7aG;{v0{0V>Y8GcT zH2`NZ>REx9?-lvfmDPF*>yZA+5}3MMwK}&t7=<;!02v>;*y-fDxcbqVw=Y|v8;+hq z7lJ=BI*`e&Y+pB7Avmw5OgtOj=C|}%!0Y+T5;%33q_xhK6J)uDD5n)xdMWRGVdvNf z958o(^EjD48wNcV7Uc52-YjbDd--eeXLExjIpv zK!O8EMo+8OKDyLs4{;>0`ibj*r+cW%_M>lt%Ao!Bvx*byo}umQNT})h#}kwO_A);H|9_O;eWCf1Tm)q=66;UcZ@2kM1WS=oAxj0P3a3$@D*i-RYL~_?SOR3^Yu;Kd#Xd@!baNeGd58n^KXesz7KIGhf zl=;((F&>I8k^LThr%E0Q+?}W3zZrZCiUE+U$Y=*83)r4P#&{hSe3DX_@Q~Rn-gZzfE(78(uW_bi@oB2 z2@%BONDDU9+=4S%1kV9J2|$Y1yQ&7&X%VVJR#e(KxF-Z0gPtUkrbu3Wiw&NVvcW0Q z&7WdSt@?sQn6iaho&dT(lZ<8Eg5=QQKUQU?PN7Goj){p;8#t7g_#o+O6Wr`_(|qbw zS3ZI+&1)M#LdNKLLzc*|ChC^CdR#(r%`?OSA_n9QZBvcHnjhw7J$>YX7E0zLdwP<} z*pF8i{}wWCz&@7qzIDzxV-_P8VVDACHc)QO1Zy;HGObuR$?cz$8D4Ub)Si~9ht2Bx zuI`8~cInD@allwjlmX(syt3`L+AKcR^N-eJzV^9rPXDG70OnmTOL_z1feOR86S5se zbA^v#a|6sbkVD1S@L@xC1CeAy7{--J`N=a?%ihJY$e-yV${0~M{w@PPI1O3Zb zP@~eqhB0oEY0kVaIdo_~=wG}f2WD~;bceOo^cLpb3n-)Lv~W<}eEXnd?sdcDyobhf ztyLO-1&o47G@b~X28DsQz(UB8M@i8PQ#$-E!X`;xG107cZcb8z$_w*e{w!_;Wj441 zr-#aR{eJQh*Q3JjB6(caCK*m4`9`Mk11F6$KZw5N6Yqy8$(&T13PFaVMFWk_rj*1w z-`^e61`9^49gg&^fj-FFArm-tJHf?PZ-wl0?hny-*l5ZqS^lNz+>VZSBHUaBW!{@P z#j59pRMEfN`|RzSbe?kbA+9mWJlyEl0>hMleXSld06@{p1n8Uknp!5cN95Fl>-YO* z{Pj>A=Dk@Uk4TbK(_Z5Rg?@nE)r-qHa~ay6r5|sTzHe3$NEkTo zxuQxzbT5v{50#=b7mX!ln-!mg_&!~FDlyI3iwFn|aW6TIxwlgKj8Xv1PXJ^^6b{qf z2`H5KCt@7Ua(G+s-d?N9esot&PxWV_R@$U=|1<{1=f&dqa zZuK+YJ*FV{FL98*nu>vt#(2XJ(q0EWnvUO}-TH4ZfFgb|bOP(V94z)^Xwkll&2r@P z;S?qh3rBBp)ff|FNZ`$-?_!?sXOhs+5uMR!#c@s@)_oJYE0<&}GVt1NpTQIDWQDto zaK@Xx=2b0mdVU?`^SASPp-QwN32v7gr(g!v#*qSf48n{b+Es?o!u@P71L%Su(k48^ z#|J9Yd(aG7a&wUz4nJfGW^8PNH=ZKOuo3JXt_PJt*e+Ct0jz`Xxo8(<3`2BW-g7y5 z8aaM1jwpwFa4aYefw@s{ZNrhd#H0i~(;bV^?}~X?K^BhYzEhHkrC4NfKb#xvn!#vmRh9A|N!*lUR6($} z6BcTU0dnuii;l&?GLjh0linmGZCSu?^P;6bCt)3+O^k>(3o^qWm<7sbsC}GzS8_it z`F&N$C;>N$&KQ*UcsVKuZ9zifHF7gGrsSW*Ng&sGyg6_Dc0Q9~zJxL^g;vbK<q z4NRQA_>%lYDd08QPZcvx(a9MZkNCYii7+p5Z^3QNX(yyut9SmGw*=QMB#W5(HqX;B zE^9+JnlB{H*8*@<6&)BXn2#g<0f`w9H+d_cV5gZtlka;QOg2f(e$JGyQthk0tA-uY zMv{`;=tEMV z1&JdD*;wEk5RxaS9Z4>q(wFah&7Y4W%^%Gmdrz9NfK7QHm`^tZZ*M|Xp!wW}5b+lX z(x3U|;st@FIc28^FMMpyK00s!k$(pHLSI<=R-rtx@T+g(PDr$;Yxq42h~8;okn6(% zJhB8(G*_A4kr)_cS=4ioJ$YK>n?Z&vK>P`|87|1E!!a<;-FnQP7cXfiQdlKooL_p0 zBNwY*PAxG>f?sXCrQEkH+&d`wr3t8E!qsP07OQY`lsw@DiSNmq`1ELS9Pw~SWaq*uGLw>m^=9HdQ*o?@^} z8G*l}B>y;*QcBdU6G!;%l|SfKE^CTyM0*>4fF~2+icQcJ>MX0fPA$+kXu)_0k;GY{ z)IsOXV=iQcTTP`P($*N_h|Weqkljs4)BQJZ6K>O`YtpaOkTOYS{^MoAhluLa=mB)z zrd&i1fln`_m?TJ^>ahI9VpZy4RR-MF5HDhxR9zykT2z>eU4Cvqo;46qQ-E&Rx@&Dl z08!GX$6h@f2Ow4Hp0()|5#&uUr1`$s#;b8MMTB2I_F=zZUKJpUb@#=tvv=-p`Nu>? z=c#NdqqCQSQ_a?4^D}kOKN$I$OYArfp{kConZfB1 z<0agRo(be%3zAIEl##~-Vi=Qa@-oWsx{C=Bn9f+zu>bv(_7HMi9JmswLX})!G+4hf zUcaVOdd%oP_@j9!0LDuMcZ;`BY20dDDC9LBv`GBQzTwaR;N2+wyX;|X>sUr8cKc~Y zu4aKt>cPVTt*RVdsPUS3ZB)hBs? z`1C90$v8jagOzLQQi}EO?qwsX*594N8qHf;U9s+6vKRH`g{0Mj?^E5OxfymNEQk=s z^b?(q$%)>Nj~XRwJ7VcAEe38KUO^0ok*>yxIsbL$q%3z6@eoanQmbwcYfWG0qvp3P zZ-9iJCf@f20PNuBE(;8LWaViy+^z}G2oTP=Wy}YMHx?SS+Cel>WvJW?f|CT9xMi<3 zlDu^$cG{^*dBUdAy`KWt?^qqj65exs)EA2!*mx7Y`AgUN*Dy~lm{ zFON0%AD?tSq>8sS-NIAKH}A5@%5uUg3!TfZ3lTNm4c!L1y+m#O0i;hQQvKeL@ltHj zQp%q=gyW3sv*S@_y;~oddC~IxBzMv`9Ml7xWW9Uzve^tD_U|U!tzz0JpIx683a-?C z7w9PPX#B>M{3_g$a*J&lYmjn<>ZHsxwj3n~<(MvxH}FRCt;Pg)I}=vu9~B?(9% z>%F|^?2L!nu_A^6$T8iIfdwr^9wTmu>_0WN{{-F*QzD3%J|bqSl=aC6UT?Z?`1)_e zS4u=a0V3<&x1~4zLv!LmkXR&HK&tVBGnBjcUx`}mSqk49G%fIt@_Hc3fo1U>>2iYRf z&d^})+GA$C>=wCR`Z~Xkv<8O|`&;;@1|b->P>g|P;yzKr$m4-%YOrlOsV$hHU~F5m z2al}!U!)3fNSxK{ndkoC$tE0r$l8v6Xa0}QU7C{g$DcV%o0&){B-bOdQ-O{mGNd8y zbLLvZ_Yb62r(i?u5=4KL^g{~jR|ZiANmn?Ye2UV+fg@7qKXWa%hEwg3wsR&euGXZT z_PlE5g*akfJEVTj&|lU-lCPb=YQiBt*1sv9TB3Y2=Qa+q@`lK+EkT|!`q?A%BAbZq zO_hIUI=qoYJoGVOvHfJ|k|dhGWF<~N;2m4L7-V&u-gi)GR#a(?NVy~@vX)o>rim!> zTlaRkSgFN=E&D_e`Va#HvO_EG*}jJ6tg_C7J7Zh%5X33)Xli|%tV=a} z^=m@kCO`v7ruq@8zdI+gYyWQ!{@~yfY6}mx7!PhRhie@}mB@qgKhPJW^fGa~{ak5^!ir{g8}k&Vw$-%mF<;g;;H z1>3uB>q`=@XXPi~j>r!*?m)#|x7Mkb{==~~+}nQj?RfgWciQ1s9=2PuVjNiW@1FGI z3pJV}d9m=j?=Ln~K=;4})8DRGNgWBK z*L9Fbr^NU(6u|b7j=6x(;0E~s>1Y5+{JLHea@B(haH9CRIWV35G0m!2TQdXp7Cof; z4TOmJ_|Eq1EaGGFW3qG%%*f!E7#rz*JS2@Eobzlq^6^s8?t47EsnQPYAQK{jXcT{ZXFr~NesDJZ4FD9?k+3M1Z^oJ4*5y<47?$F|mAZLl zmS3Hwq8Op{B3Av_ewB6!?OYO|-mCwOs^i&U>%JH!Hn7S`OYp-rdl`zNna4RWZIX zv}@*{VZFo#cp44YwYlu701AC! zY|O2nvmfaf{X>}5<+Cn99-6EKc}cjadC-Jkx->lM1MdhPAI&r%BmHOHh8!6kwPLHr zgo9aM?l>Mwi^w=^r*B8lOwpAX$?webQ*pZklv!~mbiJ8dB=6oIPp$O%8^_~p^z4kuDrOVS+Kh2T#_nJP|#REnG9$@H-OC5 z@(#Wn&@wMHY0>cfGsg^ifYq%=8EKSb2hUheRAzz++{>yyUC4r@7V- z6#6@t?w?aM+WQ-8jm6(^U&ZrmfPdcntRP8;ZdWd3BYP1v?W;9DV zc*AltegCZ=yYI%vMULf&p}b1;@XwOapoOq6>zA>yi%uMV!IIg12FkHah)yr7s?O}? z9(}nVF90KKny;ilxhg-T8>OfQQk+92-sE|9XI|u(j~|BT&4iprcm_G|T!=DEkG9_L zd6K$G!a9ai&*6Uj{;4H1sL`ecaGxJU!s@bUvr&B2^9qvAZwgjEr@i5rs~QT~Mj*+5 z86;aVmeH>6!?@>%6Er-&JAS=b-4pc%m8;pA{U}|jJD0BIaRElKY3HolE2G$oCMB;$!=EngB)z6PkTzgI<6_Bw(p zD$M#pkBj58?eVmf-$$JTa2m;)ClvV)Fsn{>x!YRN`}M1mH!N znrZ9~882>7Fw`(PAo8INbK53e^J2&BTRVDJDtapRsP3q>(G=$xDEUIde+9?iNkzF; zg{(@Vp%4SBpkD1QS`xbdKy$g;Kmw4}cuWf3kFeiYmr7|)m=>{j%-F_X6DnaRXG9yW zNp7k!&D!^lj_7v^xgIJC2GS9u*`~tGA|54F1k+XAodtw(mm0Z+=!OP5 zIS9`p-iDHbwXkJO9W$>a%$56ZO|iGZa`6cac1 zOOkK^nL1^@XF>)@avuw(x)~5!vZNUrrpfyel+?#9;&N#SNU`Nrx+Ykuq4;qYFn~Xbu8j!hNtl=AMnzLuRnO&gU%XUJ zakWyGGA=y4$lK|PE2i&le4r%kQ4(a88pYs@lxC>X+ z`7r*VmE5pxSjaQDKyqxpTZUvM`11n>iKNArQhZxI=LfF|u=UTtroMn^7B9!f9dsfz z6AkuFHXwniRg#;X0;#5h?z0$nb{Fm(2ih?$R~4J}Zt{q6{73}L;PdE8DTle%ey=;Y zQBsctk4T|s;r+{1C0;kS@5Z|_H~%rf)Gc6O2&P1gh$ThB&Yw(t0KRyTV*l`{VczL2 zE%GtrVEQZqI*p5Fy)0#@t2!Ffu-+dEX`&7l=`T<}O0hva` zUR44lUFKSDk-SlO`KCyCSVx_9-$GXQoB$s~H|2G>u(?IWm{4m}6lB;pk?CxQReE49 zo9w06QLU3n6PjSg*krc-N1p;N{9i}EpVJOyBoi&+Ba}2!F8%<^xp3(wy+f<Eh&on_gbBL zGC<|)@+vGL4N$HZg+;84fB!Zt z4tme!c9^$i!n1&%m5+=<|LvW=3l)5iM2~G-QzV;SN?z1@a=sYFWRrjTk(|g*50c4Y zFESha2dRlxMU=b8A7s5Ct$X3Ezbj5+u~{s&y&JNet^z33DHyzu>d29>MgH71E9Dc9 zW?`*Sp+RU_A}ktE96>*r@mAePQNF;CMb9EG1zj$qux+Fv?m3OoxS6=BNFD37y1gZ> z)^jMuWtd8D5wI)#I*hyRG$xCCisueKG9C4u7!|J^l+vlNz$*IlB@GdnBR91pMe!87 zQrcLuRlWb#HZ*hzacGEzn^tqvh@Y06DzjH-Tl{s4eT+KkC3z0y$8YWW?3}wc#qQpI z)mMI$qH-Cs7wM_~^)h!w;c)gp71K&7dGSA(e$+xb8!k%j6i|5da&?Px6Zjsgm;}b+ z&XQaC@4Yu{ibeRhSv5foF@v0HPTQ^#gWW6*W+`x^?ySV|8LaTld8j|u?*aGgW6 zpk5?1A(9W%btkHQWa%C2_B(Je0ESk*)2k>y!^s{TYlt0`l^#GH%gb5x{Y?UKo&jFC zlg6L%Gvk5c`H>>q13BG=V8Eb?bUmB!Aph@t{(Pvg8-&9;X6E;+KOoHIEfxJ8K(XN# zTONNsm_I2*a)?zJAbH$x(+Z+b07*tm$aJ;+4ErzCQrylEBzXgbp5plYmDZd44Yr53 zsRq?15itHJ5nMDsp(mY2$=c^GfVTh7Z-8}ipZ=;k`I*|*!LYjtf*Lr26^{DH0hHti z%X&vkWlmLC-BZGP!gTXwLch; zLjI_RG^nsW_{FI0B^j7;aQsmsNk+_FKy(tfR-lLG=tP-FNqg+2RyhFRS$9`4MI*tr zH(FZgC1XJdmIqm=8z1IEEpO;U^{GOEiL#AH?^z?Ute94(8Y8W^s`j9b zN6G#}iQ{;=IKaF|^V~f#>r&f7SNoy$_?!9hN}RT98Q<&0@g{#(K(Nl3U0E5~P|I&N zUt_Iie_c<~4`6XXD>qM@-o(*NV$p>fSLj3^H-$I{4(#17;fN!_Y4r5!_Wrs5-f^;) zlm-+$jzH@TaKlSK$ z)))Wc|Nn4}0SMm(umhNY%>UovO8WmCt|V^%_u;xV!l9W)#As;{DOmZUG%-a|Rg^&!4wEr!NDBs8ETGM@dcsIpi8t)#5M+@Hu1=RKrU#Tq5Q>w*b{h4k30YbGcnWN3HxrCxS3=fs6ff%(v=^_Bsre1ValhZ zj8F3rycq@|DTDE8FlKR*C=IvkSk%K{v~BhSP8{e3xrJ+04kea|19yZRRC(nMMaF@| zas?c46!(<}K|w7C0_pOB%x*8`ot&{*vL-<`c$Sfk!xB@sTS|9u+rl!Ttc#r9rXtt= zS9GCY=r4gPk7+{{((+uly~yQZVk8I|oV$iOsJ<4gW1bNd%2`_05dyr83!`P0J$0*Q z^l0jRDN-dA4q6WVIrwx^w)K-qe-mw)+hJqAE|J- zM39h6PvWpZ#?D%wwDUmL#z?lk5CQ|cUK1ebwH-rr`~yHSe?RPLa{qwzD1<;ok$$$~ zfXT!R&^$)R_>8cGxe3#0ah>=?>VB=3{Gb}%Zxi_X*_b*U-Rr>*pZ663MwFipru0P_t<)1-NXbCy2lf9UwR!Xx}-|87*C}^!{$#3Dn=*B z-TS2b-DcZ4OjUgI*D;q{)%W+=B7gpn0C8$e4jIJAVR?E?3yR$WL%++bbkKa{SCNdn z8fc1xHI#&L;IQxp0H1tpysK99C)$jWPVy*xlsTptP7}{x9{`L5E-{7ZYdxVMU+PpXbX%4;Um zgc0e(U4Z%x6YKB2_Z&nVnIZommE)M^{a+FZ$lz#N7!wTXk4x0~vjaWHkEy4@A3RLK z(N()dYm1^G;Qn&y$^z}7HMDr#B7MI3FKug9BS6hPw*0J<;kPe<6KifHP9E_wnK zk2e5bOx@IY4$#xFN-&(6i1B2hvBys*$5uOCLM%1 zO7Z4J3Cgny{yl@z!)(5^e8|N@3ya&CBBZyMSDJ(b&*g~XNx7PEP}}85sP_zfpqC*1 zj5$h-+cWy^-vjYTW)nACqe99Ae%T4F_-@W0j{sw}w%6ld`hNXr#G&f2B)W?O%(9Ix zxOI^Y%gAhO7ovSC(&=>6=tTJ%C1`6QF|*zo#lMpYY%;g$e_J#qR*@xyc_?Mb8np(jd;$ z8Q|`^avgaroOdVmi&S4OdGova;89)M6>6Mc#!EiMke

+7!cAXAZ%CNk5tr50m<{IJVou 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
QdgQ?WVae5_HZ%%Yz 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

6Tk2PMkry?mB$) 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�Cx^Q$iKoYdH`^@7A%biVp}zku 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 Cachex.clear(:banned_urls_cache) end) end - test "it returns 404 when MediaProxy disabled", %{conn: conn} do - clear_config([:media_proxy, :enabled], false) - - assert %Conn{ - status: 404, - resp_body: "Not Found" - } = get(conn, "/proxy/hhgfh/eeeee") - - assert %Conn{ - status: 404, - resp_body: "Not Found" - } = get(conn, "/proxy/hhgfh/eeee/fff") - end - - describe "" do + describe "Media Proxy" do setup do clear_config([:media_proxy, :enabled], true) clear_config([Pleroma.Web.Endpoint, :secret_key_base], "00000000000") + [url: MediaProxy.encode_url("https://google.fn/test.png")] end + test "it returns 404 when disabled", %{conn: conn} do + clear_config([:media_proxy, :enabled], false) + + assert %Conn{ + status: 404, + resp_body: "Not Found" + } = get(conn, "/proxy/hhgfh/eeeee") + + assert %Conn{ + status: 404, + resp_body: "Not Found" + } = get(conn, "/proxy/hhgfh/eeee/fff") + end + test "it returns 403 for invalid signature", %{conn: conn, url: url} do Pleroma.Config.put([Pleroma.Web.Endpoint, :secret_key_base], "000") %{path: path} = URI.parse(url) @@ -55,7 +56,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do } = get(conn, "/proxy/hhgfh/eeee/fff") end - test "redirects on valid url when filename is invalidated", %{conn: conn, url: url} do + test "redirects to valid url when filename is invalidated", %{conn: conn, url: url} do invalid_url = String.replace(url, "test.png", "test-file.png") response = get(conn, invalid_url) assert response.status == 302 @@ -78,4 +79,249 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do end end end + + describe "Media Preview Proxy" do + setup do + clear_config([:media_proxy, :enabled], true) + clear_config([:media_preview_proxy, :enabled], true) + clear_config([Pleroma.Web.Endpoint, :secret_key_base], "00000000000") + + original_url = "https://google.fn/test.png" + + [ + url: MediaProxy.encode_preview_url(original_url), + media_proxy_url: MediaProxy.encode_url(original_url) + ] + end + + test "returns 404 when media proxy is disabled", %{conn: conn} do + clear_config([:media_proxy, :enabled], false) + + assert %Conn{ + status: 404, + resp_body: "Not Found" + } = get(conn, "/proxy/preview/hhgfh/eeeee") + + assert %Conn{ + status: 404, + resp_body: "Not Found" + } = get(conn, "/proxy/preview/hhgfh/fff") + end + + test "returns 404 when disabled", %{conn: conn} do + clear_config([:media_preview_proxy, :enabled], false) + + assert %Conn{ + status: 404, + resp_body: "Not Found" + } = get(conn, "/proxy/preview/hhgfh/eeeee") + + assert %Conn{ + status: 404, + resp_body: "Not Found" + } = get(conn, "/proxy/preview/hhgfh/fff") + end + + test "it returns 403 for invalid signature", %{conn: conn, url: url} do + Pleroma.Config.put([Pleroma.Web.Endpoint, :secret_key_base], "000") + %{path: path} = URI.parse(url) + + assert %Conn{ + status: 403, + resp_body: "Forbidden" + } = get(conn, path) + + assert %Conn{ + status: 403, + resp_body: "Forbidden" + } = get(conn, "/proxy/preview/hhgfh/eeee") + + assert %Conn{ + status: 403, + resp_body: "Forbidden" + } = get(conn, "/proxy/preview/hhgfh/eeee/fff") + end + + test "redirects to valid url when filename is invalidated", %{conn: conn, url: url} do + invalid_url = String.replace(url, "test.png", "test-file.png") + response = get(conn, invalid_url) + assert response.status == 302 + assert redirected_to(response) == url + end + + test "responds with 424 Failed Dependency if HEAD request to media proxy fails", %{ + conn: conn, + url: url, + media_proxy_url: media_proxy_url + } do + Tesla.Mock.mock(fn + %{method: "head", url: ^media_proxy_url} -> + %Tesla.Env{status: 500, body: ""} + end) + + response = get(conn, url) + assert response.status == 424 + assert response.resp_body == "Can't fetch HTTP headers (HTTP 500)." + end + + test "redirects to media proxy URI on unsupported content type", %{ + conn: conn, + url: url, + media_proxy_url: media_proxy_url + } do + Tesla.Mock.mock(fn + %{method: "head", url: ^media_proxy_url} -> + %Tesla.Env{status: 200, body: "", headers: [{"content-type", "application/pdf"}]} + end) + + response = get(conn, url) + assert response.status == 302 + assert redirected_to(response) == media_proxy_url + end + + test "with `static=true` and GIF image preview requested, responds with JPEG image", %{ + conn: conn, + url: url, + media_proxy_url: media_proxy_url + } do + # Setting a high :min_content_length to ensure this scenario is not affected by its logic + clear_config([:media_preview_proxy, :min_content_length], 1_000_000_000) + + Tesla.Mock.mock(fn + %{method: "head", url: ^media_proxy_url} -> + %Tesla.Env{ + status: 200, + body: "", + headers: [{"content-type", "image/gif"}, {"content-length", "1001718"}] + } + + %{method: :get, url: ^media_proxy_url} -> + %Tesla.Env{status: 200, body: File.read!("test/fixtures/image.gif")} + end) + + response = get(conn, url <> "?static=true") + + assert response.status == 200 + assert Conn.get_resp_header(response, "content-type") == ["image/jpeg"] + assert response.resp_body != "" + end + + test "with GIF image preview requested and no `static` param, redirects to media proxy URI", + %{ + conn: conn, + url: url, + media_proxy_url: media_proxy_url + } do + Tesla.Mock.mock(fn + %{method: "head", url: ^media_proxy_url} -> + %Tesla.Env{status: 200, body: "", headers: [{"content-type", "image/gif"}]} + end) + + response = get(conn, url) + + assert response.status == 302 + assert redirected_to(response) == media_proxy_url + end + + test "with `static` param and non-GIF image preview requested, " <> + "redirects to media preview proxy URI without `static` param", + %{ + conn: conn, + url: url, + media_proxy_url: media_proxy_url + } do + Tesla.Mock.mock(fn + %{method: "head", url: ^media_proxy_url} -> + %Tesla.Env{status: 200, body: "", headers: [{"content-type", "image/jpeg"}]} + end) + + response = get(conn, url <> "?static=true") + + assert response.status == 302 + assert redirected_to(response) == url + end + + test "with :min_content_length setting not matched by Content-Length header, " <> + "redirects to media proxy URI", + %{ + conn: conn, + url: url, + media_proxy_url: media_proxy_url + } do + clear_config([:media_preview_proxy, :min_content_length], 100_000) + + Tesla.Mock.mock(fn + %{method: "head", url: ^media_proxy_url} -> + %Tesla.Env{ + status: 200, + body: "", + headers: [{"content-type", "image/gif"}, {"content-length", "5000"}] + } + end) + + response = get(conn, url) + + assert response.status == 302 + assert redirected_to(response) == media_proxy_url + end + + test "thumbnails PNG images into PNG", %{ + conn: conn, + url: url, + media_proxy_url: media_proxy_url + } do + Tesla.Mock.mock(fn + %{method: "head", url: ^media_proxy_url} -> + %Tesla.Env{status: 200, body: "", headers: [{"content-type", "image/png"}]} + + %{method: :get, url: ^media_proxy_url} -> + %Tesla.Env{status: 200, body: File.read!("test/fixtures/image.png")} + end) + + response = get(conn, url) + + assert response.status == 200 + assert Conn.get_resp_header(response, "content-type") == ["image/png"] + assert response.resp_body != "" + end + + test "thumbnails JPEG images into JPEG", %{ + conn: conn, + url: url, + media_proxy_url: media_proxy_url + } do + Tesla.Mock.mock(fn + %{method: "head", url: ^media_proxy_url} -> + %Tesla.Env{status: 200, body: "", headers: [{"content-type", "image/jpeg"}]} + + %{method: :get, url: ^media_proxy_url} -> + %Tesla.Env{status: 200, body: File.read!("test/fixtures/image.jpg")} + end) + + response = get(conn, url) + + assert response.status == 200 + assert Conn.get_resp_header(response, "content-type") == ["image/jpeg"] + assert response.resp_body != "" + end + + test "redirects to media proxy URI in case of thumbnailing error", %{ + conn: conn, + url: url, + media_proxy_url: media_proxy_url + } do + Tesla.Mock.mock(fn + %{method: "head", url: ^media_proxy_url} -> + %Tesla.Env{status: 200, body: "", headers: [{"content-type", "image/jpeg"}]} + + %{method: :get, url: ^media_proxy_url} -> + %Tesla.Env{status: 200, body: "error"} + end) + + response = get(conn, url) + + assert response.status == 302 + assert redirected_to(response) == media_proxy_url + end + end end From f7e40f7ef134a3030aa61114daa39810efb5889d Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Thu, 17 Sep 2020 09:32:50 -0500 Subject: [PATCH 148/182] Deny ConfigDB migration when deprecated settings found --- lib/mix/tasks/pleroma/config.ex | 10 ++++- lib/pleroma/config/deprecation_warnings.ex | 43 ++++++++++++++++++---- test/tasks/config_test.exs | 13 +++++++ 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/lib/mix/tasks/pleroma/config.ex b/lib/mix/tasks/pleroma/config.ex index 904c5a74b..18f99318d 100644 --- a/lib/mix/tasks/pleroma/config.ex +++ b/lib/mix/tasks/pleroma/config.ex @@ -32,7 +32,8 @@ defmodule Mix.Tasks.Pleroma.Config do @spec migrate_to_db(Path.t() | nil) :: any() def migrate_to_db(file_path \\ nil) do - if Pleroma.Config.get([:configurable_from_database]) do + with true <- Pleroma.Config.get([:configurable_from_database]), + :ok <- Pleroma.Config.DeprecationWarnings.warn() do config_file = if file_path do file_path @@ -46,7 +47,8 @@ defmodule Mix.Tasks.Pleroma.Config do do_migrate_to_db(config_file) else - migration_error() + :error -> deprecation_error() + _ -> migration_error() end end @@ -120,6 +122,10 @@ defmodule Mix.Tasks.Pleroma.Config do ) end + defp deprecation_error do + shell_error("Migration is not allowed until all deprecation warnings have been resolved.") + end + if Code.ensure_loaded?(Config.Reader) do defp config_header, do: "import Config\r\n\r\n" defp read_file(config_file), do: Config.Reader.read_imports!(config_file) diff --git a/lib/pleroma/config/deprecation_warnings.ex b/lib/pleroma/config/deprecation_warnings.ex index 412d55a77..98c4dc9c8 100644 --- a/lib/pleroma/config/deprecation_warnings.ex +++ b/lib/pleroma/config/deprecation_warnings.ex @@ -26,6 +26,10 @@ defmodule Pleroma.Config.DeprecationWarnings do !!!DEPRECATION WARNING!!! You are using the old configuration mechanism for the hellthread filter. Please check config.md. """) + + :error + else + :ok end end @@ -47,17 +51,26 @@ defmodule Pleroma.Config.DeprecationWarnings do config :pleroma, :mrf_user_allowlist, #{inspect(rewritten, pretty: true)} """) + + :error + else + :ok end end def warn do - check_hellthread_threshold() - mrf_user_allowlist() - check_old_mrf_config() - check_media_proxy_whitelist_config() - check_welcome_message_config() - check_gun_pool_options() - check_activity_expiration_config() + with :ok <- check_hellthread_threshold(), + :ok <- mrf_user_allowlist(), + :ok <- check_old_mrf_config(), + :ok <- check_media_proxy_whitelist_config(), + :ok <- check_welcome_message_config(), + :ok <- check_gun_pool_options(), + :ok <- check_activity_expiration_config() do + :ok + else + _ -> + :error + end end def check_welcome_message_config do @@ -74,6 +87,10 @@ defmodule Pleroma.Config.DeprecationWarnings do \n* `config :pleroma, :instance, welcome_user_nickname` is now `config :pleroma, :welcome, :direct_message, :sender_nickname` \n* `config :pleroma, :instance, welcome_message` is now `config :pleroma, :welcome, :direct_message, :message` """) + + :error + else + :ok end end @@ -101,8 +118,11 @@ defmodule Pleroma.Config.DeprecationWarnings do end end) - if warning != "" do + if warning == "" do + :ok + else Logger.warn(warning_preface <> warning) + :error end end @@ -115,6 +135,10 @@ defmodule Pleroma.Config.DeprecationWarnings do !!!DEPRECATION WARNING!!! Your config is using old format (only domain) for MediaProxy whitelist option. Setting should work for now, but you are advised to change format to scheme with port to prevent possible issues later. """) + + :error + else + :ok end end @@ -157,6 +181,9 @@ defmodule Pleroma.Config.DeprecationWarnings do Logger.warn(Enum.join([warning_preface | pool_warnings])) Config.put(:pools, updated_config) + :error + else + :ok end end diff --git a/test/tasks/config_test.exs b/test/tasks/config_test.exs index fb12e7fb3..f36648829 100644 --- a/test/tasks/config_test.exs +++ b/test/tasks/config_test.exs @@ -40,6 +40,19 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do on_exit(fn -> Application.put_env(:quack, :level, initial) end) end + @tag capture_log: true + test "config migration refused when deprecated settings are found" do + clear_config([:media_proxy, :whitelist], ["domain_without_scheme.com"]) + assert Repo.all(ConfigDB) == [] + + Mix.Tasks.Pleroma.Config.migrate_to_db("test/fixtures/config/temp.secret.exs") + + assert_received {:mix_shell, :error, [message]} + + assert message =~ + "Migration is not allowed until all deprecation warnings have been resolved." + end + test "filtered settings are migrated to db" do assert Repo.all(ConfigDB) == [] From dee4639dbb1245d4514b7b81d567321f9b4ee099 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Mon, 14 Sep 2020 12:38:00 +0000 Subject: [PATCH 149/182] Merge branch 'feat/rich-media-head' into 'develop' RichMedia: Do a HEAD request to check content type/length See merge request pleroma/pleroma!2995 --- lib/pleroma/web/rich_media/helpers.ex | 46 ++++++++++++++++++++++++++- lib/pleroma/web/rich_media/parser.ex | 8 +++++ test/support/http_request_mock.ex | 17 ++++++++++ test/web/rich_media/parser_test.exs | 29 +++++++++++++++++ 4 files changed, 99 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/rich_media/helpers.ex b/lib/pleroma/web/rich_media/helpers.ex index 752ca9f81..b7852c6e3 100644 --- a/lib/pleroma/web/rich_media/helpers.ex +++ b/lib/pleroma/web/rich_media/helpers.ex @@ -96,6 +96,50 @@ defmodule Pleroma.Web.RichMedia.Helpers do @rich_media_options end - Pleroma.HTTP.get(url, headers, adapter: options) + head_check = + case Pleroma.HTTP.head(url, headers, adapter: options) do + # If the HEAD request didn't reach the server for whatever reason, + # we assume the GET that comes right after won't either + {:error, _} = e -> + e + + {:ok, %Tesla.Env{status: 200, headers: headers}} -> + with :ok <- check_content_type(headers), + :ok <- check_content_length(headers), + do: :ok + + _ -> + :ok + end + + with :ok <- head_check, do: Pleroma.HTTP.get(url, headers, adapter: options) + end + + defp check_content_type(headers) do + case List.keyfind(headers, "content-type", 0) do + {_, content_type} -> + case Plug.Conn.Utils.media_type(content_type) do + {:ok, "text", "html", _} -> :ok + _ -> {:error, {:content_type, content_type}} + end + + _ -> + :ok + end + end + + @max_body @rich_media_options[:max_body] + defp check_content_length(headers) do + case List.keyfind(headers, "content-length", 0) do + {_, maybe_content_length} -> + case Integer.parse(maybe_content_length) do + {content_length, ""} when content_length <= @max_body -> :ok + {_, ""} -> {:error, :body_too_large} + _ -> :ok + end + + _ -> + :ok + end end end diff --git a/lib/pleroma/web/rich_media/parser.ex b/lib/pleroma/web/rich_media/parser.ex index e98c743ca..49ba22c90 100644 --- a/lib/pleroma/web/rich_media/parser.ex +++ b/lib/pleroma/web/rich_media/parser.ex @@ -31,6 +31,14 @@ defmodule Pleroma.Web.RichMedia.Parser do {:ok, _data} = res -> res + {:error, :body_too_large} = e -> + e + + {:error, {:content_type, _}} -> + e + + # The TTL is not set for the errors above, since they are unlikely to change + # with time {:error, _} = e -> ttl = Pleroma.Config.get([:rich_media, :failure_backoff], 60_000) Cachex.expire(:rich_media_cache, url, ttl) diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index a0ebf65d9..d9be248dc 100644 --- a/test/support/http_request_mock.ex +++ b/test/support/http_request_mock.ex @@ -1436,4 +1436,21 @@ defmodule HttpRequestMock do inspect(headers) }"} end + + # Most of the rich media mocks are missing HEAD requests, so we just return 404. + @rich_media_mocks [ + "https://example.com/ogp", + "https://example.com/ogp-missing-data", + "https://example.com/twitter-card" + ] + def head(url, _query, _body, _headers) when url in @rich_media_mocks do + {:ok, %Tesla.Env{status: 404, body: ""}} + end + + def head(url, query, body, headers) do + {:error, + "Mock response not implemented for HEAD #{inspect(url)}, #{query}, #{inspect(body)}, #{ + inspect(headers) + }"} + end end diff --git a/test/web/rich_media/parser_test.exs b/test/web/rich_media/parser_test.exs index 1e09cbf84..b8ef2cccf 100644 --- a/test/web/rich_media/parser_test.exs +++ b/test/web/rich_media/parser_test.exs @@ -56,6 +56,27 @@ defmodule Pleroma.Web.RichMedia.ParserTest do %{method: :get, url: "http://example.com/error"} -> {:error, :overload} + + %{ + method: :head, + url: "http://example.com/huge-page" + } -> + %Tesla.Env{ + status: 200, + headers: [{"content-length", "2000001"}, {"content-type", "text/html"}] + } + + %{ + method: :head, + url: "http://example.com/pdf-file" + } -> + %Tesla.Env{ + status: 200, + headers: [{"content-length", "1000000"}, {"content-type", "application/pdf"}] + } + + %{method: :head} -> + %Tesla.Env{status: 404, body: "", headers: []} end) :ok @@ -146,4 +167,12 @@ defmodule Pleroma.Web.RichMedia.ParserTest do test "returns error if getting page was not successful" do assert {:error, :overload} = Parser.parse("http://example.com/error") end + + test "does a HEAD request to check if the body is too large" do + assert {:error, :body_too_large} = Parser.parse("http://example.com/huge-page") + end + + test "does a HEAD request to check if the body is html" do + assert {:error, {:content_type, _}} = Parser.parse("http://example.com/pdf-file") + end end From eff7f9892dbb042a447fd83e1ce5e9cb69941cf6 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Mon, 14 Sep 2020 12:48:27 +0000 Subject: [PATCH 150/182] Merge branch 'hotfix/rich-media-compile-error' into 'develop' RichMedia: fix a compilation error due to nonexistent variable See merge request pleroma/pleroma!2996 --- lib/pleroma/web/rich_media/parser.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/rich_media/parser.ex b/lib/pleroma/web/rich_media/parser.ex index 49ba22c90..569249f51 100644 --- a/lib/pleroma/web/rich_media/parser.ex +++ b/lib/pleroma/web/rich_media/parser.ex @@ -34,7 +34,7 @@ defmodule Pleroma.Web.RichMedia.Parser do {:error, :body_too_large} = e -> e - {:error, {:content_type, _}} -> + {:error, {:content_type, _}} = e -> e # The TTL is not set for the errors above, since they are unlikely to change From 41939e3175cf31884cb84acd136c303a84c77f8c Mon Sep 17 00:00:00 2001 From: stwf Date: Mon, 14 Sep 2020 11:40:52 -0400 Subject: [PATCH 151/182] User search respect discoverable flag --- lib/pleroma/user/search.ex | 5 +++ .../tesla_mock/admin@mastdon.example.org.json | 44 +++++++++++-------- ...ps___osada.macgirvin.com_channel_mike.json | 3 +- test/support/factory.ex | 1 + test/web/admin_api/search_test.exs | 9 ++++ .../mastodon_api/views/account_view_test.exs | 4 +- 6 files changed, 45 insertions(+), 21 deletions(-) diff --git a/lib/pleroma/user/search.ex b/lib/pleroma/user/search.ex index 7babd47ea..b8c648672 100644 --- a/lib/pleroma/user/search.ex +++ b/lib/pleroma/user/search.ex @@ -52,6 +52,7 @@ defmodule Pleroma.User.Search do |> base_query(following) |> filter_blocked_user(for_user) |> filter_invisible_users() + |> filter_discoverable_users() |> filter_internal_users() |> filter_blocked_domains(for_user) |> fts_search(query_string) @@ -122,6 +123,10 @@ defmodule Pleroma.User.Search do from(q in query, where: q.invisible == false) end + defp filter_discoverable_users(query) do + from(q in query, where: q.discoverable == true) + end + defp filter_internal_users(query) do from(q in query, where: q.actor_type != "Application") end diff --git a/test/fixtures/tesla_mock/admin@mastdon.example.org.json b/test/fixtures/tesla_mock/admin@mastdon.example.org.json index a911b979a..f961ccb36 100644 --- a/test/fixtures/tesla_mock/admin@mastdon.example.org.json +++ b/test/fixtures/tesla_mock/admin@mastdon.example.org.json @@ -1,20 +1,24 @@ { - "@context": ["https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1", { - "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", - "sensitive": "as:sensitive", - "movedTo": "as:movedTo", - "Hashtag": "as:Hashtag", - "ostatus": "http://ostatus.org#", - "atomUri": "ostatus:atomUri", - "inReplyToAtomUri": "ostatus:inReplyToAtomUri", - "conversation": "ostatus:conversation", - "toot": "http://joinmastodon.org/ns#", - "Emoji": "toot:Emoji", - "alsoKnownAs": { - "@id": "as:alsoKnownAs", - "@type": "@id" + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", + { + "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", + "sensitive": "as:sensitive", + "movedTo": "as:movedTo", + "Hashtag": "as:Hashtag", + "ostatus": "http://ostatus.org#", + "atomUri": "ostatus:atomUri", + "inReplyToAtomUri": "ostatus:inReplyToAtomUri", + "conversation": "ostatus:conversation", + "toot": "http://joinmastodon.org/ns#", + "Emoji": "toot:Emoji", + "alsoKnownAs": { + "@id": "as:alsoKnownAs", + "@type": "@id" + } } - }], + ], "id": "http://mastodon.example.org/users/admin", "type": "Person", "following": "http://mastodon.example.org/users/admin/following", @@ -23,6 +27,7 @@ "outbox": "http://mastodon.example.org/users/admin/outbox", "preferredUsername": "admin", "name": null, + "discoverable": "true", "summary": "\u003cp\u003e\u003c/p\u003e", "url": "http://mastodon.example.org/@admin", "manuallyApprovesFollowers": false, @@ -34,7 +39,8 @@ "owner": "http://mastodon.example.org/users/admin", "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtc4Tir+3ADhSNF6VKrtW\nOU32T01w7V0yshmQei38YyiVwVvFu8XOP6ACchkdxbJ+C9mZud8qWaRJKVbFTMUG\nNX4+6Q+FobyuKrwN7CEwhDALZtaN2IPbaPd6uG1B7QhWorrY+yFa8f2TBM3BxnUy\nI4T+bMIZIEYG7KtljCBoQXuTQmGtuffO0UwJksidg2ffCF5Q+K//JfQagJ3UzrR+\nZXbKMJdAw4bCVJYs4Z5EhHYBwQWiXCyMGTd7BGlmMkY6Av7ZqHKC/owp3/0EWDNz\nNqF09Wcpr3y3e8nA10X40MJqp/wR+1xtxp+YGbq/Cj5hZGBG7etFOmIpVBrDOhry\nBwIDAQAB\n-----END PUBLIC KEY-----\n" }, - "attachment": [{ + "attachment": [ + { "type": "PropertyValue", "name": "foo", "value": "bar" @@ -58,5 +64,7 @@ "mediaType": "image/png", "url": "https://cdn.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png" }, - "alsoKnownAs": ["http://example.org/users/foo"] -} + "alsoKnownAs": [ + "http://example.org/users/foo" + ] +} \ No newline at end of file diff --git a/test/fixtures/tesla_mock/https___osada.macgirvin.com_channel_mike.json b/test/fixtures/tesla_mock/https___osada.macgirvin.com_channel_mike.json index c42f3a53c..ca76d6e17 100644 --- a/test/fixtures/tesla_mock/https___osada.macgirvin.com_channel_mike.json +++ b/test/fixtures/tesla_mock/https___osada.macgirvin.com_channel_mike.json @@ -8,6 +8,7 @@ "preferredUsername": "mike", "name": "Mike Macgirvin (Osada)", "updated": "2018-08-29T03:09:11Z", + "discoverable": "true", "icon": { "type": "Image", "mediaType": "image/jpeg", @@ -51,4 +52,4 @@ "created": "2018-10-17T07:16:28Z", "signatureValue": "WbfFVIPImkd3yNu6brz0CvZaeV242rwAbH0vy8DM4vfnXCxLr5Uv/Wj9gwP+tbooTxGaahAKBeqlGkQp8RLEo37LATrKMRLA/0V6DeeV+C5ORWR9B4WxyWiD3s/9Wf+KesFMtktNLAcMZ5PfnOS/xNYerhnpkp/gWPxtkglmLIWJv+w18A5zZ01JCxsO4QljHbhYaEUPHUfQ97abrkLECeam+FThVwdO6BFCtbjoNXHfzjpSZL/oKyBpi5/fpnqMqOLOQPs5WgBBZJvjEYYkQcoPTyxYI5NGpNbzIjGHPQNuACnOelH16A7L+q4swLWDIaEFeXQ2/5bmqVKZDZZ6usNP4QyTVszwd8jqo27qcDTNibXDUTsTdKpNQvM/3UncBuzuzmUV3FczhtGshIU1/pRVZiQycpVqPlGLvXhP/yZCe+1siyqDd+3uMaS2vkHTObSl5r+VYof+c+TcjrZXHSWnQTg8/X3zkoBWosrQ93VZcwjzMxQoARYv6rphbOoTz7RPmGAXYUt3/PDWkqDlmQDwCpLNNkJo1EidyefZBdD9HXQpCBO0ZU0NHb0JmPvg/+zU0krxlv70bm3RHA/maBETVjroIWzt7EwQEg5pL2hVnvSBG+1wF3BtRVe77etkPOHxLnYYIcAMLlVKCcgDd89DPIziQyruvkx1busHI08=" } -} +} \ No newline at end of file diff --git a/test/support/factory.ex b/test/support/factory.ex index 2fdfabbc5..fb82be0c4 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -31,6 +31,7 @@ defmodule Pleroma.Factory do nickname: sequence(:nickname, &"nick#{&1}"), password_hash: Pbkdf2.hash_pwd_salt("test"), bio: sequence(:bio, &"Tester Number #{&1}"), + discoverable: true, last_digest_emailed_at: NaiveDateTime.utc_now(), last_refreshed_at: NaiveDateTime.utc_now(), notification_settings: %Pleroma.User.NotificationSetting{}, diff --git a/test/web/admin_api/search_test.exs b/test/web/admin_api/search_test.exs index b974cedd5..d88867c52 100644 --- a/test/web/admin_api/search_test.exs +++ b/test/web/admin_api/search_test.exs @@ -177,5 +177,14 @@ defmodule Pleroma.Web.AdminAPI.SearchTest do assert total == 3 assert count == 1 end + + test "it returns non-discoverable users" do + insert(:user) + insert(:user, discoverable: false) + + {:ok, _results, total} = Search.user() + + assert total == 2 + end end end diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index c5f491d6b..a54b765ef 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -68,7 +68,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do sensitive: false, pleroma: %{ actor_type: "Person", - discoverable: false + discoverable: true }, fields: [] }, @@ -166,7 +166,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do sensitive: false, pleroma: %{ actor_type: "Service", - discoverable: false + discoverable: true }, fields: [] }, From dfc621a5291a761f025670153bb58a2005fd0a73 Mon Sep 17 00:00:00 2001 From: stwf Date: Thu, 17 Sep 2020 10:13:56 -0400 Subject: [PATCH 152/182] add test and changelog entry --- CHANGELOG.md | 2 +- test/user_search_test.exs | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6072d4cbe..5d329fd55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Renamed `:await_up_timeout` in `:connections_pool` namespace to `:connect_timeout`, old name is deprecated. - Renamed `:timeout` in `pools` namespace to `:recv_timeout`, old name is deprecated. - The `discoverable` field in the `User` struct will now add a NOINDEX metatag to profile pages when false. +- Users with the `discoverable` field set to false will not show up in searches. - Minimum lifetime for ephmeral activities changed to 10 minutes and made configurable (`:min_lifetime` option). - ### Removed - **Breaking:** `Pleroma.Workers.Cron.StatsWorker` setting from Oban `:crontab` (moved to a simpler implementation). diff --git a/test/user_search_test.exs b/test/user_search_test.exs index 01976bf58..8529ce6db 100644 --- a/test/user_search_test.exs +++ b/test/user_search_test.exs @@ -25,6 +25,14 @@ defmodule Pleroma.UserSearchTest do assert found_user.id == user.id end + test "excludes users when discoverable is false" do + insert(:user, %{nickname: "john 3000", discoverable: false}) + insert(:user, %{nickname: "john 3001"}) + + users = User.search("john") + assert Enum.count(users) == 1 + end + test "excludes service actors from results" do insert(:user, actor_type: "Application", nickname: "user1") service = insert(:user, actor_type: "Service", nickname: "user2") From 9d77f4abf80f75559456cef06da1a0d3b3b4f7e2 Mon Sep 17 00:00:00 2001 From: stwf Date: Thu, 17 Sep 2020 12:32:40 -0400 Subject: [PATCH 153/182] adapt to new user factory behavior --- test/web/metadata/metadata_test.exs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/web/metadata/metadata_test.exs b/test/web/metadata/metadata_test.exs index 054844597..ca6cbe67f 100644 --- a/test/web/metadata/metadata_test.exs +++ b/test/web/metadata/metadata_test.exs @@ -16,7 +16,7 @@ defmodule Pleroma.Web.MetadataTest do end test "for local user" do - user = insert(:user) + user = insert(:user, discoverable: false) assert Pleroma.Web.Metadata.build_tags(%{user: user}) =~ "" @@ -40,7 +40,7 @@ defmodule Pleroma.Web.MetadataTest do test "search exclusion metadata is included" do clear_config([:instance, :public], false) - user = insert(:user, bio: "This is my secret fedi account bio") + user = insert(:user, bio: "This is my secret fedi account bio", discoverable: false) assert ~s() == Pleroma.Web.Metadata.build_tags(%{user: user}) From 22d49993d9ab35ff5d5276a6a1f4aec96d03b7f3 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 17 Sep 2020 12:13:36 +0000 Subject: [PATCH 154/182] Merge branch 'bugfix/mrf-ingestion' into 'develop' Bugfix: MRF and Pipeline Ingestion See merge request pleroma/secteam/pleroma!15 --- CHANGELOG.md | 11 ++++ lib/pleroma/web/activity_pub/mrf.ex | 24 +++++++- .../web/activity_pub/mrf/keyword_policy.ex | 61 +++++++++---------- .../web/activity_pub/mrf/subchain_policy.ex | 3 +- lib/pleroma/web/activity_pub/pipeline.ex | 8 ++- .../web/api_spec/operations/chat_operation.ex | 3 +- .../api_spec/operations/status_operation.ex | 2 +- lib/pleroma/web/common_api/common_api.ex | 3 + .../controllers/chat_controller.ex | 10 +++ test/web/activity_pub/pipeline_test.exs | 16 ++--- test/web/common_api/common_api_test.exs | 11 ++++ .../controllers/chat_controller_test.exs | 19 +++++- 12 files changed, 121 insertions(+), 50 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92635f6d0..7125e6c1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## unreleased-patch - ??? + +### Security + +- Fix most MRF rules either crashing or not being applied to objects passed into the Common Pipeline (ChatMessage, Question, Answer, Audio, Event) + +### Fixed + +- Welcome Chat messages preventing user registration with MRF Simple Policy applied to the local instance +- Mastodon API: the public timeline returning an error when the `reply_visibility` parameter is set to `self` for an unauthenticated user + ## [2.1.1] - 2020-09-08 ### Security diff --git a/lib/pleroma/web/activity_pub/mrf.ex b/lib/pleroma/web/activity_pub/mrf.ex index 206d6af52..5e5361082 100644 --- a/lib/pleroma/web/activity_pub/mrf.ex +++ b/lib/pleroma/web/activity_pub/mrf.ex @@ -5,16 +5,34 @@ defmodule Pleroma.Web.ActivityPub.MRF do @callback filter(Map.t()) :: {:ok | :reject, Map.t()} - def filter(policies, %{} = object) do + def filter(policies, %{} = message) do policies - |> Enum.reduce({:ok, object}, fn - policy, {:ok, object} -> policy.filter(object) + |> Enum.reduce({:ok, message}, fn + policy, {:ok, message} -> policy.filter(message) _, error -> error end) end def filter(%{} = object), do: get_policies() |> filter(object) + def pipeline_filter(%{} = message, meta) do + object = meta[:object_data] + ap_id = message["object"] + + if object && ap_id do + with {:ok, message} <- filter(Map.put(message, "object", object)) do + meta = Keyword.put(meta, :object_data, message["object"]) + {:ok, Map.put(message, "object", ap_id), meta} + else + {err, message} -> {err, message, meta} + end + else + {err, message} = filter(message) + + {err, message, meta} + end + end + def get_policies do Pleroma.Config.get([:mrf, :policies], []) |> get_policies() end diff --git a/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex b/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex index 15e09dcf0..db66cfa3e 100644 --- a/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex @@ -20,9 +20,17 @@ defmodule Pleroma.Web.ActivityPub.MRF.KeywordPolicy do String.match?(string, pattern) end - defp check_reject(%{"object" => %{"content" => content, "summary" => summary}} = message) do + defp object_payload(%{} = object) do + [object["content"], object["summary"], object["name"]] + |> Enum.filter(& &1) + |> Enum.join("\n") + end + + defp check_reject(%{"object" => %{} = object} = message) do + payload = object_payload(object) + if Enum.any?(Pleroma.Config.get([:mrf_keyword, :reject]), fn pattern -> - string_matches?(content, pattern) or string_matches?(summary, pattern) + string_matches?(payload, pattern) end) do {:reject, "[KeywordPolicy] Matches with rejected keyword"} else @@ -30,12 +38,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.KeywordPolicy do end end - defp check_ftl_removal( - %{"to" => to, "object" => %{"content" => content, "summary" => summary}} = message - ) do + defp check_ftl_removal(%{"to" => to, "object" => %{} = object} = message) do + payload = object_payload(object) + if Pleroma.Constants.as_public() in to and Enum.any?(Pleroma.Config.get([:mrf_keyword, :federated_timeline_removal]), fn pattern -> - string_matches?(content, pattern) or string_matches?(summary, pattern) + string_matches?(payload, pattern) end) do to = List.delete(to, Pleroma.Constants.as_public()) cc = [Pleroma.Constants.as_public() | message["cc"] || []] @@ -51,35 +59,24 @@ defmodule Pleroma.Web.ActivityPub.MRF.KeywordPolicy do end end - defp check_replace(%{"object" => %{"content" => content, "summary" => summary}} = message) do - content = - if is_binary(content) do - content - else - "" - end + defp check_replace(%{"object" => %{} = object} = message) do + object = + ["content", "name", "summary"] + |> Enum.filter(fn field -> Map.has_key?(object, field) && object[field] end) + |> Enum.reduce(object, fn field, object -> + data = + Enum.reduce( + Pleroma.Config.get([:mrf_keyword, :replace]), + object[field], + fn {pat, repl}, acc -> String.replace(acc, pat, repl) end + ) - summary = - if is_binary(summary) do - summary - else - "" - end + Map.put(object, field, data) + end) - {content, summary} = - Enum.reduce( - Pleroma.Config.get([:mrf_keyword, :replace]), - {content, summary}, - fn {pattern, replacement}, {content_acc, summary_acc} -> - {String.replace(content_acc, pattern, replacement), - String.replace(summary_acc, pattern, replacement)} - end - ) + message = Map.put(message, "object", object) - {:ok, - message - |> put_in(["object", "content"], content) - |> put_in(["object", "summary"], summary)} + {:ok, message} end @impl true diff --git a/lib/pleroma/web/activity_pub/mrf/subchain_policy.ex b/lib/pleroma/web/activity_pub/mrf/subchain_policy.ex index c9f20571f..048052da6 100644 --- a/lib/pleroma/web/activity_pub/mrf/subchain_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/subchain_policy.ex @@ -28,8 +28,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SubchainPolicy do }" ) - subchain - |> MRF.filter(message) + MRF.filter(subchain, message) else _e -> {:ok, message} end diff --git a/lib/pleroma/web/activity_pub/pipeline.ex b/lib/pleroma/web/activity_pub/pipeline.ex index 36e325c37..2db86f116 100644 --- a/lib/pleroma/web/activity_pub/pipeline.ex +++ b/lib/pleroma/web/activity_pub/pipeline.ex @@ -26,13 +26,17 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do {:error, e} -> {:error, e} + + {:reject, e} -> + {:reject, e} end end def do_common_pipeline(object, meta) do with {_, {:ok, validated_object, meta}} <- {:validate_object, ObjectValidator.validate(object, meta)}, - {_, {:ok, mrfd_object}} <- {:mrf_object, MRF.filter(validated_object)}, + {_, {:ok, mrfd_object, meta}} <- + {:mrf_object, MRF.pipeline_filter(validated_object, meta)}, {_, {:ok, activity, meta}} <- {:persist_object, ActivityPub.persist(mrfd_object, meta)}, {_, {:ok, activity, meta}} <- @@ -40,7 +44,7 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do {_, {:ok, _}} <- {:federation, maybe_federate(activity, meta)} do {:ok, activity, meta} else - {:mrf_object, {:reject, _}} -> {:ok, nil, meta} + {:mrf_object, {:reject, message, _}} -> {:reject, message} e -> {:error, e} end end diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index b1a0d26ab..56554d5b4 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -184,7 +184,8 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do "application/json", ChatMessage ), - 400 => Operation.response("Bad Request", "application/json", ApiError) + 400 => Operation.response("Bad Request", "application/json", ApiError), + 422 => Operation.response("MRF Rejection", "application/json", ApiError) }, security: [ %{ diff --git a/lib/pleroma/web/api_spec/operations/status_operation.ex b/lib/pleroma/web/api_spec/operations/status_operation.ex index 5bd4619d5..d7ebde6f6 100644 --- a/lib/pleroma/web/api_spec/operations/status_operation.ex +++ b/lib/pleroma/web/api_spec/operations/status_operation.ex @@ -55,7 +55,7 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do "application/json", %Schema{oneOf: [Status, ScheduledStatus]} ), - 422 => Operation.response("Bad Request", "application/json", ApiError) + 422 => Operation.response("Bad Request / MRF Rejection", "application/json", ApiError) } } end diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 5ad2b91c2..3c7b9e794 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -49,6 +49,9 @@ defmodule Pleroma.Web.CommonAPI do local: true )} do {:ok, activity} + else + {:common_pipeline, {:reject, _} = e} -> e + e -> e end end diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 1f2e953f7..ea0921c77 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -90,6 +90,16 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do conn |> put_view(MessageReferenceView) |> render("show.json", chat_message_reference: cm_ref) + else + {:reject, message} -> + conn + |> put_status(:unprocessable_entity) + |> json(%{error: message}) + + {:error, message} -> + conn + |> put_status(:bad_request) + |> json(%{error: message}) end end diff --git a/test/web/activity_pub/pipeline_test.exs b/test/web/activity_pub/pipeline_test.exs index f2a231eaf..210a06563 100644 --- a/test/web/activity_pub/pipeline_test.exs +++ b/test/web/activity_pub/pipeline_test.exs @@ -26,7 +26,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do { Pleroma.Web.ActivityPub.MRF, [], - [filter: fn o -> {:ok, o} end] + [pipeline_filter: fn o, m -> {:ok, o, m} end] }, { Pleroma.Web.ActivityPub.ActivityPub, @@ -51,7 +51,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do Pleroma.Web.ActivityPub.Pipeline.common_pipeline(activity, meta) assert_called(Pleroma.Web.ActivityPub.ObjectValidator.validate(activity, meta)) - assert_called(Pleroma.Web.ActivityPub.MRF.filter(activity)) + assert_called(Pleroma.Web.ActivityPub.MRF.pipeline_filter(activity, meta)) assert_called(Pleroma.Web.ActivityPub.ActivityPub.persist(activity, meta)) assert_called(Pleroma.Web.ActivityPub.SideEffects.handle(activity, meta)) refute called(Pleroma.Web.Federator.publish(activity)) @@ -68,7 +68,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do { Pleroma.Web.ActivityPub.MRF, [], - [filter: fn o -> {:ok, o} end] + [pipeline_filter: fn o, m -> {:ok, o, m} end] }, { Pleroma.Web.ActivityPub.ActivityPub, @@ -93,7 +93,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do Pleroma.Web.ActivityPub.Pipeline.common_pipeline(activity, meta) assert_called(Pleroma.Web.ActivityPub.ObjectValidator.validate(activity, meta)) - assert_called(Pleroma.Web.ActivityPub.MRF.filter(activity)) + assert_called(Pleroma.Web.ActivityPub.MRF.pipeline_filter(activity, meta)) assert_called(Pleroma.Web.ActivityPub.ActivityPub.persist(activity, meta)) assert_called(Pleroma.Web.ActivityPub.SideEffects.handle(activity, meta)) assert_called(Pleroma.Web.Federator.publish(activity)) @@ -109,7 +109,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do { Pleroma.Web.ActivityPub.MRF, [], - [filter: fn o -> {:ok, o} end] + [pipeline_filter: fn o, m -> {:ok, o, m} end] }, { Pleroma.Web.ActivityPub.ActivityPub, @@ -131,7 +131,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do Pleroma.Web.ActivityPub.Pipeline.common_pipeline(activity, meta) assert_called(Pleroma.Web.ActivityPub.ObjectValidator.validate(activity, meta)) - assert_called(Pleroma.Web.ActivityPub.MRF.filter(activity)) + assert_called(Pleroma.Web.ActivityPub.MRF.pipeline_filter(activity, meta)) assert_called(Pleroma.Web.ActivityPub.ActivityPub.persist(activity, meta)) assert_called(Pleroma.Web.ActivityPub.SideEffects.handle(activity, meta)) end @@ -148,7 +148,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do { Pleroma.Web.ActivityPub.MRF, [], - [filter: fn o -> {:ok, o} end] + [pipeline_filter: fn o, m -> {:ok, o, m} end] }, { Pleroma.Web.ActivityPub.ActivityPub, @@ -170,7 +170,7 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do Pleroma.Web.ActivityPub.Pipeline.common_pipeline(activity, meta) assert_called(Pleroma.Web.ActivityPub.ObjectValidator.validate(activity, meta)) - assert_called(Pleroma.Web.ActivityPub.MRF.filter(activity)) + assert_called(Pleroma.Web.ActivityPub.MRF.pipeline_filter(activity, meta)) assert_called(Pleroma.Web.ActivityPub.ActivityPub.persist(activity, meta)) assert_called(Pleroma.Web.ActivityPub.SideEffects.handle(activity, meta)) end diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 4ba6232dc..28bb6db30 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -213,6 +213,17 @@ defmodule Pleroma.Web.CommonAPITest do assert message == :content_too_long end + + test "it reject messages via MRF" do + clear_config([:mrf_keyword, :reject], ["GNO"]) + clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.KeywordPolicy]) + + author = insert(:user) + recipient = insert(:user) + + assert {:reject, "[KeywordPolicy] Matches with rejected keyword"} == + CommonAPI.post_chat_message(author, recipient, "GNO/Linux") + end end describe "unblocking" do diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 7be5fe09c..44a78a738 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -100,7 +100,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do |> post("/api/v1/pleroma/chats/#{chat.id}/messages") |> json_response_and_validate_schema(400) - assert result + assert %{"error" => "no_content"} == result end test "it works with an attachment", %{conn: conn, user: user} do @@ -126,6 +126,23 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do assert result["attachment"] end + + test "gets MRF reason when rejected", %{conn: conn, user: user} do + clear_config([:mrf_keyword, :reject], ["GNO"]) + clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.KeywordPolicy]) + + other_user = insert(:user) + + {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + + result = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/pleroma/chats/#{chat.id}/messages", %{"content" => "GNO/Linux"}) + |> json_response_and_validate_schema(422) + + assert %{"error" => "[KeywordPolicy] Matches with rejected keyword"} == result + end end describe "DELETE /api/v1/pleroma/chats/:id/messages/:message_id" do From bb70b231d023c6e9f998a6be58f66ae3ff603157 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 15 Sep 2020 12:21:38 +0000 Subject: [PATCH 155/182] Merge branch 'reply-visibility-user-guard' into 'develop' Mastodon API: fix the public timeline returning an error when the `reply_visibility` parameter is set to `self` for an unauthenticated user See merge request pleroma/pleroma!2999 --- lib/pleroma/web/activity_pub/activity_pub.ex | 4 ++-- test/web/activity_pub/activity_pub_test.exs | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 624a508ae..e4eafc8ac 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -744,7 +744,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end defp restrict_replies(query, %{ - reply_filtering_user: user, + reply_filtering_user: %User{} = user, reply_visibility: "self" }) do from( @@ -760,7 +760,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end defp restrict_replies(query, %{ - reply_filtering_user: user, + reply_filtering_user: %User{} = user, reply_visibility: "following" }) do from( diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 03f968aaf..b579bb0bb 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -1773,6 +1773,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do |> Enum.map(& &1.id) assert activities_ids == [] + + activities_ids = + %{} + |> Map.put(:reply_visibility, "self") + |> Map.put(:reply_filtering_user, nil) + |> ActivityPub.fetch_public_activities() + + assert activities_ids == [] end test "home timeline", %{users: %{u1: user}} do From 0465bdbd49ad729e9aec0b3f330607386f433d5d Mon Sep 17 00:00:00 2001 From: Haelwenn Date: Tue, 15 Sep 2020 08:25:10 +0000 Subject: [PATCH 156/182] Merge branch 'fix/mrf-simple-welcome-chats' into 'develop' Ensure we only apply media_nsfw simple policy on parsable objects Closes #2133 See merge request pleroma/pleroma!2992 --- .../web/activity_pub/mrf/simple_policy.ex | 3 +- .../web/activity_pub/transmogrifier.ex | 2 +- test/user_test.exs | 39 +++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex index bb193475a..161177727 100644 --- a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex @@ -66,7 +66,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do "type" => "Create", "object" => child_object } = object - ) do + ) + when is_map(child_object) do media_nsfw = Config.get([:mrf_simple, :media_nsfw]) |> MRF.subdomains_regex() diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 76298c4a0..63dd227c1 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -311,7 +311,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do def fix_emoji(%{"tag" => tags} = object) when is_list(tags) do emoji = tags - |> Enum.filter(fn data -> data["type"] == "Emoji" and data["icon"] end) + |> Enum.filter(fn data -> is_map(data) and data["type"] == "Emoji" and data["icon"] end) |> Enum.reduce(%{}, fn data, mapping -> name = String.trim(data["name"], ":") diff --git a/test/user_test.exs b/test/user_test.exs index 3cf248659..301d8f05e 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -440,6 +440,45 @@ defmodule Pleroma.UserTest do assert activity.actor == welcome_user.ap_id end + setup do: + clear_config(:mrf_simple, + media_removal: [], + media_nsfw: [], + federated_timeline_removal: [], + report_removal: [], + reject: [], + followers_only: [], + accept: [], + avatar_removal: [], + banner_removal: [], + reject_deletes: [] + ) + + setup do: + clear_config(:mrf, + policies: [ + Pleroma.Web.ActivityPub.MRF.SimplePolicy + ] + ) + + test "it sends a welcome chat message when Simple policy applied to local instance" do + Pleroma.Config.put([:mrf_simple, :media_nsfw], ["localhost"]) + + welcome_user = insert(:user) + Pleroma.Config.put([:welcome, :chat_message, :enabled], true) + Pleroma.Config.put([:welcome, :chat_message, :sender_nickname], welcome_user.nickname) + Pleroma.Config.put([:welcome, :chat_message, :message], "Hello, this is a chat message") + + cng = User.register_changeset(%User{}, @full_user_data) + {:ok, registered_user} = User.register(cng) + ObanHelpers.perform_all() + + activity = Repo.one(Pleroma.Activity) + assert registered_user.ap_id in activity.recipients + assert Object.normalize(activity).data["content"] =~ "chat message" + assert activity.actor == welcome_user.ap_id + end + test "it sends a welcome email message if it is set" do welcome_user = insert(:user) Pleroma.Config.put([:welcome, :email, :enabled], true) From 608017b7df5916b607e707627dc09d89599129ff Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 10 Sep 2020 18:40:54 +0000 Subject: [PATCH 157/182] Merge branch 'fix/streaming-termination-errors' into 'develop' Fix two pseudo-errors in websocket handler Closes #2131 See merge request pleroma/pleroma!2982 --- .../web/mastodon_api/websocket_handler.ex | 12 ++++++--- test/integration/mastodon_websocket_test.exs | 26 +++++++++---------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/websocket_handler.ex b/lib/pleroma/web/mastodon_api/websocket_handler.ex index 94e4595d8..cf923ded8 100644 --- a/lib/pleroma/web/mastodon_api/websocket_handler.ex +++ b/lib/pleroma/web/mastodon_api/websocket_handler.ex @@ -37,12 +37,12 @@ defmodule Pleroma.Web.MastodonAPI.WebsocketHandler do else {:error, :bad_topic} -> Logger.debug("#{__MODULE__} bad topic #{inspect(req)}") - {:ok, req} = :cowboy_req.reply(404, req) + req = :cowboy_req.reply(404, req) {:ok, req, state} {:error, :unauthorized} -> Logger.debug("#{__MODULE__} authentication error: #{inspect(req)}") - {:ok, req} = :cowboy_req.reply(401, req) + req = :cowboy_req.reply(401, req) {:ok, req, state} end end @@ -64,7 +64,9 @@ defmodule Pleroma.Web.MastodonAPI.WebsocketHandler do {:ok, %{state | timer: timer()}} end - # We never receive messages. + # We only receive pings for now + def websocket_handle(:ping, state), do: {:ok, state} + def websocket_handle(frame, state) do Logger.error("#{__MODULE__} received frame: #{inspect(frame)}") {:ok, state} @@ -98,6 +100,10 @@ defmodule Pleroma.Web.MastodonAPI.WebsocketHandler do {:reply, :ping, %{state | timer: nil, count: 0}, :hibernate} end + # State can be `[]` only in case we terminate before switching to websocket, + # we already log errors for these cases in `init/1`, so just do nothing here + def terminate(_reason, _req, []), do: :ok + def terminate(reason, _req, state) do Logger.debug( "#{__MODULE__} terminating websocket connection for user #{ diff --git a/test/integration/mastodon_websocket_test.exs b/test/integration/mastodon_websocket_test.exs index ea17e9feb..76fbc8bda 100644 --- a/test/integration/mastodon_websocket_test.exs +++ b/test/integration/mastodon_websocket_test.exs @@ -99,30 +99,30 @@ defmodule Pleroma.Integration.MastodonWebsocketTest do test "accepts the 'user' stream", %{token: token} = _state do assert {:ok, _} = start_socket("?stream=user&access_token=#{token.token}") - assert capture_log(fn -> - assert {:error, {401, _}} = start_socket("?stream=user") - Process.sleep(30) - end) =~ ":badarg" + capture_log(fn -> + assert {:error, {401, _}} = start_socket("?stream=user") + Process.sleep(30) + end) end test "accepts the 'user:notification' stream", %{token: token} = _state do assert {:ok, _} = start_socket("?stream=user:notification&access_token=#{token.token}") - assert capture_log(fn -> - assert {:error, {401, _}} = start_socket("?stream=user:notification") - Process.sleep(30) - end) =~ ":badarg" + capture_log(fn -> + assert {:error, {401, _}} = start_socket("?stream=user:notification") + Process.sleep(30) + end) end test "accepts valid token on Sec-WebSocket-Protocol header", %{token: token} do assert {:ok, _} = start_socket("?stream=user", [{"Sec-WebSocket-Protocol", token.token}]) - assert capture_log(fn -> - assert {:error, {401, _}} = - start_socket("?stream=user", [{"Sec-WebSocket-Protocol", "I am a friend"}]) + capture_log(fn -> + assert {:error, {401, _}} = + start_socket("?stream=user", [{"Sec-WebSocket-Protocol", "I am a friend"}]) - Process.sleep(30) - end) =~ ":badarg" + Process.sleep(30) + end) end end end From 6bbd65fb0922c5e7ed4877968c3c92ff51cc12cb Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 10 Sep 2020 18:38:48 +0000 Subject: [PATCH 158/182] Merge branch '2130-mfa-users-oauth-login-fix' into 'develop' [#2130] Fixed OAuth OOB authentication for users with enabled MFA Closes #2130 See merge request pleroma/pleroma!2979 --- lib/pleroma/web/oauth/oauth_controller.ex | 5 ++++- .../o_auth/o_auth/oob_authorization_created.html.eex | 2 +- .../web/templates/o_auth/o_auth/oob_token_exists.html.eex | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/oauth/oauth_controller.ex b/lib/pleroma/web/oauth/oauth_controller.ex index dd00600ea..06b116368 100644 --- a/lib/pleroma/web/oauth/oauth_controller.ex +++ b/lib/pleroma/web/oauth/oauth_controller.ex @@ -145,7 +145,10 @@ defmodule Pleroma.Web.OAuth.OAuthController do def after_create_authorization(%Plug.Conn{} = conn, %Authorization{} = auth, %{ "authorization" => %{"redirect_uri" => @oob_token_redirect_uri} }) do - render(conn, "oob_authorization_created.html", %{auth: auth}) + # Enforcing the view to reuse the template when calling from other controllers + conn + |> put_view(OAuthView) + |> render("oob_authorization_created.html", %{auth: auth}) end def after_create_authorization(%Plug.Conn{} = conn, %Authorization{} = auth, %{ diff --git a/lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex b/lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex index 8443d906b..ffabe29a6 100644 --- a/lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex +++ b/lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex @@ -1,2 +1,2 @@

Successfully authorized

-

Token code is <%= @auth.token %>

+

Token code is
<%= @auth.token %>

diff --git a/lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex b/lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex index 961aad976..82785c4b9 100644 --- a/lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex +++ b/lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex @@ -1,2 +1,2 @@

Authorization exists

-

Access token is <%= @token.token %>

+

Access token is
<%= @token.token %>

From a5d6c9aa8edd70f09ad252171589ff3fbfa88006 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 17 Sep 2020 19:54:41 +0300 Subject: [PATCH 159/182] mix.exs: bump version to 2.1.2 --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 51e05965e..c88bf392d 100644 --- a/mix.exs +++ b/mix.exs @@ -4,7 +4,7 @@ defmodule Pleroma.Mixfile do def project do [ app: :pleroma, - version: version("2.1.1"), + version: version("2.1.2"), elixir: "~> 1.9", elixirc_paths: elixirc_paths(Mix.env()), compilers: [:phoenix, :gettext] ++ Mix.compilers(), From b751c5babc159586ce2bf349e7a2f8a06e3bb7e4 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 17 Sep 2020 20:40:52 +0300 Subject: [PATCH 160/182] CHANGELOG.md: Add 2.1.2 entry --- CHANGELOG.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7125e6c1d..2f85cc302 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,16 +3,27 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). -## unreleased-patch - ??? +## [2.1.2] - 2020-09-17 ### Security -- Fix most MRF rules either crashing or not being applied to objects passed into the Common Pipeline (ChatMessage, Question, Answer, Audio, Event) +- Fix most MRF rules either crashing or not being applied to objects passed into the Common Pipeline (ChatMessage, Question, Answer, Audio, Event). ### Fixed -- Welcome Chat messages preventing user registration with MRF Simple Policy applied to the local instance -- Mastodon API: the public timeline returning an error when the `reply_visibility` parameter is set to `self` for an unauthenticated user +- Welcome Chat messages preventing user registration with MRF Simple Policy applied to the local instance. +- Mastodon API: the public timeline returning an error when the `reply_visibility` parameter is set to `self` for an unauthenticated user. +- Mastodon Streaming API: Handler crashes on authentication failures, resulting in error logs. +- Mastodon Streaming API: Error logs on client pings. +- Rich media: Log spam on failures. Now the error is only logged once per attempt. + +### Changed + +- Rich Media: A HEAD request is now done to the url, to ensure it has the appropriate content type and size before proceeding with a GET. + +### Upgrade notes + +1. Restart Pleroma ## [2.1.1] - 2020-09-08 From 34afc2b0745b39861d9381e69cdb4b9c158f86ee Mon Sep 17 00:00:00 2001 From: rinpatch Date: Thu, 17 Sep 2020 21:00:13 +0300 Subject: [PATCH 161/182] pleroma-fe bundle: bump to b225c3578f3c89af5ed3a0be3f8f3a6bbcedcc7d --- priv/static/index.html | 2 +- .../static/font/fontello.1599568314856.woff | Bin 14912 -> 0 bytes .../static/font/fontello.1599568314856.woff2 | Bin 12524 -> 0 bytes ...8314856.eot => fontello.1600365488745.eot} | Bin 24524 -> 24796 bytes ...8314856.svg => fontello.1600365488745.svg} | 2 ++ ...8314856.ttf => fontello.1600365488745.ttf} | Bin 24356 -> 24628 bytes .../static/font/fontello.1600365488745.woff | Bin 0 -> 15108 bytes .../static/font/fontello.1600365488745.woff2 | Bin 0 -> 12736 bytes ...8314856.css => fontello.1600365488745.css} | 14 ++++++++------ priv/static/static/fontello.json | 6 ++++++ .../static/js/2.c92f4803ff24726cea58.js.map | 1 - ...4726cea58.js => 2.e852a6b4b3bba752b838.js} | 4 ++-- .../static/js/2.e852a6b4b3bba752b838.js.map | 1 + .../static/js/app.55d173dc5e39519aa518.js | 2 -- .../static/js/app.55d173dc5e39519aa518.js.map | 1 - .../static/js/app.826c44232e0a76bbd9ba.js | 2 ++ .../static/js/app.826c44232e0a76bbd9ba.js.map | 1 + priv/static/sw-pleroma.js | 2 +- 18 files changed, 24 insertions(+), 14 deletions(-) delete mode 100644 priv/static/static/font/fontello.1599568314856.woff delete mode 100644 priv/static/static/font/fontello.1599568314856.woff2 rename priv/static/static/font/{fontello.1599568314856.eot => fontello.1600365488745.eot} (89%) rename priv/static/static/font/{fontello.1599568314856.svg => fontello.1600365488745.svg} (98%) rename priv/static/static/font/{fontello.1599568314856.ttf => fontello.1600365488745.ttf} (89%) create mode 100644 priv/static/static/font/fontello.1600365488745.woff create mode 100644 priv/static/static/font/fontello.1600365488745.woff2 rename priv/static/static/{fontello.1599568314856.css => fontello.1600365488745.css} (89%) delete mode 100644 priv/static/static/js/2.c92f4803ff24726cea58.js.map rename priv/static/static/js/{2.c92f4803ff24726cea58.js => 2.e852a6b4b3bba752b838.js} (66%) create mode 100644 priv/static/static/js/2.e852a6b4b3bba752b838.js.map delete mode 100644 priv/static/static/js/app.55d173dc5e39519aa518.js delete mode 100644 priv/static/static/js/app.55d173dc5e39519aa518.js.map create mode 100644 priv/static/static/js/app.826c44232e0a76bbd9ba.js create mode 100644 priv/static/static/js/app.826c44232e0a76bbd9ba.js.map diff --git a/priv/static/index.html b/priv/static/index.html index 6fa237768..f5690a8d6 100644 --- a/priv/static/index.html +++ b/priv/static/index.html @@ -1 +1 @@ -Pleroma
\ No newline at end of file +Pleroma
\ No newline at end of file diff --git a/priv/static/static/font/fontello.1599568314856.woff b/priv/static/static/font/fontello.1599568314856.woff deleted file mode 100644 index 64f566383ab933c9d02a8b2c64879722d6f2c83a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14912 zcmZX5Q;;SMtn4>7c5K_WZDYr_zp;00+qSi1+qS)9TetpmZrzugs;*R0=}sQ<+U|-H z5&#eY007_-0wDdD4aokt{{KT#Rb2!C0Qn670C)iafErO0xtF3UBMSfkk_-R7X!HjV&&QI*Ov%ch5CAp;Hqr3M3X#Y>C>#_(!3!Y;_#f`INp@e~L|>oUaC2Bd zKmn8ptAHVssVQhAOFav#Aq0q3Ej2upK9diNQS7I|81iuT3=BZU<(PyzXk+`iDOb@ zoq^X(rPQn!Z%O}Z)kv@E!c~{jwS$w351bjd(}~UPW!EImlg%$KujyfR{_UgAg4b=v z`JY$mL-r9`8Gjxt9Wd27+adz)v2Bc;!8xSrv3m=5~JMM#Tk2ua_3N`nB zs`qQ_XHr)GE|as%EW{n&V-`xFae`9dA*9a7WXxT{FW}8&_Tq;hV>50>ML%XkEttbh zMxQ!)Lye|oT+JG_>IhwY+$Jhf6Pvt_Q^qbaB^xApqg55ipac|A0%|A$t(Aa&O29-V zV5t(YLkT#e1UygzJ}UuXm4O7xKo(`7gfdWD8ECHz3{(cDDg!H(fj!E=1!drgGVom) zh@=E0RRVG<0cDkd21-C@C16+=W3b!HJW-owa?D<+GDlFS#5$}!z8PHMN;wTSIct-nEK%KYi(Q(1#p8BxhC!#+K8$m*Zx|;ogoaWx#X0)vbQt z4iVEkm{{PI&;R_15Eu&bSoXIdOfU#4BG?PSBfCb!%6(A+4c}8bJD83fj^5g6XvnHw zg2J}{4~%f536WlQO-g>i-hDX#^I$EikM42n6ps%No5}@UT55A2 zm)okli0%5N+K+kMeWnChD=ka+T(n_@PY5!tV8PTku@-%{;#;C*k#=JOs_=!G!lkT0 zz{+7bwbL|~*4*|y%&(=dL{|9cbOD0TyB+FOI8;y%yh$%f@@!~SY9nVh=?x~JA-P!; zO~q4fI@htQ_K?ni-_^!^+KlC)lDjdV4idf&xAOR%rAk?bT+W8{bP+W|VX_N_$5b5{ zm0+Q?zMTnsM2h4hm-$Gr7zrr-maM8U9dAQ1HTZN9c6U2&X}cS}cJVma(^k>Tu!cgKy#~443J$+aDjrbOeeR&lFq&Ci+`HkeCh~-l!c~^f!hP z^dvdfz`Y6901!L0zN^}7c}Z3Ja3kY4q^*ddaV$aml=!hVO}m;%r=^;;XfBFqp-#Lx1I8hN+z z^k7oeEpBM8EoCJ~g@=oL+N?T%$G3r++Hbf=T&a-XR1=N1jus@raXdMp*7+%-Q?^rl z%@?kdnR$a>oXjE^N?)&>XgF|NK?+*ZT3373%d4A>Tf9L)E>t>cX3mFqjaL%VrUkzQ zt%=+?9|A{+Xc@CLYp@#hu60Ugq>LT1S#T#EWe%y0wHfdT1iXhoo)0$paBHzE@bPVi)GZzX>4YUl+O zSnTL?Y%2EUkOm{`9d;rkh>xT+Zi9{02ZN&+FDZ$3*ug%<;mbuuc`N#b3YA-a=4fd* zIXw{lMC{D|-n%YN@e`fe<1CVPV5+S+DXOcPqKE2X=O@Zf-G`T`+%}o^9h3xK28)%O z{lmI+_0M*Q3n~LK$^WV;GW zt@Edb@SjL){*q5%b1x?UfCvn;FPW%$_K*9v8MTF&7iIrAnQUs>wK^cT=3KxIh$U-c z+a?fv${?M*irewdi1$pk(GNiSDEDTCpQr+g-lDk$`c9{e=1dWT=ueo|%x7@= z5S_6uS;G1WoUwfRvt9o%W(*RUA_j$X!{;(l0z4-0APtzq`d6onZV{ZX!F(q1Aeo)9 z$fk_y>&{k~rs(zO^z#1-tLKBMD*oOYJWx_K8~cvM4E^dBp8D=5D*Y}$dyaocWrTmS z2ugpC5|;Z?U(6wX;?&1Fzky_aLJCTMm+QrvG=uDo_DO?--mF2;)|Zc3Gyrj)@)I zTAbS|SkE6jQ_#OQr8k|QtK)ZiKTfwlwr~7)Z$2Ij`_@|W?gdYK`!{}9ZzWsaR-qg+ zQT$=;f&Se!8=YB7Cds2(ij*vdRPG{mx+)xsIBW}-{Lj#+!R}7*MgFz(b58bXMR;4Jw4dOOFbJMqO<{^(?4O`%%|J;avptHK9XMhFA9gM zvT;nUfWa7yL4K0Ru}!z$lS0}DlJG8~1#DcGB|*L>7963yoi#<#+Y>&rc#`ngLPQRE%E35jg^@=+97WBp@vgc8rc@kM$^#efJ>) zg(78Su6yKgLBEHRwaY3a0l&lWAqGKyNq09nr0R;9 zt&u0AyAkRk@XtO{&Gc$KqDgfKdm3(#fG7$JJ)(|wmiZz^<2H=chtk?(U=z=oNDtb? z9P@E?v~5IF4_xA3>dICh71D;al^xr@~;;bB{bC4tG7SpiGB3TLn zLzmBjpU1&3_n&{Pv^{q*u(69AJO0_Uxr#mySrMoHZEet}m7=kJeShx4MttPYk4Jyg z;+l&dyTZhy8Qb6m!cGX|qe-h5Lm<5ALe$Qnu1YVC@z_d0c4c7E=+sn5RiWD>ad(-} zV4J28{0r43%J>(Gql%mrtaDb`Be?K(fJ4=+Q72QQRRv*;j7Vf~2N&x0WT&;?)@cZ` zs>2(X#9OAb1M$0VvI*sKd8Yla_5nwr!Y3gY3nxxWAqb)lU2VHB1l)ejoE;l;`#MTu zDL85Z^M85StwAqlZfF?)9DLmoe0;6vngwG@r`1p z7$4TYqQVH#2WTk{$(aJWfR#k<`Aa%{69$n*>DE1f8q^;%9XTvDA@WxV1xHv1?#7h4 zy8WeGN=HF5BXuRjTXUw;Kxqp7!Slra49g&_Bnmm|%(;8gCl!JSgH2jJR)uMW2J|>~ zqb(}tIGi*ceFZwO}0{y$bJp14NHjR$nTdp2Dz@Lr%@2641Fy4f# z7hA`-uiBkoKVjr;osAdQ)w#;>Ek#%T^Z~JZ4Q0`VwN#~`z~l3kI1b@rBL*~U9qwNL zB&W}7{$p3WR!q?`ht*oWPN8%sG1~Jv#4@N6d6jxz@T(V zt&@G+tchu=rq}(85|KVOFl1J_Kk4bd!wQ)N`E;BvB0achi#Xs+5!3Op+dfK>PQ@4# z+a?w}d_ld)7w4P?n-6nG8J!b8dwmraiuhQ65b8qq=XqyuDH-`n_%z- z?ZdXvHaaX6RqEj2xT@a^R=0o2KXVM%MQbNkx8Mrc#N~$#l<Cd*It$oj8w5ez(R%l1f9&^5p6dsEEfW)a?GH; z7p8z?IAll$M@8Y4;#C6?P~ZhnS6|E#qQ9huD{}& zAVZDBVWQ_vi*aI7rlDA{A(n8^J|JOLBNz%rSv%XIh(5U6$-k|a7*cP*hib&_IyigO4k(P;#VF65$S?TxA(<-IT8%`;9L z4NAONuJW<79VGDM*S9be_J_vcq?PY~`8oVW$>wtER10+{*| ziqu)bw`^NDcekJ2MbOINgn>XRlqltl>cumrL<_3~9zmJ>4qj-w{_Fl8{^~X2Pj4q{ zj&1!HeL$)bRXKP0pezjoB(gnyvaM8$1~#m#J~QfA*%d&>c`2hrNF8Zlr(ZAVbrPz! z%h?{2P4setc}vw^9B-K3*mkz87SD!OM1VZD^q#K~7>{&?m-tSb#>kkR7jn{6&gZTy z9wS(X-Cxy-hjBE!7||~E&Es4<ad5*2+C@;RkzpE&5ATJN(vIf_%!ud<*|0Gc@92BytC zk)&_MDv_ylT@**MwT~cdbNPivvf)*V!>ZWkA|zhzmN{0dF-$cPwtZLP?jE^~Iq{-#WW=lK2Jgeu1>y5q7D6CJG@G%#lh=aNj zPLQsL%v=jZE-rvl}mEVhx<8Y<`-NH8UgCp{VJe3vKRUl z+c}O^og8&u*f7h$b`bIm$+}N%M7?LzYSginRB9xF&e$~`qkSB}2jq-#wu{ou{& zBU##tvW4phkm;HHkfmeH!TuB}8$uQ^$dQRw7?0KE&m&t8M|kz8+Q5RPKy4gyHB^^` zI^~`gU@K$xWjS4(Z^m}xdmQxgj|X|Y4Fs?+`T(!iCot)K2ttXQ%aJa<4=r!ly5<`0<-;ZUGt}kF zI%C5}f&?t7GRUjN-i2eUg$a1dm@Zi0LG$eV1oeg$i{nZ_B15{hKn+?4d1BlVIWupc z92E?@yElrmS#1{SNOdUKNHisu=vPJyWThBt|s<13m^0M3Ugt2)%(4uUNMJYg6I1`i=K0RvxFgP9+CUxiuPgbdUIP6|0-g`%>YWFznK0xVk#>ufou z>Lkd8S>A<_#t3cG5}Hc`AY-wqM)!J|z_{yulg9XUMtn@_4^CWLu+JDF#1(v-Y7^N< zoDKF_a9!j(@Ll zhPap(B@JEF5{0E#$>kD3xr}a(FS)O(!zaJIWQVbb4jkO!$A$XU)T0__FF6=>oquB}cl zzDawKNPm%%)`&zV?YACY!PtOcn&G4s4Je3Wz_&jakl}j?tNyp|zfP6jXy>@vN7;xw z>v7xy{)V5=p|>5Rq8HOva_#f=+0_2h0NawlHy{?JzDC%b)AzZQc8-Sc400C++3}vAhW7HcgSVcF8RSC$@<;)Ag z#7efyTenz5X23-c7!vaw@4OIn&4FrCtZL{nQrp*)`G1M{Qnbx66LV5wj#(c83B`IX zN8rDYI7zEh7z)~^3aQP@q0|Ps_cYX(T{v>Jq6O|1}S_r6pK+i zpKU@5_CdCGMUd&Jsf23_Ce+)0CV0n9iNYzASf~R*7OU4urJ{+98_0B&6tZXdL8=i?YJQv{Y*{c-=9B!v(Vd|GRYlNY`Tvq3o;yNG2ZDEsjB zsSCtwz-d_KDnEAgbc`Y7jGQRugJ>98IaI)|Imp&8EsR$$35o`=ZAO8mq{pAIcPX1H z2@FZ0$dT5~d6+4@j)`L^)%3vr1VSeGFGfvNrE&^Cob55%vPPLF46lvdZUm@r(=Ien z&;}mV#Ob~4$B^{_k_Xb<y3`)u=3 zZ3h_X`RgGa7;J7imZW{A-I}wM!nH`V@?Fc+9SR0=s(QA|M={zm1YW|jJKx{aj+l2 zf6UFaz3WD|m=qq-KK!+Lv&bGcM}xwnN$Mhyp#(xduZv-KA1x}n2*pn0$L>wXiAV^X zR5`Xugi;od3)icB)JM^o(qY`Tu5F0TXg6sOU{>>0Ile$4DA4IRRVg{OdlhqjU1@a> z8yuyReBL=+3uaiEzV^@}Z--(}(?L~bhZwG(IB`{xhy|ugZe9JNdfK2WcYGb8X=Xo* z_D=c(bFaGI*+`oVmmZcmM6niUs@Xak~31mrl*@etS)^wz)MwubUYF#gNojG>F-Sq2?Dzvj8Qq*t(BA z#PiOZUsVT3v&%2GiF@j!#&`H?AfN48yOkw@zm^MA2wH}YZqg>{IE_q2$J3LjO$6~Q zoWXR(`Peh0WJ? zQ_o^%3!Ttz?rE2|kC&tMJ-Wp3QIU33&Y8ZJj88Z7o0hi46LF^Njf?Y3Mk$Avrw>;n zGgdJ7AgoRXY0n2-Mi>dMo@rCFCulsh>mQgXR#bQ>Tf;x`%S!qVJjw3ZKIk{Q`JhT+ zmD1Z{DPHWrB>DdQ)hc2cp#~hp(CK*2J%m@^Ov#5fy-+LHRr%EEj#IlLFHY zoTXQWIqI8^M^d2=VwI4Gi*AX$3_hBCuLgzSgWcfLeVVrXdfTXqiAA{~WXJI{ zLRPML+qX!NZL~$eHR4?lBf7okU;vf->nt^?Bd{f_NA>+%Ia^a~4&TvN-MVa0#?I*LpjMZ8?$?3pD)WHCkb^*79ZGf*kC+5z%siN6({+Uo|p1FRw?IgRs4+|71tM^xNLeA}w|V5#j{y4yl~ZOmS7S84{QeMNoWn$aUTfRnqH zjK7oV;GDZ7}M%T1A#p zl4f<98};bVy)JhpUzn7Vb8faG&bU`-&Cx|CGxN4L4ur8#Zv4E>MxcC$i?;)*hp6u~ z%`NaLE{#Hm$i_gje-45yT~Dt=Lw7guyLoro5>>MK*l`+g8xoD(GP`7r{BNjPJiIJO zE1zk>$|mLFEA=tQ^UqwFr)V01(Ao*bQfw5YN_mo6Q4&;Br0U2Dj*+_+m4|lf7FZKY z5%nnwWngEfDrKe^qe9TSttcx(9$LCmXsK!OINh#mxU(HD2`icQz1Yr zO77tG)FN7I=W#SCSFUk%g}*8=^fLv{=5#*pbf3JI$i4`Q`>#0~(OHGP_s>b+Qe22B zlmmAjuhX1o&``#D{TPIkGnj{| zmfWAK{?4z9X}P{|p*w-sJ-y!-J*0Ujv%4Q>H~x9c^$Y&!iV@Nn;)uJ`-;G;qNF6>8 zSQaW{As7i*o9p9G%DQ?zrpV)TGo`NUqtL;cwV;#bB$Xsxe_?2jT9%lo4=J`*$#Cx3iPF*JS;41c{l7ynOLjN z!p7uamMLI@1EDn`)H&K+#))AS3hJKo#bOtI=G|2EwCi1{TdR{R$_zB@@R!|Yj7xsP zdp8|ml7BnNidvb4e7?MCyqA5ZK>55B$g>{55Z<{$*&0bP>%3GlNV5js+TWK}z70DTXVmqOq%zh>;rIn~1^WaD^`^+OSeH zTNu^n5@2RxWu4>gcFxBi8C?uo)i|8Vl^*dx4Qi!lXB0JITl?*G9*}{^UR&^->ZL#S zYi0B|R?X%Lk{CV;qW16Sm~lDopA@GxuVQ%q1>4UCZtV;oSB~=E+{`DOj`%@s?mCmq zj37VE!d9$NWM9u9aPQlYQ6foV%!({~ImyT+nJ}5fE;yrq8Bbp8+P8@>*)2V?rt-d* zY#-Z#Qqf(!#gtZzPnOjS+GrsBAB*CvM?^pU_i}X8!rrWW9bAgk49Y^btZZY z0Sy6!m>j|dg*eSI@$21f$zrPLaZh4`Wl~IuS)3X|Z`>a;6e#1t_*w)^-Ca8Hkt!>Q zV=cHnh%iz^GRlp`>GCfxFNlvV4}SxCM!wZk@K zBTiT9Q(mb7NqEp<{;;l}n7Yvx-z}}1JU>llOvyz#mgDsOW^UId7dG?XlTL?F;^1jN|=US1SvH(r20pqLesa7MwUA}P%*Z=x!ec*`^`t%N;m z5YF#XAS5~u6XNw=xa=vTdGeU9lf1t@J2**==&wLNZcO3>GXiV zsc`(^di^b#W+nB-S6)ZB-hvBM*q`C080AD;vD|v{w=R+JG+nLv5OA9eR2fs|OhLa)$9i|cNU*7lcMyDtzlxb1>b;SnQ$(q8-kXPTxF*m z{wqc-5=#}39Da(d)lhjXRiW;2ip6?HqAoM2Xul)C-}un?&HLhjYi*~lvLoToKm?x~ ztoDA_u0sPHk^~v!*hwYmJuZOqJNsv+<_SVOdYoM95oG+A`>&ViTJ&%$!qt|O-$x{c zAb7Ci`V(bSt3a-T`p%tfpQODyu77KIK8a#jRymZM@V*F*yn?U(h@YdGW4g^!T(4C#H~vdS zOL?#FieVCNx}4HITL*~C`;_W4Vk*>cphSZ0ZXzm9U8E<8P?Xw|93|gQ`)g&U@i;es zCZau+3$`E5KhNh*WZZU4Jw-|&ryr)Uu}WB`+`d{#erbg|AirPJlM@A2L4%<~w~897 z%A|8&wfXj}eZR_K@wPoiVhYjm&`0CFLVN0WOwmoc3k(>nCgc9m$?5}i&iSssnp40O z3Y(j1=@@yHuewWmAzU?%u@SFyjDt!_IQkKNMve+ruz>p#;c~E~sLpzmhHLZY*yIyT+beWiFnn?bV$j2-H z-aWPQJ$g~%_$H9}a_EFn>$M)(X$QS(g=q#K464VT6B(vwxvJr;Dtqk1YhqPXVf+Z~(PK zPd8}*{-ZKNn!Z=UCsCKQ@H@@3F0wVj9HBa{hRz*X1EW|d2MJKQb`g44gynECD=jur z;$xVo!>mtonnHSJ72~^id~{BRFRVp#)LdcTE&H~V0%s>~Y1z*7OEHe^?w^wPWSD-0 zWF&1*E@K-iGm`r#D6^u-Tg{sx5YWLZ{;TTeWg_&P;A@cLVqT?~88$}Q`^e~`rFQ&; zbv&BDCCCW8rF@O|sHJR!=i`A(aCzPRD2XKNkIyg!M|h@(;@jVpzLdh5kPQhh1!+vMwVB7=RH2Ptz}K5 zNr(k^mlDa!g=6B;n4&Y1sLT`H)P?w0M>n*O-P+7Km6-i1IVErh3mT_~nZmg-cTxCX zdR@LuzQ{kt*Ty$UnsELmYL6`#?3$}n6mdJyyu6Sbo|*>k#}(Q+c`Gw{o95}7e#SVP z6mdWEdEfJQ<53NWWi-EAq6qyLH_O|;cG2`|a!?blXI6lf`p25qn48w8KW|w`P@qUT z>o4cyH9Cqt+DS++Tx@^WwcWheb0|YH-IO&X5cb!gdGf#8rx272ezViKbf=4m*i!%I z)j&fxH{SI!aVi@#*-`n=? z^#P~ge17MP;j{}MT7>C3Mfzs;c^uNAWW^8jtE!N<)Q`QFZzGSZ$n;z0Y=Tngg7|J# zxHZv3Vuq9c|U<@!o8DSg^B_2VV5COTU`dm53J=#9n4t(PjGo zRVZ2=W*CC^e0Eu1{^z7StKQkX9DyE4f(C92jJc^#7A#?c1KhKuC zCP&Yzto;368b+gHINwiW*`lz@bBrP^R7Czuj^d0ouT+8i=Cu(unIcy{VKd@$9<7lI zUWOb^V<^!uL_S5go*6{*X+B zr)uN%ht=YPy0F*GuZq)3&eQId3f!eLFO<5|9GcUr#%Dg5jR%VA53LYb^$aptOZQr; zGU`<5C+I>GTVUHYi}Xf83kL`w665~-C6$T`_RW4BL|Arx=ZHCclS*&2FW!{hF#nku z)i;ROJvBDdsr#Nk4K7n}9$FB#%x#!q`<CNM=z4?9OEYDCO-Eib`9b?vXW$IkQlM5w^#QtXHU)6DB4fg4X@PrHbWr~$FyG@by zwYfbH2_;aJdvOX8xxLqOYP`s#s!&msZ6WbDdxdsvQ*OqW-#;p^w-w&<(^Q+xlB=Q*j7PeAASi9=NWpy;XH}lc(%B zKbrDg;x?zVwtND+l6G;k2vTppNDl4&?FcPf|MbSPJ}P-xVnyH)Xx!pe|LB-6cd4>% zLr=g^-cde%tAno)7t2Cs2nAK+fnqpVMWz$?YHI#QNvu3{Y`DymFOMz2tM&?!US2cm z8D`E%vry0K;ix+<*6BrVN-I;(>wSRve%&4_ZbqM7b&^NksoBpIYZottrmXbmAqB)k zH?eG~y&ejsE79j>RCv}LmAszByeuouHLeU>uPCs0m$iFU3RpYY-zq6SXz4%r*4q4a zr68LXlk3z1jHfZfGHh*CT#ulgu)Ac!Ob`2}rUFuOXfZAEI*xGZ^d z4vWGYktBF%m~g`62-)z+dg4)^L|Kh_vf}g!!{SdgX+`dx)@K9;K8}lC>ygK1>D|(d z?Pw@6MyCANJllYycq*Fz+UnddX7&*0){|1PAw{>;GjEGB!GD!L3ug$=JX}qj>&TZ< z&15#*GBxB1ytI+HJWeP!*{W0YS1!nZ>$z1COO8B(KUsjcM z*JQJ89Webue8`5?YGbw9>+88zvdu%8IH2YLW%`*J&3mp0Jc{)Vb}KXy!y8k#CBivE z6kc?Nl?B|R5?YU?`<0%ych_;SJf348Hi_2P4|jqJmeBg9d!p>>wkkq9Pb2>C?!E8Jd20nQd>g-6%@U}DG`6A7%{8!NQax(>@;i(=WIo)3 z#85m48f)!kCCu(V__%&PsEo-$eg;2eJD3wE>|9R>E^E#hpW;k1t3|oRV(c81Xytm_ z^)4%)!LfJO;jPMC^eejv%OrfncLaPbC9vsJA$2t%bM08H>~7aLq4E~i-(q?@UW2cY z3#VV}Ga9a>PV~kpOnll%eS>*j*GIsvYYhyxLj+1}@Q9W_m?_=((`AcQv^KNRXG~^HrIg$G4}YePYCEAC^1`7dvVH_mgYa0 zODHdl zxc(p!{?1Zal4MvVlgGtXo{D@YMmPJXPS$vl&e^W|3uHh6JiQjWiba-Ci@OGu)yIu+ zd-9+7=q+23-vrNx??p|o-?Lz!{KM$hlU(ZL=gB*G@5lD_>2BQhejXHxkZk$?^>4`l zW+>RU)Gx zyZoX;5kQ$il|Y?CLq-!q=RxLLy%Vf-I2nJ~yJ0PcV80R_+j_yEoT0H6}i@xP8owrl*f z%%BjOMDP6jYG7ob&W()r5F6wc8f-|Uy$k6=O|eyGad8Gq2F5#1PY}|f>?@t0d>IJ_ zDuwfP2Cq8>W*>G>e!br{*GjeHnB_Dtm(c1R!&mnq&fEAM0gi`jm*US!TdWOPEH2k5 zFKzk8uOb)$JlgC^)KOk8jkH+zGY7oYF}+dmHl^9vmow5)S9rCvwgB3v_0^`5@x&#W zrrpFoBp+-BaaA+%bXl&}3XYOT(`q=})AnZ){_R`Y?5T%2+kt7maQTcg5qp0BB7#E_ zj)EA;s`FzKm}>mVwSN_SZSWb`{1K!VB`Y&LSI;*Ob73R!vRJ0J>acLaNq>jA{}>?j z$72snxoU)h5(6`lov)>;QWBlwOs2~7V=@ww_{BaIT0h~a_rJ5%r&i8)J%qG#64dn_ zCp*41R!A$#Sq3L!{jT+m`ximAC-tgyGS4*v!vxubzkb)qTatLyokx~jP;2?j51TClSl-jVFS_9_t8#%8%8X01vPPnJ+%FaY73rh3#@7jy=V)_Y75zH3+ikO z`|$V^<`F#V5m@FCdg=iZn&uI*>JbEncL42hhj?=bLU;$0cL!l`hp>AGHu{QP66hYN zcJ5u`iLNs`ZQF*`(!FUOx)nNR)=XZiS+#`1S(pKN3k<2?Pp7f-` zq)FGX+?*+GzCMN+q%W*bKisT7%XL; zkaL$ZnznVT$=$7#wgNAstz_nuKFzw1jQxe3KGli={{hVZTMz&M diff --git a/priv/static/static/font/fontello.1599568314856.woff2 b/priv/static/static/font/fontello.1599568314856.woff2 deleted file mode 100644 index 972e70831d2af5737ff64f92c61cb36b5fe1e410..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12524 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 CT6|{! diff --git a/priv/static/static/font/fontello.1599568314856.eot b/priv/static/static/font/fontello.1600365488745.eot similarity index 89% rename from priv/static/static/font/fontello.1599568314856.eot rename to priv/static/static/font/fontello.1600365488745.eot index 1a6931a0eb07cc24d512dcafb2c891f0cbfe033b..255f503728cee8b339cb9a2d46ac63034b892b04 100644 GIT binary patch delta 1032 zcmZwFUrd`-7{~GN^S*Ce1`Gz27P=Nn#~*DgV0qW-WV0}wWGMs|LL@F34J##)LUqi{ zE9Nw2(?ua~B3GJe%(jbN5PP!=6Eknjbc=s3W{i!Q$w+E2`qoV^%(j|$Z{n5b$>*GN zagyiccg~H^rFc!8#aYm2*PU^#`Q+%A74w|6P^Lfm{a1*|}F&g3ijr zdobk(g7f)o?(Oxp8JHS`ntV2WA`k3>DK}7+U3_i6_R^sv;Od9x#uqZ_u{E8jq>2vW7UJeQt1cW4^M?f`G)(x>vWvGXE~FIpE^ zO6M{+Kk&A|_<2xn=9f>bD4wq~FnJV|tNB+l`K_VIXK?I_aY0^`HRHZyA74ZOWFGa= zE{aMuD2r&a4+s-Pqq-C^&MU8XoyMv&|J9rSS4K>I!!ZQnG_I-t7^bqLzSioYT0vQ3 zsPL8MQdT2SiU3h4#cVtQCEZ3ZnD5%?1M@u_{a|j`coNJ_8!<4i+ZX`zwhbN3J2v)$ zxn)}=4(44O2{0epcnZpmHlBuZi;aCyK49Y+C=b~fgz|`u{ZKw`!#aE0#l1W^sQDZ1+}C$(u>Ym@^HUsj+megh$?;cHL9X&&o_%Qfzb@$YX$6F_DinmU>dwR8aVo#_$ zu~&}|taik@Vji#B;B+;6)Qs*%pP=v`8K zS0oUY(c-t?%f0a6V{$7HmM>LdZ_a@u)u9v#>AEN#TKPv9a z-VHBG5gD-hR(WBLvNF`+0IGZXM ziLuRrWUHt3qHo0avG4EQ;oWO~{GSF!0zbDMZoAMPZGXT0_h5hUR)^kkKXl2;1sE=P k#%oj=HbRqU6ggPHNa-Ql{|Bk?q=l0lJR-00000 delta 748 zcmZwET}V@59LMqRvvb-)4JCwhPF-P9Yq?sc%a?R$U8E~>Acdd|og1>{Aw?`m%SK3r zDTiJzD!PgYFQQY>g%Cm@!h{IAvI{Si1`?dp%bjSMm6zp*9!>6vkP2~B%@1D_Y^^B5^PJ_;LvdL z!s#HiUj*B%b|tE<1rN_b_Y?iO=n_-UNUILpxF0fpzzdlwi6dZ6NmPP) zU&06GBZ;G6zLq!!=Awij%oT~_V6IA3fw?Ae0?eP%IMrZoO4NY0TOt5fk;F-`PD#{) z6_lt0t3{$7tUiebuvR3pb88Zf@S{qiDO)$jvSZq3bOpW?x)xH2=AQie-{dNpY(dM{ zJ&k{Fy)9HDf_f@s=ym62eb0(3i_=bzbIkdsq^M-lRqINZ_LqJxJ6QI%ysUhr{Jp!| gJ-0Wt&$s=TLBn}IR}n$|K*xmfs-r;|R(L({4-gH + + diff --git a/priv/static/static/font/fontello.1599568314856.ttf b/priv/static/static/font/fontello.1600365488745.ttf similarity index 89% rename from priv/static/static/font/fontello.1599568314856.ttf rename to priv/static/static/font/fontello.1600365488745.ttf index 7954644759a21507582b43e04f155f2f139e63ed..6bda99d50ec6c3474da825e450cac7eb7182c4fa 100644 GIT binary patch delta 1013 zcmZwFUuc_E7{~GN^S*EXm}Xi3q)D44ZJIW%Cb6w)mb%%^w8mMswA2xb#lZ|+nt)9c zU6tug=M-^6Tt{HNQdDH?g%`zmu?rCqM1~CiTuj6wy=Wm)(Zo&hVq4_h3to91KIfc^ z1JB`i&PSiir(eiw@5&z_Gr;V8AyfL^D)S)gV0vr*IQaql*yy?}qAlq+1gv^odr zF=#5~GN(&GGo+n>HMjW6g8k}|<6s$vC#Un-%qh=%zqufF7KrEb*^K47=7ZEVpf6uo zKC|09+xQkzn;_Q3;(TWA{E=Ch+6LY%WX_aiZO;{$UeqtJlqqCyyzB0O>9;|-Q7WEZ zR$Sj?;pr2gTr0hpE$xhlKZBDWU;5`+SuLj}_s}8&APcDXcM()&bXVL52fAz-yRr!MQx@jE5Txn4iX~wR1Q1z7bFmTF zgxWg>hM;!Qz%bO-3_Jq04FgfAT{kcSwJifNsBIhA549b`3UR32GB66Ydj=kbdaHp0 zQ138s5bB2wJO=e~17lE68aM>?QwH?2TLvD7`i_AF{29ZdPkI=Amh#X_qft?-YAb`p zm`WTS7R?kDv=LEdXm69MsM=HQq9ieCrXm_z5mgjXl>&;g1R|vMM|=iBQju_IAmDFn zYc`wQVTrn&W=p%%Z0R3xh|BGeF2(JT{((U)KH3}TAKf2|kF4}WgHe}TZ82NgUFrwE zP{0>+=R&Eq{CqyGM|6KJuOAzgiSpL5O8H`HVb&AfdOr00y)U$H z)rbU?Dm8GdBRVK=>&YV-^iOQXsLt=ZN Rkj-UE`QlQxa^U!`{a^h^^j81? delta 718 zcmZwEPe_w-9LMqZZ(FT&p@fjm=~fxkTCUWbnWiHPN)2rxMPNM4xglFVsE7q^Wh2Cc zO&-&QG$c1972x`gRN!@a> KRp{qJ>yAHQ@V>eL diff --git a/priv/static/static/font/fontello.1600365488745.woff b/priv/static/static/font/fontello.1600365488745.woff new file mode 100644 index 0000000000000000000000000000000000000000..11c866ae00fb19196fc2ccfd78000476016422d6 GIT binary patch literal 15108 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

J1P%u>L0rtJJdI} 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 tag\n\n// load the styles\nvar content = require(\"!!../../../node_modules/css-loader/index.js?minimize!../../../node_modules/vue-loader/lib/style-compiler/index.js?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!../../../node_modules/sass-loader/lib/loader.js!./settings_modal_content.scss\");\nif(typeof content === 'string') content = [[module.id, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = require(\"!../../../node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"a45e17ec\", content, true, {});","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".settings_tab-switcher{height:100%}.settings_tab-switcher .setting-item{border-bottom:2px solid var(--fg,#182230);margin:1em 1em 1.4em;padding-bottom:1.4em}.settings_tab-switcher .setting-item>div{margin-bottom:.5em}.settings_tab-switcher .setting-item>div:last-child{margin-bottom:0}.settings_tab-switcher .setting-item:last-child{border-bottom:none;padding-bottom:0;margin-bottom:1em}.settings_tab-switcher .setting-item select{min-width:10em}.settings_tab-switcher .setting-item textarea{width:100%;max-width:100%;height:100px}.settings_tab-switcher .setting-item .unavailable,.settings_tab-switcher .setting-item .unavailable i{color:var(--cRed,red);color:red}.settings_tab-switcher .setting-item .number-input{max-width:6em}\", \"\"]);\n\n// exports\n","// style-loader: Adds some css to the DOM by adding a \n\n\n\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./color_input.scss\")\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=1!./color_input.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./color_input.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./color_input.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-77e407b6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./color_input.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"color-input style-control\",class:{ disabled: !_vm.present || _vm.disabled }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.name}},[_vm._v(\"\\n \"+_vm._s(_vm.label)+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined' && _vm.showOptionalTickbox)?_c('Checkbox',{staticClass:\"opt\",attrs:{\"checked\":_vm.present,\"disabled\":_vm.disabled},on:{\"change\":function($event){return _vm.$emit('input', typeof _vm.value === 'undefined' ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"input color-input-field\"},[_c('input',{staticClass:\"textColor unstyled\",attrs:{\"id\":_vm.name + '-t',\"type\":\"text\",\"disabled\":!_vm.present || _vm.disabled},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}}),_vm._v(\" \"),(_vm.validColor)?_c('input',{staticClass:\"nativeColor unstyled\",attrs:{\"id\":_vm.name,\"type\":\"color\",\"disabled\":!_vm.present || _vm.disabled},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}}):_vm._e(),_vm._v(\" \"),(_vm.transparentColor)?_c('div',{staticClass:\"transparentIndicator\"}):_vm._e(),_vm._v(\" \"),(_vm.computedColor)?_c('div',{staticClass:\"computedIndicator\",style:({backgroundColor: _vm.fallback})}):_vm._e()])],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./range_input.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./range_input.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6a3c1a26\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./range_input.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"range-control style-control\",class:{ disabled: !_vm.present || _vm.disabled }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.name}},[_vm._v(\"\\n \"+_vm._s(_vm.label)+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('input',{staticClass:\"opt\",attrs:{\"id\":_vm.name + '-o',\"type\":\"checkbox\"},domProps:{\"checked\":_vm.present},on:{\"input\":function($event){return _vm.$emit('input', !_vm.present ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('label',{staticClass:\"opt-l\",attrs:{\"for\":_vm.name + '-o'}}):_vm._e(),_vm._v(\" \"),_c('input',{staticClass:\"input-number\",attrs:{\"id\":_vm.name,\"type\":\"range\",\"disabled\":!_vm.present || _vm.disabled,\"max\":_vm.max || _vm.hardMax || 100,\"min\":_vm.min || _vm.hardMin || 0,\"step\":_vm.step || 1},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}}),_vm._v(\" \"),_c('input',{staticClass:\"input-number\",attrs:{\"id\":_vm.name,\"type\":\"number\",\"disabled\":!_vm.present || _vm.disabled,\"max\":_vm.hardMax,\"min\":_vm.hardMin,\"step\":_vm.step || 1},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}})])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n","/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./opacity_input.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./opacity_input.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3b48fa39\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./opacity_input.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"opacity-control style-control\",class:{ disabled: !_vm.present || _vm.disabled }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.name}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.common.opacity'))+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('Checkbox',{staticClass:\"opt\",attrs:{\"checked\":_vm.present,\"disabled\":_vm.disabled},on:{\"change\":function($event){return _vm.$emit('input', !_vm.present ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),_c('input',{staticClass:\"input-number\",attrs:{\"id\":_vm.name,\"type\":\"number\",\"disabled\":!_vm.present || _vm.disabled,\"max\":\"1\",\"min\":\"0\",\"step\":\".05\"},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}})],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import ColorInput from '../color_input/color_input.vue'\nimport OpacityInput from '../opacity_input/opacity_input.vue'\nimport { getCssShadow } from '../../services/style_setter/style_setter.js'\nimport { hex2rgb } from '../../services/color_convert/color_convert.js'\n\nconst toModel = (object = {}) => ({\n x: 0,\n y: 0,\n blur: 0,\n spread: 0,\n inset: false,\n color: '#000000',\n alpha: 1,\n ...object\n})\n\nexport default {\n // 'Value' and 'Fallback' can be undefined, but if they are\n // initially vue won't detect it when they become something else\n // therefore i'm using \"ready\" which should be passed as true when\n // data becomes available\n props: [\n 'value', 'fallback', 'ready'\n ],\n data () {\n return {\n selectedId: 0,\n // TODO there are some bugs regarding display of array (it's not getting updated when deleting for some reason)\n cValue: (this.value || this.fallback || []).map(toModel)\n }\n },\n components: {\n ColorInput,\n OpacityInput\n },\n methods: {\n add () {\n this.cValue.push(toModel(this.selected))\n this.selectedId = this.cValue.length - 1\n },\n del () {\n this.cValue.splice(this.selectedId, 1)\n this.selectedId = this.cValue.length === 0 ? undefined : Math.max(this.selectedId - 1, 0)\n },\n moveUp () {\n const movable = this.cValue.splice(this.selectedId, 1)[0]\n this.cValue.splice(this.selectedId - 1, 0, movable)\n this.selectedId -= 1\n },\n moveDn () {\n const movable = this.cValue.splice(this.selectedId, 1)[0]\n this.cValue.splice(this.selectedId + 1, 0, movable)\n this.selectedId += 1\n }\n },\n beforeUpdate () {\n this.cValue = this.value || this.fallback\n },\n computed: {\n anyShadows () {\n return this.cValue.length > 0\n },\n anyShadowsFallback () {\n return this.fallback.length > 0\n },\n selected () {\n if (this.ready && this.anyShadows) {\n return this.cValue[this.selectedId]\n } else {\n return toModel({})\n }\n },\n currentFallback () {\n if (this.ready && this.anyShadowsFallback) {\n return this.fallback[this.selectedId]\n } else {\n return toModel({})\n }\n },\n moveUpValid () {\n return this.ready && this.selectedId > 0\n },\n moveDnValid () {\n return this.ready && this.selectedId < this.cValue.length - 1\n },\n present () {\n return this.ready &&\n typeof this.cValue[this.selectedId] !== 'undefined' &&\n !this.usingFallback\n },\n usingFallback () {\n return typeof this.value === 'undefined'\n },\n rgb () {\n return hex2rgb(this.selected.color)\n },\n style () {\n return this.ready ? {\n boxShadow: getCssShadow(this.fallback)\n } : {}\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./shadow_control.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./shadow_control.js\"\nimport __vue_script__ from \"!!babel-loader!./shadow_control.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5c532734\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./shadow_control.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"shadow-control\",class:{ disabled: !_vm.present }},[_c('div',{staticClass:\"shadow-preview-container\"},[_c('div',{staticClass:\"y-shift-control\",attrs:{\"disabled\":!_vm.present}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.y),expression:\"selected.y\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\"},domProps:{\"value\":(_vm.selected.y)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"y\", $event.target.value)}}}),_vm._v(\" \"),_c('div',{staticClass:\"wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.y),expression:\"selected.y\"}],staticClass:\"input-range\",attrs:{\"disabled\":!_vm.present,\"type\":\"range\",\"max\":\"20\",\"min\":\"-20\"},domProps:{\"value\":(_vm.selected.y)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"y\", $event.target.value)}}})])]),_vm._v(\" \"),_c('div',{staticClass:\"preview-window\"},[_c('div',{staticClass:\"preview-block\",style:(_vm.style)})]),_vm._v(\" \"),_c('div',{staticClass:\"x-shift-control\",attrs:{\"disabled\":!_vm.present}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.x),expression:\"selected.x\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\"},domProps:{\"value\":(_vm.selected.x)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"x\", $event.target.value)}}}),_vm._v(\" \"),_c('div',{staticClass:\"wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.x),expression:\"selected.x\"}],staticClass:\"input-range\",attrs:{\"disabled\":!_vm.present,\"type\":\"range\",\"max\":\"20\",\"min\":\"-20\"},domProps:{\"value\":(_vm.selected.x)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"x\", $event.target.value)}}})])])]),_vm._v(\" \"),_c('div',{staticClass:\"shadow-tweak\"},[_c('div',{staticClass:\"id-control style-control\",attrs:{\"disabled\":_vm.usingFallback}},[_c('label',{staticClass:\"select\",attrs:{\"for\":\"shadow-switcher\",\"disabled\":!_vm.ready || _vm.usingFallback}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedId),expression:\"selectedId\"}],staticClass:\"shadow-switcher\",attrs:{\"id\":\"shadow-switcher\",\"disabled\":!_vm.ready || _vm.usingFallback},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.selectedId=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.cValue),function(shadow,index){return _c('option',{key:index,domProps:{\"value\":index}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.shadow_id', { value: index }))+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":!_vm.ready || !_vm.present},on:{\"click\":_vm.del}},[_c('i',{staticClass:\"icon-cancel\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":!_vm.moveUpValid},on:{\"click\":_vm.moveUp}},[_c('i',{staticClass:\"icon-up-open\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":!_vm.moveDnValid},on:{\"click\":_vm.moveDn}},[_c('i',{staticClass:\"icon-down-open\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":_vm.usingFallback},on:{\"click\":_vm.add}},[_c('i',{staticClass:\"icon-plus\"})])]),_vm._v(\" \"),_c('div',{staticClass:\"inset-control style-control\",attrs:{\"disabled\":!_vm.present}},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"inset\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.inset'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.inset),expression:\"selected.inset\"}],staticClass:\"input-inset\",attrs:{\"id\":\"inset\",\"disabled\":!_vm.present,\"name\":\"inset\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.selected.inset)?_vm._i(_vm.selected.inset,null)>-1:(_vm.selected.inset)},on:{\"change\":function($event){var $$a=_vm.selected.inset,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.selected, \"inset\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.selected, \"inset\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.selected, \"inset\", $$c)}}}}),_vm._v(\" \"),_c('label',{staticClass:\"checkbox-label\",attrs:{\"for\":\"inset\"}})]),_vm._v(\" \"),_c('div',{staticClass:\"blur-control style-control\",attrs:{\"disabled\":!_vm.present}},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"spread\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.blur'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.blur),expression:\"selected.blur\"}],staticClass:\"input-range\",attrs:{\"id\":\"blur\",\"disabled\":!_vm.present,\"name\":\"blur\",\"type\":\"range\",\"max\":\"20\",\"min\":\"0\"},domProps:{\"value\":(_vm.selected.blur)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"blur\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.blur),expression:\"selected.blur\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\",\"min\":\"0\"},domProps:{\"value\":(_vm.selected.blur)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"blur\", $event.target.value)}}})]),_vm._v(\" \"),_c('div',{staticClass:\"spread-control style-control\",attrs:{\"disabled\":!_vm.present}},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"spread\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.spread'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.spread),expression:\"selected.spread\"}],staticClass:\"input-range\",attrs:{\"id\":\"spread\",\"disabled\":!_vm.present,\"name\":\"spread\",\"type\":\"range\",\"max\":\"20\",\"min\":\"-20\"},domProps:{\"value\":(_vm.selected.spread)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"spread\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.spread),expression:\"selected.spread\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\"},domProps:{\"value\":(_vm.selected.spread)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"spread\", $event.target.value)}}})]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"disabled\":!_vm.present,\"label\":_vm.$t('settings.style.common.color'),\"fallback\":_vm.currentFallback.color,\"show-optional-tickbox\":false,\"name\":\"shadow\"},model:{value:(_vm.selected.color),callback:function ($$v) {_vm.$set(_vm.selected, \"color\", $$v)},expression:\"selected.color\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"disabled\":!_vm.present},model:{value:(_vm.selected.alpha),callback:function ($$v) {_vm.$set(_vm.selected, \"alpha\", $$v)},expression:\"selected.alpha\"}}),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.shadows.hintV3\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"--variable,mod\")])])],1)])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { set } from 'vue'\n\nexport default {\n props: [\n 'name', 'label', 'value', 'fallback', 'options', 'no-inherit'\n ],\n data () {\n return {\n lValue: this.value,\n availableOptions: [\n this.noInherit ? '' : 'inherit',\n 'custom',\n ...(this.options || []),\n 'serif',\n 'monospace',\n 'sans-serif'\n ].filter(_ => _)\n }\n },\n beforeUpdate () {\n this.lValue = this.value\n },\n computed: {\n present () {\n return typeof this.lValue !== 'undefined'\n },\n dValue () {\n return this.lValue || this.fallback || {}\n },\n family: {\n get () {\n return this.dValue.family\n },\n set (v) {\n set(this.lValue, 'family', v)\n this.$emit('input', this.lValue)\n }\n },\n isCustom () {\n return this.preset === 'custom'\n },\n preset: {\n get () {\n if (this.family === 'serif' ||\n this.family === 'sans-serif' ||\n this.family === 'monospace' ||\n this.family === 'inherit') {\n return this.family\n } else {\n return 'custom'\n }\n },\n set (v) {\n this.family = v === 'custom' ? '' : v\n }\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./font_control.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./font_control.js\"\nimport __vue_script__ from \"!!babel-loader!./font_control.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-0edf8dfc\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./font_control.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"font-control style-control\",class:{ custom: _vm.isCustom }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.preset === 'custom' ? _vm.name : _vm.name + '-font-switcher'}},[_vm._v(\"\\n \"+_vm._s(_vm.label)+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('input',{staticClass:\"opt exlcude-disabled\",attrs:{\"id\":_vm.name + '-o',\"type\":\"checkbox\"},domProps:{\"checked\":_vm.present},on:{\"input\":function($event){return _vm.$emit('input', typeof _vm.value === 'undefined' ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('label',{staticClass:\"opt-l\",attrs:{\"for\":_vm.name + '-o'}}):_vm._e(),_vm._v(\" \"),_c('label',{staticClass:\"select\",attrs:{\"for\":_vm.name + '-font-switcher',\"disabled\":!_vm.present}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.preset),expression:\"preset\"}],staticClass:\"font-switcher\",attrs:{\"id\":_vm.name + '-font-switcher',\"disabled\":!_vm.present},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.preset=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.availableOptions),function(option){return _c('option',{key:option,domProps:{\"value\":option}},[_vm._v(\"\\n \"+_vm._s(option === 'custom' ? _vm.$t('settings.style.fonts.custom') : option)+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})]),_vm._v(\" \"),(_vm.isCustom)?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.family),expression:\"family\"}],staticClass:\"custom-font\",attrs:{\"id\":_vm.name,\"type\":\"text\"},domProps:{\"value\":(_vm.family)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.family=$event.target.value}}}):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n\n\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./contrast_ratio.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./contrast_ratio.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./contrast_ratio.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-2507acc6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./contrast_ratio.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.contrast)?_c('span',{staticClass:\"contrast-ratio\"},[_c('span',{staticClass:\"rating\",attrs:{\"title\":_vm.hint}},[(_vm.contrast.aaa)?_c('span',[_c('i',{staticClass:\"icon-thumbs-up-alt\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.aaa && _vm.contrast.aa)?_c('span',[_c('i',{staticClass:\"icon-adjust\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.aaa && !_vm.contrast.aa)?_c('span',[_c('i',{staticClass:\"icon-attention\"})]):_vm._e()]),_vm._v(\" \"),(_vm.contrast && _vm.large)?_c('span',{staticClass:\"rating\",attrs:{\"title\":_vm.hint_18pt}},[(_vm.contrast.laaa)?_c('span',[_c('i',{staticClass:\"icon-thumbs-up-alt\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.laaa && _vm.contrast.laa)?_c('span',[_c('i',{staticClass:\"icon-adjust\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.laaa && !_vm.contrast.laa)?_c('span',[_c('i',{staticClass:\"icon-attention\"})]):_vm._e()]):_vm._e()]):_vm._e()}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n\n\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./export_import.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./export_import.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./export_import.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3d9b5a74\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./export_import.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"import-export-container\"},[_vm._t(\"before\"),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.exportData}},[_vm._v(\"\\n \"+_vm._s(_vm.exportLabel)+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.importData}},[_vm._v(\"\\n \"+_vm._s(_vm.importLabel)+\"\\n \")]),_vm._v(\" \"),_vm._t(\"afterButtons\"),_vm._v(\" \"),(_vm.importFailed)?_c('p',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.importFailedText)+\"\\n \")]):_vm._e(),_vm._v(\" \"),_vm._t(\"afterError\")],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./preview.vue\")\n}\n/* script */\nvar __vue_script__ = null\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1a88be74\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./preview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"preview-container\"},[_c('div',{staticClass:\"underlay underlay-preview\"}),_vm._v(\" \"),_c('div',{staticClass:\"panel dummy\"},[_c('div',{staticClass:\"panel-heading\"},[_c('div',{staticClass:\"title\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.header'))+\"\\n \"),_c('span',{staticClass:\"badge badge-notification\"},[_vm._v(\"\\n 99\\n \")])]),_vm._v(\" \"),_c('span',{staticClass:\"faint\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.header_faint'))+\"\\n \")]),_vm._v(\" \"),_c('span',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.error'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.button'))+\"\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"panel-body theme-preview-content\"},[_c('div',{staticClass:\"post\"},[_c('div',{staticClass:\"avatar still-image\"},[_vm._v(\"\\n ( ͡° ͜ʖ ͡°)\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"content\"},[_c('h4',[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.content'))+\"\\n \")]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.preview.text\"}},[_c('code',{staticStyle:{\"font-family\":\"var(--postCodeFont)\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.mono'))+\"\\n \")]),_vm._v(\" \"),_c('a',{staticStyle:{\"color\":\"var(--link)\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.link'))+\"\\n \")])]),_vm._v(\" \"),_vm._m(0)],1)]),_vm._v(\" \"),_c('div',{staticClass:\"after-post\"},[_c('div',{staticClass:\"avatar-alt\"},[_vm._v(\"\\n :^)\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"content\"},[_c('i18n',{staticClass:\"faint\",attrs:{\"path\":\"settings.style.preview.fine_print\",\"tag\":\"span\"}},[_c('a',{staticStyle:{\"color\":\"var(--faintLink)\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.faint_link'))+\"\\n \")])])],1)]),_vm._v(\" \"),_c('div',{staticClass:\"separator\"}),_vm._v(\" \"),_c('span',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.error'))+\"\\n \")]),_vm._v(\" \"),_c('input',{attrs:{\"type\":\"text\"},domProps:{\"value\":_vm.$t('settings.style.preview.input')}}),_vm._v(\" \"),_c('div',{staticClass:\"actions\"},[_c('span',{staticClass:\"checkbox\"},[_c('input',{attrs:{\"id\":\"preview_checkbox\",\"checked\":\"very yes\",\"type\":\"checkbox\"}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"preview_checkbox\"}},[_vm._v(_vm._s(_vm.$t('settings.style.preview.checkbox')))])]),_vm._v(\" \"),_c('button',{staticClass:\"btn\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.button'))+\"\\n \")])])])])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"icons\"},[_c('i',{staticClass:\"button-icon icon-reply\",staticStyle:{\"color\":\"var(--cBlue)\"}}),_vm._v(\" \"),_c('i',{staticClass:\"button-icon icon-retweet\",staticStyle:{\"color\":\"var(--cGreen)\"}}),_vm._v(\" \"),_c('i',{staticClass:\"button-icon icon-star\",staticStyle:{\"color\":\"var(--cOrange)\"}}),_vm._v(\" \"),_c('i',{staticClass:\"button-icon icon-cancel\",staticStyle:{\"color\":\"var(--cRed)\"}})])}]\nexport { render, staticRenderFns }","import { set, delete as del } from 'vue'\nimport {\n rgb2hex,\n hex2rgb,\n getContrastRatioLayers\n} from 'src/services/color_convert/color_convert.js'\nimport {\n DEFAULT_SHADOWS,\n generateColors,\n generateShadows,\n generateRadii,\n generateFonts,\n composePreset,\n getThemes,\n shadows2to3,\n colors2to3\n} from 'src/services/style_setter/style_setter.js'\nimport {\n SLOT_INHERITANCE\n} from 'src/services/theme_data/pleromafe.js'\nimport {\n CURRENT_VERSION,\n OPACITIES,\n getLayers,\n getOpacitySlot\n} from 'src/services/theme_data/theme_data.service.js'\nimport ColorInput from 'src/components/color_input/color_input.vue'\nimport RangeInput from 'src/components/range_input/range_input.vue'\nimport OpacityInput from 'src/components/opacity_input/opacity_input.vue'\nimport ShadowControl from 'src/components/shadow_control/shadow_control.vue'\nimport FontControl from 'src/components/font_control/font_control.vue'\nimport ContrastRatio from 'src/components/contrast_ratio/contrast_ratio.vue'\nimport TabSwitcher from 'src/components/tab_switcher/tab_switcher.js'\nimport ExportImport from 'src/components/export_import/export_import.vue'\nimport Checkbox from 'src/components/checkbox/checkbox.vue'\n\nimport Preview from './preview.vue'\n\n// List of color values used in v1\nconst v1OnlyNames = [\n 'bg',\n 'fg',\n 'text',\n 'link',\n 'cRed',\n 'cGreen',\n 'cBlue',\n 'cOrange'\n].map(_ => _ + 'ColorLocal')\n\nconst colorConvert = (color) => {\n if (color.startsWith('--') || color === 'transparent') {\n return color\n } else {\n return hex2rgb(color)\n }\n}\n\nexport default {\n data () {\n return {\n availableStyles: [],\n selected: this.$store.getters.mergedConfig.theme,\n themeWarning: undefined,\n tempImportFile: undefined,\n engineVersion: 0,\n\n previewShadows: {},\n previewColors: {},\n previewRadii: {},\n previewFonts: {},\n\n shadowsInvalid: true,\n colorsInvalid: true,\n radiiInvalid: true,\n\n keepColor: false,\n keepShadows: false,\n keepOpacity: false,\n keepRoundness: false,\n keepFonts: false,\n\n ...Object.keys(SLOT_INHERITANCE)\n .map(key => [key, ''])\n .reduce((acc, [key, val]) => ({ ...acc, [ key + 'ColorLocal' ]: val }), {}),\n\n ...Object.keys(OPACITIES)\n .map(key => [key, ''])\n .reduce((acc, [key, val]) => ({ ...acc, [ key + 'OpacityLocal' ]: val }), {}),\n\n shadowSelected: undefined,\n shadowsLocal: {},\n fontsLocal: {},\n\n btnRadiusLocal: '',\n inputRadiusLocal: '',\n checkboxRadiusLocal: '',\n panelRadiusLocal: '',\n avatarRadiusLocal: '',\n avatarAltRadiusLocal: '',\n attachmentRadiusLocal: '',\n tooltipRadiusLocal: '',\n chatMessageRadiusLocal: ''\n }\n },\n created () {\n const self = this\n\n getThemes()\n .then((promises) => {\n return Promise.all(\n Object.entries(promises)\n .map(([k, v]) => v.then(res => [k, res]))\n )\n })\n .then(themes => themes.reduce((acc, [k, v]) => {\n if (v) {\n return {\n ...acc,\n [k]: v\n }\n } else {\n return acc\n }\n }, {}))\n .then((themesComplete) => {\n self.availableStyles = themesComplete\n })\n },\n mounted () {\n this.loadThemeFromLocalStorage()\n if (typeof this.shadowSelected === 'undefined') {\n this.shadowSelected = this.shadowsAvailable[0]\n }\n },\n computed: {\n themeWarningHelp () {\n if (!this.themeWarning) return\n const t = this.$t\n const pre = 'settings.style.switcher.help.'\n const {\n origin,\n themeEngineVersion,\n type,\n noActionsPossible\n } = this.themeWarning\n if (origin === 'file') {\n // Loaded v2 theme from file\n if (themeEngineVersion === 2 && type === 'wrong_version') {\n return t(pre + 'v2_imported')\n }\n if (themeEngineVersion > CURRENT_VERSION) {\n return t(pre + 'future_version_imported') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'snapshot_missing')\n : t(pre + 'snapshot_present')\n )\n }\n if (themeEngineVersion < CURRENT_VERSION) {\n return t(pre + 'future_version_imported') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'snapshot_missing')\n : t(pre + 'snapshot_present')\n )\n }\n } else if (origin === 'localStorage') {\n if (type === 'snapshot_source_mismatch') {\n return t(pre + 'snapshot_source_mismatch')\n }\n // FE upgraded from v2\n if (themeEngineVersion === 2) {\n return t(pre + 'upgraded_from_v2')\n }\n // Admin downgraded FE\n if (themeEngineVersion > CURRENT_VERSION) {\n return t(pre + 'fe_downgraded') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'migration_snapshot_ok')\n : t(pre + 'migration_snapshot_gone')\n )\n }\n // Admin upgraded FE\n if (themeEngineVersion < CURRENT_VERSION) {\n return t(pre + 'fe_upgraded') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'migration_snapshot_ok')\n : t(pre + 'migration_snapshot_gone')\n )\n }\n }\n },\n selectedVersion () {\n return Array.isArray(this.selected) ? 1 : 2\n },\n currentColors () {\n return Object.keys(SLOT_INHERITANCE)\n .map(key => [key, this[key + 'ColorLocal']])\n .reduce((acc, [key, val]) => ({ ...acc, [ key ]: val }), {})\n },\n currentOpacity () {\n return Object.keys(OPACITIES)\n .map(key => [key, this[key + 'OpacityLocal']])\n .reduce((acc, [key, val]) => ({ ...acc, [ key ]: val }), {})\n },\n currentRadii () {\n return {\n btn: this.btnRadiusLocal,\n input: this.inputRadiusLocal,\n checkbox: this.checkboxRadiusLocal,\n panel: this.panelRadiusLocal,\n avatar: this.avatarRadiusLocal,\n avatarAlt: this.avatarAltRadiusLocal,\n tooltip: this.tooltipRadiusLocal,\n attachment: this.attachmentRadiusLocal,\n chatMessage: this.chatMessageRadiusLocal\n }\n },\n preview () {\n return composePreset(this.previewColors, this.previewRadii, this.previewShadows, this.previewFonts)\n },\n previewTheme () {\n if (!this.preview.theme.colors) return { colors: {}, opacity: {}, radii: {}, shadows: {}, fonts: {} }\n return this.preview.theme\n },\n // This needs optimization maybe\n previewContrast () {\n try {\n if (!this.previewTheme.colors.bg) return {}\n const colors = this.previewTheme.colors\n const opacity = this.previewTheme.opacity\n if (!colors.bg) return {}\n const hints = (ratio) => ({\n text: ratio.toPrecision(3) + ':1',\n // AA level, AAA level\n aa: ratio >= 4.5,\n aaa: ratio >= 7,\n // same but for 18pt+ texts\n laa: ratio >= 3,\n laaa: ratio >= 4.5\n })\n const colorsConverted = Object.entries(colors).reduce((acc, [key, value]) => ({ ...acc, [key]: colorConvert(value) }), {})\n\n const ratios = Object.entries(SLOT_INHERITANCE).reduce((acc, [key, value]) => {\n const slotIsBaseText = key === 'text' || key === 'link'\n const slotIsText = slotIsBaseText || (\n typeof value === 'object' && value !== null && value.textColor\n )\n if (!slotIsText) return acc\n const { layer, variant } = slotIsBaseText ? { layer: 'bg' } : value\n const background = variant || layer\n const opacitySlot = getOpacitySlot(background)\n const textColors = [\n key,\n ...(background === 'bg' ? ['cRed', 'cGreen', 'cBlue', 'cOrange'] : [])\n ]\n\n const layers = getLayers(\n layer,\n variant || layer,\n opacitySlot,\n colorsConverted,\n opacity\n )\n\n return {\n ...acc,\n ...textColors.reduce((acc, textColorKey) => {\n const newKey = slotIsBaseText\n ? 'bg' + textColorKey[0].toUpperCase() + textColorKey.slice(1)\n : textColorKey\n return {\n ...acc,\n [newKey]: getContrastRatioLayers(\n colorsConverted[textColorKey],\n layers,\n colorsConverted[textColorKey]\n )\n }\n }, {})\n }\n }, {})\n\n return Object.entries(ratios).reduce((acc, [k, v]) => { acc[k] = hints(v); return acc }, {})\n } catch (e) {\n console.warn('Failure computing contrasts', e)\n }\n },\n previewRules () {\n if (!this.preview.rules) return ''\n return [\n ...Object.values(this.preview.rules),\n 'color: var(--text)',\n 'font-family: var(--interfaceFont, sans-serif)'\n ].join(';')\n },\n shadowsAvailable () {\n return Object.keys(DEFAULT_SHADOWS).sort()\n },\n currentShadowOverriden: {\n get () {\n return !!this.currentShadow\n },\n set (val) {\n if (val) {\n set(this.shadowsLocal, this.shadowSelected, this.currentShadowFallback.map(_ => Object.assign({}, _)))\n } else {\n del(this.shadowsLocal, this.shadowSelected)\n }\n }\n },\n currentShadowFallback () {\n return (this.previewTheme.shadows || {})[this.shadowSelected]\n },\n currentShadow: {\n get () {\n return this.shadowsLocal[this.shadowSelected]\n },\n set (v) {\n set(this.shadowsLocal, this.shadowSelected, v)\n }\n },\n themeValid () {\n return !this.shadowsInvalid && !this.colorsInvalid && !this.radiiInvalid\n },\n exportedTheme () {\n const saveEverything = (\n !this.keepFonts &&\n !this.keepShadows &&\n !this.keepOpacity &&\n !this.keepRoundness &&\n !this.keepColor\n )\n\n const source = {\n themeEngineVersion: CURRENT_VERSION\n }\n\n if (this.keepFonts || saveEverything) {\n source.fonts = this.fontsLocal\n }\n if (this.keepShadows || saveEverything) {\n source.shadows = this.shadowsLocal\n }\n if (this.keepOpacity || saveEverything) {\n source.opacity = this.currentOpacity\n }\n if (this.keepColor || saveEverything) {\n source.colors = this.currentColors\n }\n if (this.keepRoundness || saveEverything) {\n source.radii = this.currentRadii\n }\n\n const theme = {\n themeEngineVersion: CURRENT_VERSION,\n ...this.previewTheme\n }\n\n return {\n // To separate from other random JSON files and possible future source formats\n _pleroma_theme_version: 2, theme, source\n }\n }\n },\n components: {\n ColorInput,\n OpacityInput,\n RangeInput,\n ContrastRatio,\n ShadowControl,\n FontControl,\n TabSwitcher,\n Preview,\n ExportImport,\n Checkbox\n },\n methods: {\n loadTheme (\n {\n theme,\n source,\n _pleroma_theme_version: fileVersion\n },\n origin,\n forceUseSource = false\n ) {\n this.dismissWarning()\n if (!source && !theme) {\n throw new Error('Can\\'t load theme: empty')\n }\n const version = (origin === 'localStorage' && !theme.colors)\n ? 'l1'\n : fileVersion\n const snapshotEngineVersion = (theme || {}).themeEngineVersion\n const themeEngineVersion = (source || {}).themeEngineVersion || 2\n const versionsMatch = themeEngineVersion === CURRENT_VERSION\n const sourceSnapshotMismatch = (\n theme !== undefined &&\n source !== undefined &&\n themeEngineVersion !== snapshotEngineVersion\n )\n // Force loading of source if user requested it or if snapshot\n // is unavailable\n const forcedSourceLoad = (source && forceUseSource) || !theme\n if (!(versionsMatch && !sourceSnapshotMismatch) &&\n !forcedSourceLoad &&\n version !== 'l1' &&\n origin !== 'defaults'\n ) {\n if (sourceSnapshotMismatch && origin === 'localStorage') {\n this.themeWarning = {\n origin,\n themeEngineVersion,\n type: 'snapshot_source_mismatch'\n }\n } else if (!theme) {\n this.themeWarning = {\n origin,\n noActionsPossible: true,\n themeEngineVersion,\n type: 'no_snapshot_old_version'\n }\n } else if (!versionsMatch) {\n this.themeWarning = {\n origin,\n noActionsPossible: !source,\n themeEngineVersion,\n type: 'wrong_version'\n }\n }\n }\n this.normalizeLocalState(theme, version, source, forcedSourceLoad)\n },\n forceLoadLocalStorage () {\n this.loadThemeFromLocalStorage(true)\n },\n dismissWarning () {\n this.themeWarning = undefined\n this.tempImportFile = undefined\n },\n forceLoad () {\n const { origin } = this.themeWarning\n switch (origin) {\n case 'localStorage':\n this.loadThemeFromLocalStorage(true)\n break\n case 'file':\n this.onImport(this.tempImportFile, true)\n break\n }\n this.dismissWarning()\n },\n forceSnapshot () {\n const { origin } = this.themeWarning\n switch (origin) {\n case 'localStorage':\n this.loadThemeFromLocalStorage(false, true)\n break\n case 'file':\n console.err('Forcing snapshout from file is not supported yet')\n break\n }\n this.dismissWarning()\n },\n loadThemeFromLocalStorage (confirmLoadSource = false, forceSnapshot = false) {\n const {\n customTheme: theme,\n customThemeSource: source\n } = this.$store.getters.mergedConfig\n if (!theme && !source) {\n // Anon user or never touched themes\n this.loadTheme(\n this.$store.state.instance.themeData,\n 'defaults',\n confirmLoadSource\n )\n } else {\n this.loadTheme(\n {\n theme,\n source: forceSnapshot ? theme : source\n },\n 'localStorage',\n confirmLoadSource\n )\n }\n },\n setCustomTheme () {\n this.$store.dispatch('setOption', {\n name: 'customTheme',\n value: {\n themeEngineVersion: CURRENT_VERSION,\n ...this.previewTheme\n }\n })\n this.$store.dispatch('setOption', {\n name: 'customThemeSource',\n value: {\n themeEngineVersion: CURRENT_VERSION,\n shadows: this.shadowsLocal,\n fonts: this.fontsLocal,\n opacity: this.currentOpacity,\n colors: this.currentColors,\n radii: this.currentRadii\n }\n })\n },\n updatePreviewColorsAndShadows () {\n this.previewColors = generateColors({\n opacity: this.currentOpacity,\n colors: this.currentColors\n })\n this.previewShadows = generateShadows(\n { shadows: this.shadowsLocal, opacity: this.previewTheme.opacity, themeEngineVersion: this.engineVersion },\n this.previewColors.theme.colors,\n this.previewColors.mod\n )\n },\n onImport (parsed, forceSource = false) {\n this.tempImportFile = parsed\n this.loadTheme(parsed, 'file', forceSource)\n },\n importValidator (parsed) {\n const version = parsed._pleroma_theme_version\n return version >= 1 || version <= 2\n },\n clearAll () {\n this.loadThemeFromLocalStorage()\n },\n\n // Clears all the extra stuff when loading V1 theme\n clearV1 () {\n Object.keys(this.$data)\n .filter(_ => _.endsWith('ColorLocal') || _.endsWith('OpacityLocal'))\n .filter(_ => !v1OnlyNames.includes(_))\n .forEach(key => {\n set(this.$data, key, undefined)\n })\n },\n\n clearRoundness () {\n Object.keys(this.$data)\n .filter(_ => _.endsWith('RadiusLocal'))\n .forEach(key => {\n set(this.$data, key, undefined)\n })\n },\n\n clearOpacity () {\n Object.keys(this.$data)\n .filter(_ => _.endsWith('OpacityLocal'))\n .forEach(key => {\n set(this.$data, key, undefined)\n })\n },\n\n clearShadows () {\n this.shadowsLocal = {}\n },\n\n clearFonts () {\n this.fontsLocal = {}\n },\n\n /**\n * This applies stored theme data onto form. Supports three versions of data:\n * v3 (version >= 3) - newest version of themes which supports snapshots for better compatiblity\n * v2 (version = 2) - newer version of themes.\n * v1 (version = 1) - older version of themes (import from file)\n * v1l (version = l1) - older version of theme (load from local storage)\n * v1 and v1l differ because of way themes were stored/exported.\n * @param {Object} theme - theme data (snapshot)\n * @param {Number} version - version of data. 0 means try to guess based on data. \"l1\" means v1, locastorage type\n * @param {Object} source - theme source - this will be used if compatible\n * @param {Boolean} source - by default source won't be used if version doesn't match since it might render differently\n * this allows importing source anyway\n */\n normalizeLocalState (theme, version = 0, source, forceSource = false) {\n let input\n if (typeof source !== 'undefined') {\n if (forceSource || source.themeEngineVersion === CURRENT_VERSION) {\n input = source\n version = source.themeEngineVersion\n } else {\n input = theme\n }\n } else {\n input = theme\n }\n\n const radii = input.radii || input\n const opacity = input.opacity\n const shadows = input.shadows || {}\n const fonts = input.fonts || {}\n const colors = !input.themeEngineVersion\n ? colors2to3(input.colors || input)\n : input.colors || input\n\n if (version === 0) {\n if (input.version) version = input.version\n // Old v1 naming: fg is text, btn is foreground\n if (typeof colors.text === 'undefined' && typeof colors.fg !== 'undefined') {\n version = 1\n }\n // New v2 naming: text is text, fg is foreground\n if (typeof colors.text !== 'undefined' && typeof colors.fg !== 'undefined') {\n version = 2\n }\n }\n\n this.engineVersion = version\n\n // Stuff that differs between V1 and V2\n if (version === 1) {\n this.fgColorLocal = rgb2hex(colors.btn)\n this.textColorLocal = rgb2hex(colors.fg)\n }\n\n if (!this.keepColor) {\n this.clearV1()\n const keys = new Set(version !== 1 ? Object.keys(SLOT_INHERITANCE) : [])\n if (version === 1 || version === 'l1') {\n keys\n .add('bg')\n .add('link')\n .add('cRed')\n .add('cBlue')\n .add('cGreen')\n .add('cOrange')\n }\n\n keys.forEach(key => {\n const color = colors[key]\n const hex = rgb2hex(colors[key])\n this[key + 'ColorLocal'] = hex === '#aN' ? color : hex\n })\n }\n\n if (opacity && !this.keepOpacity) {\n this.clearOpacity()\n Object.entries(opacity).forEach(([k, v]) => {\n if (typeof v === 'undefined' || v === null || Number.isNaN(v)) return\n this[k + 'OpacityLocal'] = v\n })\n }\n\n if (!this.keepRoundness) {\n this.clearRoundness()\n Object.entries(radii).forEach(([k, v]) => {\n // 'Radius' is kept mostly for v1->v2 localstorage transition\n const key = k.endsWith('Radius') ? k.split('Radius')[0] : k\n this[key + 'RadiusLocal'] = v\n })\n }\n\n if (!this.keepShadows) {\n this.clearShadows()\n if (version === 2) {\n this.shadowsLocal = shadows2to3(shadows, this.previewTheme.opacity)\n } else {\n this.shadowsLocal = shadows\n }\n this.shadowSelected = this.shadowsAvailable[0]\n }\n\n if (!this.keepFonts) {\n this.clearFonts()\n this.fontsLocal = fonts\n }\n }\n },\n watch: {\n currentRadii () {\n try {\n this.previewRadii = generateRadii({ radii: this.currentRadii })\n this.radiiInvalid = false\n } catch (e) {\n this.radiiInvalid = true\n console.warn(e)\n }\n },\n shadowsLocal: {\n handler () {\n if (Object.getOwnPropertyNames(this.previewColors).length === 1) return\n try {\n this.updatePreviewColorsAndShadows()\n this.shadowsInvalid = false\n } catch (e) {\n this.shadowsInvalid = true\n console.warn(e)\n }\n },\n deep: true\n },\n fontsLocal: {\n handler () {\n try {\n this.previewFonts = generateFonts({ fonts: this.fontsLocal })\n this.fontsInvalid = false\n } catch (e) {\n this.fontsInvalid = true\n console.warn(e)\n }\n },\n deep: true\n },\n currentColors () {\n try {\n this.updatePreviewColorsAndShadows()\n this.colorsInvalid = false\n this.shadowsInvalid = false\n } catch (e) {\n this.colorsInvalid = true\n this.shadowsInvalid = true\n console.warn(e)\n }\n },\n currentOpacity () {\n try {\n this.updatePreviewColorsAndShadows()\n } catch (e) {\n console.warn(e)\n }\n },\n selected () {\n this.dismissWarning()\n if (this.selectedVersion === 1) {\n if (!this.keepRoundness) {\n this.clearRoundness()\n }\n\n if (!this.keepShadows) {\n this.clearShadows()\n }\n\n if (!this.keepOpacity) {\n this.clearOpacity()\n }\n\n if (!this.keepColor) {\n this.clearV1()\n\n this.bgColorLocal = this.selected[1]\n this.fgColorLocal = this.selected[2]\n this.textColorLocal = this.selected[3]\n this.linkColorLocal = this.selected[4]\n this.cRedColorLocal = this.selected[5]\n this.cGreenColorLocal = this.selected[6]\n this.cBlueColorLocal = this.selected[7]\n this.cOrangeColorLocal = this.selected[8]\n }\n } else if (this.selectedVersion >= 2) {\n this.normalizeLocalState(this.selected.theme, 2, this.selected.source)\n }\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./theme_tab.scss\")\n}\n/* script */\nexport * from \"!!babel-loader!./theme_tab.js\"\nimport __vue_script__ from \"!!babel-loader!./theme_tab.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-af7d0e5c\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./theme_tab.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"theme-tab\"},[_c('div',{staticClass:\"presets-container\"},[_c('div',{staticClass:\"save-load\"},[(_vm.themeWarning)?_c('div',{staticClass:\"theme-warning\"},[_c('div',{staticClass:\"alert warning\"},[_vm._v(\"\\n \"+_vm._s(_vm.themeWarningHelp)+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"buttons\"},[(_vm.themeWarning.type === 'snapshot_source_mismatch')?[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.forceLoad}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.use_source'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.forceSnapshot}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.use_snapshot'))+\"\\n \")])]:(_vm.themeWarning.noActionsPossible)?[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.dismissWarning}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.dismiss'))+\"\\n \")])]:[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.forceLoad}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.load_theme'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.dismissWarning}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_as_is'))+\"\\n \")])]],2)]):_vm._e(),_vm._v(\" \"),_c('ExportImport',{attrs:{\"export-object\":_vm.exportedTheme,\"export-label\":_vm.$t(\"settings.export_theme\"),\"import-label\":_vm.$t(\"settings.import_theme\"),\"import-failed-text\":_vm.$t(\"settings.invalid_theme_imported\"),\"on-import\":_vm.onImport,\"validator\":_vm.importValidator}},[_c('template',{slot:\"before\"},[_c('div',{staticClass:\"presets\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.presets'))+\"\\n \"),_c('label',{staticClass:\"select\",attrs:{\"for\":\"preset-switcher\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected),expression:\"selected\"}],staticClass:\"preset-switcher\",attrs:{\"id\":\"preset-switcher\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.selected=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.availableStyles),function(style){return _c('option',{key:style.name,style:({\n backgroundColor: style[1] || (style.theme || style.source).colors.bg,\n color: style[3] || (style.theme || style.source).colors.text\n }),domProps:{\"value\":style}},[_vm._v(\"\\n \"+_vm._s(style[0] || style.name)+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])])])],2)],1),_vm._v(\" \"),_c('div',{staticClass:\"save-load-options\"},[_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepColor),callback:function ($$v) {_vm.keepColor=$$v},expression:\"keepColor\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_color'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepShadows),callback:function ($$v) {_vm.keepShadows=$$v},expression:\"keepShadows\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_shadows'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepOpacity),callback:function ($$v) {_vm.keepOpacity=$$v},expression:\"keepOpacity\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_opacity'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepRoundness),callback:function ($$v) {_vm.keepRoundness=$$v},expression:\"keepRoundness\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_roundness'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepFonts),callback:function ($$v) {_vm.keepFonts=$$v},expression:\"keepFonts\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_fonts'))+\"\\n \")])],1),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.switcher.save_load_hint')))])])]),_vm._v(\" \"),_c('preview',{style:(_vm.previewRules)}),_vm._v(\" \"),_c('keep-alive',[_c('tab-switcher',{key:\"style-tweak\"},[_c('div',{staticClass:\"color-container\",attrs:{\"label\":_vm.$t('settings.style.common_colors._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help')))]),_vm._v(\" \"),_c('div',{staticClass:\"tab-header-buttons\"},[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearOpacity}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_opacity'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearV1}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])])]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help_v2_1')))]),_vm._v(\" \"),_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.common_colors.main')))]),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"bgColor\",\"label\":_vm.$t('settings.background')},model:{value:(_vm.bgColorLocal),callback:function ($$v) {_vm.bgColorLocal=$$v},expression:\"bgColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"bgOpacity\",\"fallback\":_vm.previewTheme.opacity.bg},model:{value:(_vm.bgOpacityLocal),callback:function ($$v) {_vm.bgOpacityLocal=$$v},expression:\"bgOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"textColor\",\"label\":_vm.$t('settings.text')},model:{value:(_vm.textColorLocal),callback:function ($$v) {_vm.textColorLocal=$$v},expression:\"textColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"accentColor\",\"fallback\":_vm.previewTheme.colors.link,\"label\":_vm.$t('settings.accent'),\"show-optional-tickbox\":typeof _vm.linkColorLocal !== 'undefined'},model:{value:(_vm.accentColorLocal),callback:function ($$v) {_vm.accentColorLocal=$$v},expression:\"accentColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"linkColor\",\"fallback\":_vm.previewTheme.colors.accent,\"label\":_vm.$t('settings.links'),\"show-optional-tickbox\":typeof _vm.accentColorLocal !== 'undefined'},model:{value:(_vm.linkColorLocal),callback:function ($$v) {_vm.linkColorLocal=$$v},expression:\"linkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"fgColor\",\"label\":_vm.$t('settings.foreground')},model:{value:(_vm.fgColorLocal),callback:function ($$v) {_vm.fgColorLocal=$$v},expression:\"fgColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"fgTextColor\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.fgText},model:{value:(_vm.fgTextColorLocal),callback:function ($$v) {_vm.fgTextColorLocal=$$v},expression:\"fgTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"fgLinkColor\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.fgLink},model:{value:(_vm.fgLinkColorLocal),callback:function ($$v) {_vm.fgLinkColorLocal=$$v},expression:\"fgLinkColorLocal\"}}),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.common_colors.foreground_hint')))])],1),_vm._v(\" \"),_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.common_colors.rgbo')))]),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"cRedColor\",\"label\":_vm.$t('settings.cRed')},model:{value:(_vm.cRedColorLocal),callback:function ($$v) {_vm.cRedColorLocal=$$v},expression:\"cRedColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCRed}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"cBlueColor\",\"label\":_vm.$t('settings.cBlue')},model:{value:(_vm.cBlueColorLocal),callback:function ($$v) {_vm.cBlueColorLocal=$$v},expression:\"cBlueColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCBlue}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"cGreenColor\",\"label\":_vm.$t('settings.cGreen')},model:{value:(_vm.cGreenColorLocal),callback:function ($$v) {_vm.cGreenColorLocal=$$v},expression:\"cGreenColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCGreen}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"cOrangeColor\",\"label\":_vm.$t('settings.cOrange')},model:{value:(_vm.cOrangeColorLocal),callback:function ($$v) {_vm.cOrangeColorLocal=$$v},expression:\"cOrangeColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCOrange}})],1),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help_v2_2')))])]),_vm._v(\" \"),_c('div',{staticClass:\"color-container\",attrs:{\"label\":_vm.$t('settings.style.advanced_colors._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help')))]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearOpacity}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_opacity'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearV1}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.post')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"postLinkColor\",\"fallback\":_vm.previewTheme.colors.accent,\"label\":_vm.$t('settings.links')},model:{value:(_vm.postLinkColorLocal),callback:function ($$v) {_vm.postLinkColorLocal=$$v},expression:\"postLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.postLink}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"postGreentextColor\",\"fallback\":_vm.previewTheme.colors.cGreen,\"label\":_vm.$t('settings.greentext')},model:{value:(_vm.postGreentextColorLocal),callback:function ($$v) {_vm.postGreentextColorLocal=$$v},expression:\"postGreentextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.postGreentext}}),_vm._v(\" \"),_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.alert')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertError\",\"label\":_vm.$t('settings.style.advanced_colors.alert_error'),\"fallback\":_vm.previewTheme.colors.alertError},model:{value:(_vm.alertErrorColorLocal),callback:function ($$v) {_vm.alertErrorColorLocal=$$v},expression:\"alertErrorColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertErrorText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.alertErrorText},model:{value:(_vm.alertErrorTextColorLocal),callback:function ($$v) {_vm.alertErrorTextColorLocal=$$v},expression:\"alertErrorTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.alertErrorText,\"large\":\"true\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertWarning\",\"label\":_vm.$t('settings.style.advanced_colors.alert_warning'),\"fallback\":_vm.previewTheme.colors.alertWarning},model:{value:(_vm.alertWarningColorLocal),callback:function ($$v) {_vm.alertWarningColorLocal=$$v},expression:\"alertWarningColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertWarningText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.alertWarningText},model:{value:(_vm.alertWarningTextColorLocal),callback:function ($$v) {_vm.alertWarningTextColorLocal=$$v},expression:\"alertWarningTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.alertWarningText,\"large\":\"true\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertNeutral\",\"label\":_vm.$t('settings.style.advanced_colors.alert_neutral'),\"fallback\":_vm.previewTheme.colors.alertNeutral},model:{value:(_vm.alertNeutralColorLocal),callback:function ($$v) {_vm.alertNeutralColorLocal=$$v},expression:\"alertNeutralColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertNeutralText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.alertNeutralText},model:{value:(_vm.alertNeutralTextColorLocal),callback:function ($$v) {_vm.alertNeutralTextColorLocal=$$v},expression:\"alertNeutralTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.alertNeutralText,\"large\":\"true\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"alertOpacity\",\"fallback\":_vm.previewTheme.opacity.alert},model:{value:(_vm.alertOpacityLocal),callback:function ($$v) {_vm.alertOpacityLocal=$$v},expression:\"alertOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.badge')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"badgeNotification\",\"label\":_vm.$t('settings.style.advanced_colors.badge_notification'),\"fallback\":_vm.previewTheme.colors.badgeNotification},model:{value:(_vm.badgeNotificationColorLocal),callback:function ($$v) {_vm.badgeNotificationColorLocal=$$v},expression:\"badgeNotificationColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"badgeNotificationText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.badgeNotificationText},model:{value:(_vm.badgeNotificationTextColorLocal),callback:function ($$v) {_vm.badgeNotificationTextColorLocal=$$v},expression:\"badgeNotificationTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.badgeNotificationText,\"large\":\"true\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.panel_header')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelColor\",\"fallback\":_vm.previewTheme.colors.panel,\"label\":_vm.$t('settings.background')},model:{value:(_vm.panelColorLocal),callback:function ($$v) {_vm.panelColorLocal=$$v},expression:\"panelColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"panelOpacity\",\"fallback\":_vm.previewTheme.opacity.panel,\"disabled\":_vm.panelColorLocal === 'transparent'},model:{value:(_vm.panelOpacityLocal),callback:function ($$v) {_vm.panelOpacityLocal=$$v},expression:\"panelOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelTextColor\",\"fallback\":_vm.previewTheme.colors.panelText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.panelTextColorLocal),callback:function ($$v) {_vm.panelTextColorLocal=$$v},expression:\"panelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.panelText,\"large\":\"true\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelLinkColor\",\"fallback\":_vm.previewTheme.colors.panelLink,\"label\":_vm.$t('settings.links')},model:{value:(_vm.panelLinkColorLocal),callback:function ($$v) {_vm.panelLinkColorLocal=$$v},expression:\"panelLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.panelLink,\"large\":\"true\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.top_bar')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"topBarColor\",\"fallback\":_vm.previewTheme.colors.topBar,\"label\":_vm.$t('settings.background')},model:{value:(_vm.topBarColorLocal),callback:function ($$v) {_vm.topBarColorLocal=$$v},expression:\"topBarColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"topBarTextColor\",\"fallback\":_vm.previewTheme.colors.topBarText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.topBarTextColorLocal),callback:function ($$v) {_vm.topBarTextColorLocal=$$v},expression:\"topBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.topBarText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"topBarLinkColor\",\"fallback\":_vm.previewTheme.colors.topBarLink,\"label\":_vm.$t('settings.links')},model:{value:(_vm.topBarLinkColorLocal),callback:function ($$v) {_vm.topBarLinkColorLocal=$$v},expression:\"topBarLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.topBarLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.inputs')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"inputColor\",\"fallback\":_vm.previewTheme.colors.input,\"label\":_vm.$t('settings.background')},model:{value:(_vm.inputColorLocal),callback:function ($$v) {_vm.inputColorLocal=$$v},expression:\"inputColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"inputOpacity\",\"fallback\":_vm.previewTheme.opacity.input,\"disabled\":_vm.inputColorLocal === 'transparent'},model:{value:(_vm.inputOpacityLocal),callback:function ($$v) {_vm.inputOpacityLocal=$$v},expression:\"inputOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"inputTextColor\",\"fallback\":_vm.previewTheme.colors.inputText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.inputTextColorLocal),callback:function ($$v) {_vm.inputTextColorLocal=$$v},expression:\"inputTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.inputText}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.buttons')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnColor\",\"fallback\":_vm.previewTheme.colors.btn,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnColorLocal),callback:function ($$v) {_vm.btnColorLocal=$$v},expression:\"btnColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"btnOpacity\",\"fallback\":_vm.previewTheme.opacity.btn,\"disabled\":_vm.btnColorLocal === 'transparent'},model:{value:(_vm.btnOpacityLocal),callback:function ($$v) {_vm.btnOpacityLocal=$$v},expression:\"btnOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnTextColor\",\"fallback\":_vm.previewTheme.colors.btnText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnTextColorLocal),callback:function ($$v) {_vm.btnTextColorLocal=$$v},expression:\"btnTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnPanelTextColorLocal),callback:function ($$v) {_vm.btnPanelTextColorLocal=$$v},expression:\"btnPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPanelText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnTopBarTextColorLocal),callback:function ($$v) {_vm.btnTopBarTextColorLocal=$$v},expression:\"btnTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnTopBarText}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.pressed')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedColor\",\"fallback\":_vm.previewTheme.colors.btnPressed,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnPressedColorLocal),callback:function ($$v) {_vm.btnPressedColorLocal=$$v},expression:\"btnPressedColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedTextColor\",\"fallback\":_vm.previewTheme.colors.btnPressedText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnPressedTextColorLocal),callback:function ($$v) {_vm.btnPressedTextColorLocal=$$v},expression:\"btnPressedTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPressedText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnPressedPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnPressedPanelTextColorLocal),callback:function ($$v) {_vm.btnPressedPanelTextColorLocal=$$v},expression:\"btnPressedPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPressedPanelText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnPressedTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnPressedTopBarTextColorLocal),callback:function ($$v) {_vm.btnPressedTopBarTextColorLocal=$$v},expression:\"btnPressedTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPressedTopBarText}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.disabled')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledColor\",\"fallback\":_vm.previewTheme.colors.btnDisabled,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnDisabledColorLocal),callback:function ($$v) {_vm.btnDisabledColorLocal=$$v},expression:\"btnDisabledColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledTextColor\",\"fallback\":_vm.previewTheme.colors.btnDisabledText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnDisabledTextColorLocal),callback:function ($$v) {_vm.btnDisabledTextColorLocal=$$v},expression:\"btnDisabledTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnDisabledPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnDisabledPanelTextColorLocal),callback:function ($$v) {_vm.btnDisabledPanelTextColorLocal=$$v},expression:\"btnDisabledPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnDisabledTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnDisabledTopBarTextColorLocal),callback:function ($$v) {_vm.btnDisabledTopBarTextColorLocal=$$v},expression:\"btnDisabledTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.toggled')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledColor\",\"fallback\":_vm.previewTheme.colors.btnToggled,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnToggledColorLocal),callback:function ($$v) {_vm.btnToggledColorLocal=$$v},expression:\"btnToggledColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledTextColor\",\"fallback\":_vm.previewTheme.colors.btnToggledText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnToggledTextColorLocal),callback:function ($$v) {_vm.btnToggledTextColorLocal=$$v},expression:\"btnToggledTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnToggledText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnToggledPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnToggledPanelTextColorLocal),callback:function ($$v) {_vm.btnToggledPanelTextColorLocal=$$v},expression:\"btnToggledPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnToggledPanelText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnToggledTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnToggledTopBarTextColorLocal),callback:function ($$v) {_vm.btnToggledTopBarTextColorLocal=$$v},expression:\"btnToggledTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnToggledTopBarText}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.tabs')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"tabColor\",\"fallback\":_vm.previewTheme.colors.tab,\"label\":_vm.$t('settings.background')},model:{value:(_vm.tabColorLocal),callback:function ($$v) {_vm.tabColorLocal=$$v},expression:\"tabColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"tabTextColor\",\"fallback\":_vm.previewTheme.colors.tabText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.tabTextColorLocal),callback:function ($$v) {_vm.tabTextColorLocal=$$v},expression:\"tabTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.tabText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"tabActiveTextColor\",\"fallback\":_vm.previewTheme.colors.tabActiveText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.tabActiveTextColorLocal),callback:function ($$v) {_vm.tabActiveTextColorLocal=$$v},expression:\"tabActiveTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.tabActiveText}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.borders')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"borderColor\",\"fallback\":_vm.previewTheme.colors.border,\"label\":_vm.$t('settings.style.common.color')},model:{value:(_vm.borderColorLocal),callback:function ($$v) {_vm.borderColorLocal=$$v},expression:\"borderColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"borderOpacity\",\"fallback\":_vm.previewTheme.opacity.border,\"disabled\":_vm.borderColorLocal === 'transparent'},model:{value:(_vm.borderOpacityLocal),callback:function ($$v) {_vm.borderOpacityLocal=$$v},expression:\"borderOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.faint_text')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"faintColor\",\"fallback\":_vm.previewTheme.colors.faint,\"label\":_vm.$t('settings.text')},model:{value:(_vm.faintColorLocal),callback:function ($$v) {_vm.faintColorLocal=$$v},expression:\"faintColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"faintLinkColor\",\"fallback\":_vm.previewTheme.colors.faintLink,\"label\":_vm.$t('settings.links')},model:{value:(_vm.faintLinkColorLocal),callback:function ($$v) {_vm.faintLinkColorLocal=$$v},expression:\"faintLinkColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelFaintColor\",\"fallback\":_vm.previewTheme.colors.panelFaint,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.panelFaintColorLocal),callback:function ($$v) {_vm.panelFaintColorLocal=$$v},expression:\"panelFaintColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"faintOpacity\",\"fallback\":_vm.previewTheme.opacity.faint},model:{value:(_vm.faintOpacityLocal),callback:function ($$v) {_vm.faintOpacityLocal=$$v},expression:\"faintOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.underlay')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"underlay\",\"label\":_vm.$t('settings.style.advanced_colors.underlay'),\"fallback\":_vm.previewTheme.colors.underlay},model:{value:(_vm.underlayColorLocal),callback:function ($$v) {_vm.underlayColorLocal=$$v},expression:\"underlayColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"underlayOpacity\",\"fallback\":_vm.previewTheme.opacity.underlay,\"disabled\":_vm.underlayOpacityLocal === 'transparent'},model:{value:(_vm.underlayOpacityLocal),callback:function ($$v) {_vm.underlayOpacityLocal=$$v},expression:\"underlayOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.poll')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"poll\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.poll},model:{value:(_vm.pollColorLocal),callback:function ($$v) {_vm.pollColorLocal=$$v},expression:\"pollColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"pollText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.pollText},model:{value:(_vm.pollTextColorLocal),callback:function ($$v) {_vm.pollTextColorLocal=$$v},expression:\"pollTextColorLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.icons')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"icon\",\"label\":_vm.$t('settings.style.advanced_colors.icons'),\"fallback\":_vm.previewTheme.colors.icon},model:{value:(_vm.iconColorLocal),callback:function ($$v) {_vm.iconColorLocal=$$v},expression:\"iconColorLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.highlight')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"highlight\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.highlight},model:{value:(_vm.highlightColorLocal),callback:function ($$v) {_vm.highlightColorLocal=$$v},expression:\"highlightColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"highlightText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.highlightText},model:{value:(_vm.highlightTextColorLocal),callback:function ($$v) {_vm.highlightTextColorLocal=$$v},expression:\"highlightTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.highlightText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"highlightLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.highlightLink},model:{value:(_vm.highlightLinkColorLocal),callback:function ($$v) {_vm.highlightLinkColorLocal=$$v},expression:\"highlightLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.highlightLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.popover')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"popover\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.popover},model:{value:(_vm.popoverColorLocal),callback:function ($$v) {_vm.popoverColorLocal=$$v},expression:\"popoverColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"popoverOpacity\",\"fallback\":_vm.previewTheme.opacity.popover,\"disabled\":_vm.popoverOpacityLocal === 'transparent'},model:{value:(_vm.popoverOpacityLocal),callback:function ($$v) {_vm.popoverOpacityLocal=$$v},expression:\"popoverOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"popoverText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.popoverText},model:{value:(_vm.popoverTextColorLocal),callback:function ($$v) {_vm.popoverTextColorLocal=$$v},expression:\"popoverTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.popoverText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"popoverLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.popoverLink},model:{value:(_vm.popoverLinkColorLocal),callback:function ($$v) {_vm.popoverLinkColorLocal=$$v},expression:\"popoverLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.popoverLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.selectedPost')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedPost\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.selectedPost},model:{value:(_vm.selectedPostColorLocal),callback:function ($$v) {_vm.selectedPostColorLocal=$$v},expression:\"selectedPostColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedPostText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.selectedPostText},model:{value:(_vm.selectedPostTextColorLocal),callback:function ($$v) {_vm.selectedPostTextColorLocal=$$v},expression:\"selectedPostTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedPostText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedPostLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.selectedPostLink},model:{value:(_vm.selectedPostLinkColorLocal),callback:function ($$v) {_vm.selectedPostLinkColorLocal=$$v},expression:\"selectedPostLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedPostLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.selectedMenu')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedMenu\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.selectedMenu},model:{value:(_vm.selectedMenuColorLocal),callback:function ($$v) {_vm.selectedMenuColorLocal=$$v},expression:\"selectedMenuColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedMenuText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.selectedMenuText},model:{value:(_vm.selectedMenuTextColorLocal),callback:function ($$v) {_vm.selectedMenuTextColorLocal=$$v},expression:\"selectedMenuTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedMenuText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedMenuLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.selectedMenuLink},model:{value:(_vm.selectedMenuLinkColorLocal),callback:function ($$v) {_vm.selectedMenuLinkColorLocal=$$v},expression:\"selectedMenuLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedMenuLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('chats.chats')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatBgColor\",\"fallback\":_vm.previewTheme.colors.bg || 1,\"label\":_vm.$t('settings.background')},model:{value:(_vm.chatBgColorLocal),callback:function ($$v) {_vm.chatBgColorLocal=$$v},expression:\"chatBgColorLocal\"}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.chat.incoming')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingBgColor\",\"fallback\":_vm.previewTheme.colors.bg || 1,\"label\":_vm.$t('settings.background')},model:{value:(_vm.chatMessageIncomingBgColorLocal),callback:function ($$v) {_vm.chatMessageIncomingBgColorLocal=$$v},expression:\"chatMessageIncomingBgColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingTextColor\",\"fallback\":_vm.previewTheme.colors.text || 1,\"label\":_vm.$t('settings.text')},model:{value:(_vm.chatMessageIncomingTextColorLocal),callback:function ($$v) {_vm.chatMessageIncomingTextColorLocal=$$v},expression:\"chatMessageIncomingTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingLinkColor\",\"fallback\":_vm.previewTheme.colors.link || 1,\"label\":_vm.$t('settings.links')},model:{value:(_vm.chatMessageIncomingLinkColorLocal),callback:function ($$v) {_vm.chatMessageIncomingLinkColorLocal=$$v},expression:\"chatMessageIncomingLinkColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingBorderLinkColor\",\"fallback\":_vm.previewTheme.colors.fg || 1,\"label\":_vm.$t('settings.style.advanced_colors.chat.border')},model:{value:(_vm.chatMessageIncomingBorderColorLocal),callback:function ($$v) {_vm.chatMessageIncomingBorderColorLocal=$$v},expression:\"chatMessageIncomingBorderColorLocal\"}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.chat.outgoing')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingBgColor\",\"fallback\":_vm.previewTheme.colors.bg || 1,\"label\":_vm.$t('settings.background')},model:{value:(_vm.chatMessageOutgoingBgColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingBgColorLocal=$$v},expression:\"chatMessageOutgoingBgColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingTextColor\",\"fallback\":_vm.previewTheme.colors.text || 1,\"label\":_vm.$t('settings.text')},model:{value:(_vm.chatMessageOutgoingTextColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingTextColorLocal=$$v},expression:\"chatMessageOutgoingTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingLinkColor\",\"fallback\":_vm.previewTheme.colors.link || 1,\"label\":_vm.$t('settings.links')},model:{value:(_vm.chatMessageOutgoingLinkColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingLinkColorLocal=$$v},expression:\"chatMessageOutgoingLinkColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingBorderLinkColor\",\"fallback\":_vm.previewTheme.colors.bg || 1,\"label\":_vm.$t('settings.style.advanced_colors.chat.border')},model:{value:(_vm.chatMessageOutgoingBorderColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingBorderColorLocal=$$v},expression:\"chatMessageOutgoingBorderColorLocal\"}})],1)]),_vm._v(\" \"),_c('div',{staticClass:\"radius-container\",attrs:{\"label\":_vm.$t('settings.style.radii._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.radii_help')))]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearRoundness}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"btnRadius\",\"label\":_vm.$t('settings.btnRadius'),\"fallback\":_vm.previewTheme.radii.btn,\"max\":\"16\",\"hard-min\":\"0\"},model:{value:(_vm.btnRadiusLocal),callback:function ($$v) {_vm.btnRadiusLocal=$$v},expression:\"btnRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"inputRadius\",\"label\":_vm.$t('settings.inputRadius'),\"fallback\":_vm.previewTheme.radii.input,\"max\":\"9\",\"hard-min\":\"0\"},model:{value:(_vm.inputRadiusLocal),callback:function ($$v) {_vm.inputRadiusLocal=$$v},expression:\"inputRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"checkboxRadius\",\"label\":_vm.$t('settings.checkboxRadius'),\"fallback\":_vm.previewTheme.radii.checkbox,\"max\":\"16\",\"hard-min\":\"0\"},model:{value:(_vm.checkboxRadiusLocal),callback:function ($$v) {_vm.checkboxRadiusLocal=$$v},expression:\"checkboxRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"panelRadius\",\"label\":_vm.$t('settings.panelRadius'),\"fallback\":_vm.previewTheme.radii.panel,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.panelRadiusLocal),callback:function ($$v) {_vm.panelRadiusLocal=$$v},expression:\"panelRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"avatarRadius\",\"label\":_vm.$t('settings.avatarRadius'),\"fallback\":_vm.previewTheme.radii.avatar,\"max\":\"28\",\"hard-min\":\"0\"},model:{value:(_vm.avatarRadiusLocal),callback:function ($$v) {_vm.avatarRadiusLocal=$$v},expression:\"avatarRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"avatarAltRadius\",\"label\":_vm.$t('settings.avatarAltRadius'),\"fallback\":_vm.previewTheme.radii.avatarAlt,\"max\":\"28\",\"hard-min\":\"0\"},model:{value:(_vm.avatarAltRadiusLocal),callback:function ($$v) {_vm.avatarAltRadiusLocal=$$v},expression:\"avatarAltRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"attachmentRadius\",\"label\":_vm.$t('settings.attachmentRadius'),\"fallback\":_vm.previewTheme.radii.attachment,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.attachmentRadiusLocal),callback:function ($$v) {_vm.attachmentRadiusLocal=$$v},expression:\"attachmentRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"tooltipRadius\",\"label\":_vm.$t('settings.tooltipRadius'),\"fallback\":_vm.previewTheme.radii.tooltip,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.tooltipRadiusLocal),callback:function ($$v) {_vm.tooltipRadiusLocal=$$v},expression:\"tooltipRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"chatMessageRadius\",\"label\":_vm.$t('settings.chatMessageRadius'),\"fallback\":_vm.previewTheme.radii.chatMessage || 2,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.chatMessageRadiusLocal),callback:function ($$v) {_vm.chatMessageRadiusLocal=$$v},expression:\"chatMessageRadiusLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"shadow-container\",attrs:{\"label\":_vm.$t('settings.style.shadows._tab_label')}},[_c('div',{staticClass:\"tab-header shadow-selector\"},[_c('div',{staticClass:\"select-container\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.component'))+\"\\n \"),_c('label',{staticClass:\"select\",attrs:{\"for\":\"shadow-switcher\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.shadowSelected),expression:\"shadowSelected\"}],staticClass:\"shadow-switcher\",attrs:{\"id\":\"shadow-switcher\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.shadowSelected=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.shadowsAvailable),function(shadow){return _c('option',{key:shadow,domProps:{\"value\":shadow}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.components.' + shadow))+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])]),_vm._v(\" \"),_c('div',{staticClass:\"override\"},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"override\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.override'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.currentShadowOverriden),expression:\"currentShadowOverriden\"}],staticClass:\"input-override\",attrs:{\"id\":\"override\",\"name\":\"override\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.currentShadowOverriden)?_vm._i(_vm.currentShadowOverriden,null)>-1:(_vm.currentShadowOverriden)},on:{\"change\":function($event){var $$a=_vm.currentShadowOverriden,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.currentShadowOverriden=$$a.concat([$$v]))}else{$$i>-1&&(_vm.currentShadowOverriden=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.currentShadowOverriden=$$c}}}}),_vm._v(\" \"),_c('label',{staticClass:\"checkbox-label\",attrs:{\"for\":\"override\"}})]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearShadows}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('ShadowControl',{attrs:{\"ready\":!!_vm.currentShadowFallback,\"fallback\":_vm.currentShadowFallback},model:{value:(_vm.currentShadow),callback:function ($$v) {_vm.currentShadow=$$v},expression:\"currentShadow\"}}),_vm._v(\" \"),(_vm.shadowSelected === 'avatar' || _vm.shadowSelected === 'avatarStatus')?_c('div',[_c('i18n',{attrs:{\"path\":\"settings.style.shadows.filter_hint.always_drop_shadow\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"filter: drop-shadow()\")])]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.shadows.filter_hint.avatar_inset')))]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.shadows.filter_hint.drop_shadow_syntax\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"drop-shadow\")]),_vm._v(\" \"),_c('code',[_vm._v(\"spread-radius\")]),_vm._v(\" \"),_c('code',[_vm._v(\"inset\")])]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.shadows.filter_hint.inset_classic\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"box-shadow\")])]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.shadows.filter_hint.spread_zero')))])],1):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"fonts-container\",attrs:{\"label\":_vm.$t('settings.style.fonts._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.fonts.help')))]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearFonts}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"ui\",\"label\":_vm.$t('settings.style.fonts.components.interface'),\"fallback\":_vm.previewTheme.fonts.interface,\"no-inherit\":\"1\"},model:{value:(_vm.fontsLocal.interface),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"interface\", $$v)},expression:\"fontsLocal.interface\"}}),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"input\",\"label\":_vm.$t('settings.style.fonts.components.input'),\"fallback\":_vm.previewTheme.fonts.input},model:{value:(_vm.fontsLocal.input),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"input\", $$v)},expression:\"fontsLocal.input\"}}),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"post\",\"label\":_vm.$t('settings.style.fonts.components.post'),\"fallback\":_vm.previewTheme.fonts.post},model:{value:(_vm.fontsLocal.post),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"post\", $$v)},expression:\"fontsLocal.post\"}}),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"postCode\",\"label\":_vm.$t('settings.style.fonts.components.postCode'),\"fallback\":_vm.previewTheme.fonts.postCode},model:{value:(_vm.fontsLocal.postCode),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"postCode\", $$v)},expression:\"fontsLocal.postCode\"}})],1)])],1),_vm._v(\" \"),_c('div',{staticClass:\"apply-container\"},[_c('button',{staticClass:\"btn submit\",attrs:{\"disabled\":!_vm.themeValid},on:{\"click\":_vm.setCustomTheme}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.apply'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearAll}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.reset'))+\"\\n \")])])],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import TabSwitcher from 'src/components/tab_switcher/tab_switcher.js'\n\nimport DataImportExportTab from './tabs/data_import_export_tab.vue'\nimport MutesAndBlocksTab from './tabs/mutes_and_blocks_tab.vue'\nimport NotificationsTab from './tabs/notifications_tab.vue'\nimport FilteringTab from './tabs/filtering_tab.vue'\nimport SecurityTab from './tabs/security_tab/security_tab.vue'\nimport ProfileTab from './tabs/profile_tab.vue'\nimport GeneralTab from './tabs/general_tab.vue'\nimport VersionTab from './tabs/version_tab.vue'\nimport ThemeTab from './tabs/theme_tab/theme_tab.vue'\n\nconst SettingsModalContent = {\n components: {\n TabSwitcher,\n\n DataImportExportTab,\n MutesAndBlocksTab,\n NotificationsTab,\n FilteringTab,\n SecurityTab,\n ProfileTab,\n GeneralTab,\n VersionTab,\n ThemeTab\n },\n computed: {\n isLoggedIn () {\n return !!this.$store.state.users.currentUser\n },\n open () {\n return this.$store.state.interface.settingsModalState !== 'hidden'\n }\n },\n methods: {\n onOpen () {\n const targetTab = this.$store.state.interface.settingsModalTargetTab\n // We're being told to open in specific tab\n if (targetTab) {\n const tabIndex = this.$refs.tabSwitcher.$slots.default.findIndex(elm => {\n return elm.data && elm.data.attrs['data-tab-name'] === targetTab\n })\n if (tabIndex >= 0) {\n this.$refs.tabSwitcher.setTab(tabIndex)\n }\n }\n // Clear the state of target tab, so that next time settings is opened\n // it doesn't force it.\n this.$store.dispatch('clearSettingsModalTargetTab')\n }\n },\n mounted () {\n this.onOpen()\n },\n watch: {\n open: function (value) {\n if (value) this.onOpen()\n }\n }\n}\n\nexport default SettingsModalContent\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./settings_modal_content.scss\")\n}\n/* script */\nexport * from \"!!babel-loader!./settings_modal_content.js\"\nimport __vue_script__ from \"!!babel-loader!./settings_modal_content.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-da72a86e\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./settings_modal_content.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tab-switcher',{ref:\"tabSwitcher\",staticClass:\"settings_tab-switcher\",attrs:{\"side-tab-bar\":true,\"scrollable-tabs\":true}},[_c('div',{attrs:{\"label\":_vm.$t('settings.general'),\"icon\":\"wrench\",\"data-tab-name\":\"general\"}},[_c('GeneralTab')],1),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.profile_tab'),\"icon\":\"user\",\"data-tab-name\":\"profile\"}},[_c('ProfileTab')],1):_vm._e(),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.security_tab'),\"icon\":\"lock\",\"data-tab-name\":\"security\"}},[_c('SecurityTab')],1):_vm._e(),_vm._v(\" \"),_c('div',{attrs:{\"label\":_vm.$t('settings.filtering'),\"icon\":\"filter\",\"data-tab-name\":\"filtering\"}},[_c('FilteringTab')],1),_vm._v(\" \"),_c('div',{attrs:{\"label\":_vm.$t('settings.theme'),\"icon\":\"brush\",\"data-tab-name\":\"theme\"}},[_c('ThemeTab')],1),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.notifications'),\"icon\":\"bell-ringing-o\",\"data-tab-name\":\"notifications\"}},[_c('NotificationsTab')],1):_vm._e(),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.data_import_export_tab'),\"icon\":\"download\",\"data-tab-name\":\"dataImportExport\"}},[_c('DataImportExportTab')],1):_vm._e(),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.mutes_and_blocks'),\"fullHeight\":true,\"icon\":\"eye-off\",\"data-tab-name\":\"mutesAndBlocks\"}},[_c('MutesAndBlocksTab')],1):_vm._e(),_vm._v(\" \"),_c('div',{attrs:{\"label\":_vm.$t('settings.version.title'),\"icon\":\"info-circled\",\"data-tab-name\":\"version\"}},[_c('VersionTab')],1)])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/js/2.c92f4803ff24726cea58.js b/priv/static/static/js/2.e852a6b4b3bba752b838.js similarity index 66% rename from priv/static/static/js/2.c92f4803ff24726cea58.js rename to priv/static/static/js/2.e852a6b4b3bba752b838.js index 55aa1f44e..42e446575 100644 --- a/priv/static/static/js/2.c92f4803ff24726cea58.js +++ b/priv/static/static/js/2.e852a6b4b3bba752b838.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{591:function(t,e,s){var a=s(592);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("a45e17ec",a,!0,{})},592:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".settings_tab-switcher{height:100%}.settings_tab-switcher .setting-item{border-bottom:2px solid var(--fg,#182230);margin:1em 1em 1.4em;padding-bottom:1.4em}.settings_tab-switcher .setting-item>div{margin-bottom:.5em}.settings_tab-switcher .setting-item>div:last-child{margin-bottom:0}.settings_tab-switcher .setting-item:last-child{border-bottom:none;padding-bottom:0;margin-bottom:1em}.settings_tab-switcher .setting-item select{min-width:10em}.settings_tab-switcher .setting-item textarea{width:100%;max-width:100%;height:100px}.settings_tab-switcher .setting-item .unavailable,.settings_tab-switcher .setting-item .unavailable i{color:var(--cRed,red);color:red}.settings_tab-switcher .setting-item .number-input{max-width:6em}",""])},593:function(t,e,s){var a=s(594);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("5bed876c",a,!0,{})},594:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".importer-uploading{font-size:1.5em;margin:.25em}",""])},595:function(t,e,s){var a=s(596);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("432fc7c6",a,!0,{})},596:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".exporter-processing{font-size:1.5em;margin:.25em}",""])},597:function(t,e,s){var a=s(598);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("33ca0d90",a,!0,{})},598:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mutes-and-blocks-tab{height:100%}.mutes-and-blocks-tab .usersearch-wrapper{padding:1em}.mutes-and-blocks-tab .bulk-actions{text-align:right;padding:0 1em;min-height:28px}.mutes-and-blocks-tab .bulk-action-button{width:10em}.mutes-and-blocks-tab .domain-mute-form{padding:1em;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.mutes-and-blocks-tab .domain-mute-button{-ms-flex-item-align:end;align-self:flex-end;margin-top:1em;width:10em}",""])},599:function(t,e,s){var a=s(600);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("3a9ec1bf",a,!0,{})},600:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".autosuggest{position:relative}.autosuggest-input{display:block;width:100%}.autosuggest-results{position:absolute;left:0;top:100%;right:0;max-height:400px;background-color:#121a24;background-color:var(--bg,#121a24);border-color:#222;border:1px solid var(--border,#222);border-radius:4px;border-radius:var(--inputRadius,4px);border-top-left-radius:0;border-top-right-radius:0;box-shadow:1px 1px 4px rgba(0,0,0,.6);box-shadow:var(--panelShadow);overflow-y:auto;z-index:1}",""])},601:function(t,e,s){var a=s(602);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("211aa67c",a,!0,{})},602:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".block-card-content-container{margin-top:.5em;text-align:right}.block-card-content-container button{width:10em}",""])},603:function(t,e,s){var a=s(604);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("7ea980e0",a,!0,{})},604:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mute-card-content-container{margin-top:.5em;text-align:right}.mute-card-content-container button{width:10em}",""])},605:function(t,e,s){var a=s(606);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("39a942c3",a,!0,{})},606:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".domain-mute-card{-ms-flex:1 0;flex:1 0;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;padding:.6em 1em .6em 0}.domain-mute-card-domain{margin-right:1em;overflow:hidden;text-overflow:ellipsis}.domain-mute-card button{width:10em}.autosuggest-results .domain-mute-card{padding-left:1em}",""])},607:function(t,e,s){var a=s(608);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("3724291e",a,!0,{})},608:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".selectable-list-item-inner{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.selectable-list-item-inner>*{min-width:0}.selectable-list-item-selected-inner{background-color:#151e2a;background-color:var(--selectedMenu,#151e2a);color:var(--selectedMenuText,#b9b9ba);--faint:var(--selectedMenuFaintText,$fallback--faint);--faintLink:var(--selectedMenuFaintLink,$fallback--faint);--lightText:var(--selectedMenuLightText,$fallback--lightText);--icon:var(--selectedMenuIcon,$fallback--icon)}.selectable-list-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.6em 0;border-bottom:2px solid;border-bottom-color:#222;border-bottom-color:var(--border,#222)}.selectable-list-header-actions{-ms-flex:1;flex:1}.selectable-list-checkbox-wrapper{padding:0 10px;-ms-flex:none;flex:none}",""])},609:function(t,e,s){},613:function(t,e,s){var a=s(614);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("a588473e",a,!0,{})},614:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mfa-settings .method-item,.mfa-settings .mfa-heading{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:baseline;align-items:baseline}.mfa-settings .warning{color:orange;color:var(--cOrange,orange)}.mfa-settings .setup-otp{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.mfa-settings .setup-otp .qr-code{-ms-flex:1;flex:1;padding-right:10px}.mfa-settings .setup-otp .verify{-ms-flex:1;flex:1}.mfa-settings .setup-otp .error{margin:4px 0 0}.mfa-settings .setup-otp .confirm-otp-actions button{width:15em;margin-top:5px}",""])},615:function(t,e,s){var a=s(616);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("4065bf15",a,!0,{})},616:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mfa-backup-codes .warning{color:orange;color:var(--cOrange,orange)}.mfa-backup-codes .backup-codes{font-family:var(--postCodeFont,monospace)}",""])},618:function(t,e,s){var a=s(619);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("27925ae8",a,!0,{})},619:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".profile-tab .bio{margin:0}.profile-tab .visibility-tray{padding-top:5px}.profile-tab input[type=file]{padding:5px;height:auto}.profile-tab .banner-background-preview{max-width:100%;width:300px;position:relative}.profile-tab .banner-background-preview img{width:100%}.profile-tab .uploading{font-size:1.5em;margin:.25em}.profile-tab .name-changer{width:100%}.profile-tab .current-avatar-container{position:relative;width:150px;height:150px}.profile-tab .current-avatar{display:block;width:100%;height:100%;border-radius:4px;border-radius:var(--avatarRadius,4px)}.profile-tab .reset-button{position:absolute;top:.2em;right:.2em;border-radius:5px;border-radius:var(--tooltipRadius,5px);background-color:rgba(0,0,0,.6);opacity:.7;color:#fff;width:1.5em;height:1.5em;text-align:center;line-height:1.5em;font-size:1.5em;cursor:pointer}.profile-tab .reset-button:hover{opacity:1}.profile-tab .oauth-tokens{width:100%}.profile-tab .oauth-tokens th{text-align:left}.profile-tab .oauth-tokens .actions{text-align:right}.profile-tab-usersearch-wrapper{padding:1em}.profile-tab-bulk-actions{text-align:right;padding:0 1em;min-height:28px}.profile-tab-bulk-actions button{width:10em}.profile-tab-domain-mute-form{padding:1em;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.profile-tab-domain-mute-form button{-ms-flex-item-align:end;align-self:flex-end;margin-top:1em;width:10em}.profile-tab .setting-subitem{margin-left:1.75em}.profile-tab .profile-fields{display:-ms-flexbox;display:flex}.profile-tab .profile-fields>.emoji-input{-ms-flex:1 1 auto;flex:1 1 auto;margin:0 .2em .5em;min-width:0}.profile-tab .profile-fields>.icon-container{width:20px}.profile-tab .profile-fields>.icon-container>.icon-cancel{vertical-align:sub}",""])},620:function(t,e,s){var a=s(621);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("0dfd0b33",a,!0,{})},621:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".image-cropper-img-input{display:none}.image-cropper-image-container{position:relative}.image-cropper-image-container img{display:block;max-width:100%}.image-cropper-buttons-wrapper{margin-top:10px}.image-cropper-buttons-wrapper button{margin-top:5px}",""])},624:function(t,e,s){var a=s(625);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("4fafab12",a,!0,{})},625:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".theme-tab{padding-bottom:2em}.theme-tab .theme-warning{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline;margin-bottom:.5em}.theme-tab .theme-warning .buttons .btn{margin-bottom:.5em}.theme-tab .preset-switcher{margin-right:1em}.theme-tab .style-control{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline;margin-bottom:5px}.theme-tab .style-control .label{-ms-flex:1;flex:1}.theme-tab .style-control.disabled input,.theme-tab .style-control.disabled select{opacity:.5}.theme-tab .style-control .opt{margin:.5em}.theme-tab .style-control .color-input{-ms-flex:0 0 0px;flex:0 0 0}.theme-tab .style-control input,.theme-tab .style-control select{min-width:3em;margin:0;-ms-flex:0;flex:0}.theme-tab .style-control input[type=number],.theme-tab .style-control select[type=number]{min-width:5em}.theme-tab .style-control input[type=range],.theme-tab .style-control select[type=range]{-ms-flex:1;flex:1;min-width:3em;-ms-flex-item-align:start;align-self:flex-start}.theme-tab .reset-container{-ms-flex-wrap:wrap;flex-wrap:wrap}.theme-tab .apply-container,.theme-tab .color-container,.theme-tab .fonts-container,.theme-tab .radius-container,.theme-tab .reset-container{display:-ms-flexbox;display:flex}.theme-tab .fonts-container,.theme-tab .radius-container{-ms-flex-direction:column;flex-direction:column}.theme-tab .color-container{-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.theme-tab .color-container>h4{width:99%}.theme-tab .color-container,.theme-tab .fonts-container,.theme-tab .presets-container,.theme-tab .radius-container,.theme-tab .shadow-container{margin:1em 1em 0}.theme-tab .tab-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:baseline;align-items:baseline;width:100%;min-height:30px;margin-bottom:1em}.theme-tab .tab-header p{-ms-flex:1;flex:1;margin:0;margin-right:.5em}.theme-tab .tab-header-buttons{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.theme-tab .tab-header-buttons .btn{min-width:1px;-ms-flex:0 auto;flex:0 auto;padding:0 1em;margin-bottom:.5em}.theme-tab .shadow-selector .override{-ms-flex:1;flex:1;margin-left:.5em}.theme-tab .shadow-selector .select-container{margin-top:-4px;margin-bottom:-3px}.theme-tab .save-load,.theme-tab .save-load-options{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:baseline;align-items:baseline;-ms-flex-wrap:wrap;flex-wrap:wrap}.theme-tab .save-load-options .import-export,.theme-tab .save-load-options .presets,.theme-tab .save-load .import-export,.theme-tab .save-load .presets{margin-bottom:.5em}.theme-tab .save-load-options .import-export,.theme-tab .save-load .import-export{display:-ms-flexbox;display:flex}.theme-tab .save-load-options .override,.theme-tab .save-load .override{margin-left:.5em}.theme-tab .save-load-options{-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5em;-ms-flex-pack:center;justify-content:center}.theme-tab .save-load-options .keep-option{margin:0 .5em .5em;min-width:25%}.theme-tab .preview-container{border-top:1px dashed;border-bottom:1px dashed;border-color:#222;border-color:var(--border,#222);margin:1em 0;padding:1em;background:var(--body-background-image);background-size:cover;background-position:50% 50%}.theme-tab .preview-container .dummy .post{font-family:var(--postFont);display:-ms-flexbox;display:flex}.theme-tab .preview-container .dummy .post .content{-ms-flex:1;flex:1}.theme-tab .preview-container .dummy .post .content h4{margin-bottom:.25em}.theme-tab .preview-container .dummy .post .content .icons{margin-top:.5em;display:-ms-flexbox;display:flex}.theme-tab .preview-container .dummy .post .content .icons i{margin-right:1em}.theme-tab .preview-container .dummy .after-post{margin-top:1em;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.theme-tab .preview-container .dummy .avatar,.theme-tab .preview-container .dummy .avatar-alt{background:linear-gradient(135deg,#b8e1fc,#a9d2f3 10%,#90bae4 25%,#90bcea 37%,#90bff0 50%,#6ba8e5 51%,#a2daf5 83%,#bdf3fd);color:#000;font-family:sans-serif;text-align:center;margin-right:1em}.theme-tab .preview-container .dummy .avatar-alt{-ms-flex:0 auto;flex:0 auto;margin-left:28px;font-size:12px;min-width:20px;min-height:20px;line-height:20px;border-radius:10px;border-radius:var(--avatarAltRadius,10px)}.theme-tab .preview-container .dummy .avatar{-ms-flex:0 auto;flex:0 auto;width:48px;height:48px;font-size:14px;line-height:48px}.theme-tab .preview-container .dummy .actions{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline}.theme-tab .preview-container .dummy .actions .checkbox{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:baseline;align-items:baseline;margin-right:1em;-ms-flex:1;flex:1}.theme-tab .preview-container .dummy .separator{margin:1em;border-bottom:1px solid;border-color:#222;border-color:var(--border,#222)}.theme-tab .preview-container .dummy .panel-heading .alert,.theme-tab .preview-container .dummy .panel-heading .badge,.theme-tab .preview-container .dummy .panel-heading .btn,.theme-tab .preview-container .dummy .panel-heading .faint{margin-left:1em;white-space:nowrap}.theme-tab .preview-container .dummy .panel-heading .faint{text-overflow:ellipsis;min-width:2em;overflow-x:hidden}.theme-tab .preview-container .dummy .panel-heading .flex-spacer{-ms-flex:1;flex:1}.theme-tab .preview-container .dummy .btn{margin-left:0;padding:0 1em;min-width:3em;min-height:30px}.theme-tab .apply-container{-ms-flex-pack:center;justify-content:center}.theme-tab .color-item,.theme-tab .radius-item{min-width:20em;margin:5px 6px 0 0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1 1 0px;flex:1 1 0}.theme-tab .color-item.wide,.theme-tab .radius-item.wide{min-width:60%}.theme-tab .color-item:not(.wide):nth-child(odd),.theme-tab .radius-item:not(.wide):nth-child(odd){margin-right:7px}.theme-tab .color-item .color,.theme-tab .color-item .opacity,.theme-tab .radius-item .color,.theme-tab .radius-item .opacity{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline}.theme-tab .radius-item{-ms-flex-preferred-size:auto;flex-basis:auto}.theme-tab .theme-color-cl,.theme-tab .theme-radius-rn{border:0;box-shadow:none;background:transparent;color:var(--faint,hsla(240,1%,73%,.5));-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch}.theme-tab .theme-color-cl,.theme-tab .theme-color-in,.theme-tab .theme-radius-in{margin-left:4px}.theme-tab .theme-radius-in{min-width:1em;max-width:7em;-ms-flex:1;flex:1}.theme-tab .theme-radius-lb{max-width:50em}.theme-tab .theme-preview-content{padding:20px}.theme-tab .apply-container .btn{min-height:28px;min-width:10em;padding:0 2em}.theme-tab .btn{margin-left:.25em;margin-right:.25em}",""])},626:function(t,e,s){var a=s(627);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("7e57f952",a,!0,{})},627:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,'.color-input,.color-input-field.input{display:-ms-inline-flexbox;display:inline-flex}.color-input-field.input{-ms-flex:0 0 0px;flex:0 0 0;max-width:9em;-ms-flex-align:stretch;align-items:stretch;padding:.2em 8px}.color-input-field.input input{background:none;color:#b9b9ba;color:var(--inputText,#b9b9ba);border:none;padding:0;margin:0}.color-input-field.input input.textColor{-ms-flex:1 0 3em;flex:1 0 3em;min-width:3em;padding:0}.color-input-field.input .computedIndicator,.color-input-field.input .transparentIndicator,.color-input-field.input input.nativeColor{-ms-flex:0 0 2em;flex:0 0 2em;min-width:2em;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;height:100%}.color-input-field.input .transparentIndicator{background-color:#f0f;position:relative}.color-input-field.input .transparentIndicator:after,.color-input-field.input .transparentIndicator:before{display:block;content:"";background-color:#000;position:absolute;height:50%;width:50%}.color-input-field.input .transparentIndicator:after{top:0;left:0}.color-input-field.input .transparentIndicator:before{bottom:0;right:0}.color-input .label{-ms-flex:1 1 auto;flex:1 1 auto}',""])},628:function(t,e,s){var a=s(629);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("6c632637",a,!0,{})},629:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".color-control input.text-input{max-width:7em;-ms-flex:1;flex:1}",""])},630:function(t,e,s){var a=s(631);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("d219da80",a,!0,{})},631:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".shadow-control{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center;margin-bottom:1em}.shadow-control .shadow-preview-container,.shadow-control .shadow-tweak{margin:5px 6px 0 0}.shadow-control .shadow-preview-container{-ms-flex:0;flex:0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.shadow-control .shadow-preview-container input[type=number]{width:5em;min-width:2em}.shadow-control .shadow-preview-container .x-shift-control,.shadow-control .shadow-preview-container .y-shift-control{display:-ms-flexbox;display:flex;-ms-flex:0;flex:0}.shadow-control .shadow-preview-container .x-shift-control[disabled=disabled] *,.shadow-control .shadow-preview-container .y-shift-control[disabled=disabled] *{opacity:.5}.shadow-control .shadow-preview-container .x-shift-control{-ms-flex-align:start;align-items:flex-start}.shadow-control .shadow-preview-container .x-shift-control .wrap,.shadow-control .shadow-preview-container input[type=range]{margin:0;width:15em;height:2em}.shadow-control .shadow-preview-container .y-shift-control{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:end;align-items:flex-end}.shadow-control .shadow-preview-container .y-shift-control .wrap{width:2em;height:15em}.shadow-control .shadow-preview-container .y-shift-control input[type=range]{transform-origin:1em 1em;transform:rotate(90deg)}.shadow-control .shadow-preview-container .preview-window{-ms-flex:1;flex:1;background-color:#999;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-image:linear-gradient(45deg,#666 25%,transparent 0),linear-gradient(-45deg,#666 25%,transparent 0),linear-gradient(45deg,transparent 75%,#666 0),linear-gradient(-45deg,transparent 75%,#666 0);background-size:20px 20px;background-position:0 0,0 10px,10px -10px,-10px 0;border-radius:4px;border-radius:var(--inputRadius,4px)}.shadow-control .shadow-preview-container .preview-window .preview-block{width:33%;height:33%;background-color:#121a24;background-color:var(--bg,#121a24);border-radius:10px;border-radius:var(--panelRadius,10px)}.shadow-control .shadow-tweak{-ms-flex:1;flex:1;min-width:280px}.shadow-control .shadow-tweak .id-control{-ms-flex-align:stretch;align-items:stretch}.shadow-control .shadow-tweak .id-control .btn,.shadow-control .shadow-tweak .id-control .select{min-width:1px;margin-right:5px}.shadow-control .shadow-tweak .id-control .btn{padding:0 .4em;margin:0 .1em}.shadow-control .shadow-tweak .id-control .select{-ms-flex:1;flex:1}.shadow-control .shadow-tweak .id-control .select select{-ms-flex-item-align:initial;-ms-grid-row-align:initial;align-self:auto}",""])},632:function(t,e,s){var a=s(633);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("d9c0acde",a,!0,{})},633:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".font-control input.custom-font{min-width:10em}.font-control.custom .select{border-top-right-radius:0;border-bottom-right-radius:0}.font-control.custom .custom-font{border-top-left-radius:0;border-bottom-left-radius:0}",""])},634:function(t,e,s){var a=s(635);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("b94bc120",a,!0,{})},635:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".contrast-ratio{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-top:-4px;margin-bottom:5px}.contrast-ratio .label{margin-right:1em}.contrast-ratio .rating{display:inline-block;text-align:center}",""])},636:function(t,e,s){var a=s(637);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("66a4eaba",a,!0,{})},637:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".import-export-container{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:baseline;align-items:baseline;-ms-flex-pack:center;justify-content:center}",""])},638:function(t,e,s){var a=s(639);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("6fe23c76",a,!0,{})},639:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".preview-container{position:relative}.underlay-preview{position:absolute;top:0;bottom:0;left:10px;right:10px}",""])},641:function(t,e,s){"use strict";s.r(e);var a=s(141),n={props:{submitHandler:{type:Function,required:!0},submitButtonLabel:{type:String,default:function(){return this.$t("importer.submit")}},successMessage:{type:String,default:function(){return this.$t("importer.success")}},errorMessage:{type:String,default:function(){return this.$t("importer.error")}}},data:function(){return{file:null,error:!1,success:!1,submitting:!1}},methods:{change:function(){this.file=this.$refs.input.files[0]},submit:function(){var t=this;this.dismiss(),this.submitting=!0,this.submitHandler(this.file).then(function(){t.success=!0}).catch(function(){t.error=!0}).finally(function(){t.submitting=!1})},dismiss:function(){this.success=!1,this.error=!1}}},o=s(0);var i=function(t){s(593)},r=Object(o.a)(n,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"importer"},[s("form",[s("input",{ref:"input",attrs:{type:"file"},on:{change:t.change}})]),t._v(" "),t.submitting?s("i",{staticClass:"icon-spin4 animate-spin importer-uploading"}):s("button",{staticClass:"btn btn-default",on:{click:t.submit}},[t._v("\n "+t._s(t.submitButtonLabel)+"\n ")]),t._v(" "),t.success?s("div",[s("i",{staticClass:"icon-cross",on:{click:t.dismiss}}),t._v(" "),s("p",[t._v(t._s(t.successMessage))])]):t.error?s("div",[s("i",{staticClass:"icon-cross",on:{click:t.dismiss}}),t._v(" "),s("p",[t._v(t._s(t.errorMessage))])]):t._e()])},[],!1,i,null,null).exports,l={props:{getContent:{type:Function,required:!0},filename:{type:String,default:"export.csv"},exportButtonLabel:{type:String,default:function(){return this.$t("exporter.export")}},processingMessage:{type:String,default:function(){return this.$t("exporter.processing")}}},data:function(){return{processing:!1}},methods:{process:function(){var t=this;this.processing=!0,this.getContent().then(function(e){var s=document.createElement("a");s.setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(e)),s.setAttribute("download",t.filename),s.style.display="none",document.body.appendChild(s),s.click(),document.body.removeChild(s),setTimeout(function(){t.processing=!1},2e3)})}}};var c=function(t){s(595)},u=Object(o.a)(l,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"exporter"},[t.processing?s("div",[s("i",{staticClass:"icon-spin4 animate-spin exporter-processing"}),t._v(" "),s("span",[t._v(t._s(t.processingMessage))])]):s("button",{staticClass:"btn btn-default",on:{click:t.process}},[t._v("\n "+t._s(t.exportButtonLabel)+"\n ")])])},[],!1,c,null,null).exports,d=s(54),p={data:function(){return{activeTab:"profile",newDomainToMute:""}},created:function(){this.$store.dispatch("fetchTokens")},components:{Importer:r,Exporter:u,Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser}},methods:{getFollowsContent:function(){return this.$store.state.api.backendInteractor.exportFriends({id:this.$store.state.users.currentUser.id}).then(this.generateExportableUsersContent)},getBlocksContent:function(){return this.$store.state.api.backendInteractor.fetchBlocks().then(this.generateExportableUsersContent)},importFollows:function(t){return this.$store.state.api.backendInteractor.importFollows({file:t}).then(function(t){if(!t)throw new Error("failed")})},importBlocks:function(t){return this.$store.state.api.backendInteractor.importBlocks({file:t}).then(function(t){if(!t)throw new Error("failed")})},generateExportableUsersContent:function(t){return t.map(function(t){return t&&t.is_local?t.screen_name+"@"+location.hostname:t.screen_name}).join("\n")}}},m=Object(o.a)(p,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.data_import_export_tab")}},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.follow_import")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.import_followers_from_a_csv_file")))]),t._v(" "),s("Importer",{attrs:{"submit-handler":t.importFollows,"success-message":t.$t("settings.follows_imported"),"error-message":t.$t("settings.follow_import_error")}})],1),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.follow_export")))]),t._v(" "),s("Exporter",{attrs:{"get-content":t.getFollowsContent,filename:"friends.csv","export-button-label":t.$t("settings.follow_export_button")}})],1),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.block_import")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.import_blocks_from_a_csv_file")))]),t._v(" "),s("Importer",{attrs:{"submit-handler":t.importBlocks,"success-message":t.$t("settings.blocks_imported"),"error-message":t.$t("settings.block_import_error")}})],1),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.block_export")))]),t._v(" "),s("Exporter",{attrs:{"get-content":t.getBlocksContent,filename:"blocks.csv","export-button-label":t.$t("settings.block_export_button")}})],1)])},[],!1,null,null,null).exports,v=s(12),h=s.n(v),b=s(15),f=s.n(b),g=s(189),_=s.n(g),w={props:{query:{type:Function,required:!0},filter:{type:Function},placeholder:{type:String,default:"Search..."}},data:function(){return{term:"",timeout:null,results:[],resultsVisible:!1}},computed:{filtered:function(){return this.filter?this.filter(this.results):this.results}},watch:{term:function(t){this.fetchResults(t)}},methods:{fetchResults:function(t){var e=this;clearTimeout(this.timeout),this.timeout=setTimeout(function(){e.results=[],t&&e.query(t).then(function(t){e.results=t})},500)},onInputClick:function(){this.resultsVisible=!0},onClickOutside:function(){this.resultsVisible=!1}}};var C=function(t){s(599)},x=Object(o.a)(w,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:t.onClickOutside,expression:"onClickOutside"}],staticClass:"autosuggest"},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.term,expression:"term"}],staticClass:"autosuggest-input",attrs:{placeholder:t.placeholder},domProps:{value:t.term},on:{click:t.onInputClick,input:function(e){e.target.composing||(t.term=e.target.value)}}}),t._v(" "),t.resultsVisible&&t.filtered.length>0?s("div",{staticClass:"autosuggest-results"},[t._l(t.filtered,function(e){return t._t("default",null,{item:e})})],2):t._e()])},[],!1,C,null,null).exports,k=s(38),y={props:["userId"],data:function(){return{progress:!1}},computed:{user:function(){return this.$store.getters.findUser(this.userId)},relationship:function(){return this.$store.getters.relationship(this.userId)},blocked:function(){return this.relationship.blocking}},components:{BasicUserCard:k.a},methods:{unblockUser:function(){var t=this;this.progress=!0,this.$store.dispatch("unblockUser",this.user.id).then(function(){t.progress=!1})},blockUser:function(){var t=this;this.progress=!0,this.$store.dispatch("blockUser",this.user.id).then(function(){t.progress=!1})}}};var $=function(t){s(601)},L=Object(o.a)(y,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("basic-user-card",{attrs:{user:t.user}},[s("div",{staticClass:"block-card-content-container"},[t.blocked?s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.unblockUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.unblock_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.unblock"))+"\n ")]],2):s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.blockUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.block_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.block"))+"\n ")]],2)])])},[],!1,$,null,null).exports,T={props:["userId"],data:function(){return{progress:!1}},computed:{user:function(){return this.$store.getters.findUser(this.userId)},relationship:function(){return this.$store.getters.relationship(this.userId)},muted:function(){return this.relationship.muting}},components:{BasicUserCard:k.a},methods:{unmuteUser:function(){var t=this;this.progress=!0,this.$store.dispatch("unmuteUser",this.userId).then(function(){t.progress=!1})},muteUser:function(){var t=this;this.progress=!0,this.$store.dispatch("muteUser",this.userId).then(function(){t.progress=!1})}}};var O=function(t){s(603)},P=Object(o.a)(T,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("basic-user-card",{attrs:{user:t.user}},[s("div",{staticClass:"mute-card-content-container"},[t.muted?s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.unmuteUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.unmute_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.unmute"))+"\n ")]],2):s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.muteUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.mute_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.mute"))+"\n ")]],2)])])},[],!1,O,null,null).exports,S=s(78),I={props:["domain"],components:{ProgressButton:S.a},computed:{user:function(){return this.$store.state.users.currentUser},muted:function(){return this.user.domainMutes.includes(this.domain)}},methods:{unmuteDomain:function(){return this.$store.dispatch("unmuteDomain",this.domain)},muteDomain:function(){return this.$store.dispatch("muteDomain",this.domain)}}};var j=function(t){s(605)},E=Object(o.a)(I,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"domain-mute-card"},[s("div",{staticClass:"domain-mute-card-domain"},[t._v("\n "+t._s(t.domain)+"\n ")]),t._v(" "),t.muted?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:t.unmuteDomain}},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute_progress"))+"\n ")])],2):s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:t.muteDomain}},[t._v("\n "+t._s(t.$t("domain_mute_card.mute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("domain_mute_card.mute_progress"))+"\n ")])],2)],1)},[],!1,j,null,null).exports,R={components:{List:s(52).a,Checkbox:d.a},props:{items:{type:Array,default:function(){return[]}},getKey:{type:Function,default:function(t){return t.id}}},data:function(){return{selected:[]}},computed:{allKeys:function(){return this.items.map(this.getKey)},filteredSelected:function(){var t=this;return this.allKeys.filter(function(e){return-1!==t.selected.indexOf(e)})},allSelected:function(){return this.filteredSelected.length===this.items.length},noneSelected:function(){return 0===this.filteredSelected.length},someSelected:function(){return!this.allSelected&&!this.noneSelected}},methods:{isSelected:function(t){return-1!==this.filteredSelected.indexOf(this.getKey(t))},toggle:function(t,e){var s=this.getKey(e);t!==this.isSelected(s)&&(t?this.selected.push(s):this.selected.splice(this.selected.indexOf(s),1))},toggleAll:function(t){this.selected=t?this.allKeys.slice(0):[]}}};var B=function(t){s(607)},F=Object(o.a)(R,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"selectable-list"},[t.items.length>0?s("div",{staticClass:"selectable-list-header"},[s("div",{staticClass:"selectable-list-checkbox-wrapper"},[s("Checkbox",{attrs:{checked:t.allSelected,indeterminate:t.someSelected},on:{change:t.toggleAll}},[t._v("\n "+t._s(t.$t("selectable_list.select_all"))+"\n ")])],1),t._v(" "),s("div",{staticClass:"selectable-list-header-actions"},[t._t("header",null,{selected:t.filteredSelected})],2)]):t._e(),t._v(" "),s("List",{attrs:{items:t.items,"get-key":t.getKey},scopedSlots:t._u([{key:"item",fn:function(e){var a=e.item;return[s("div",{staticClass:"selectable-list-item-inner",class:{"selectable-list-item-selected-inner":t.isSelected(a)}},[s("div",{staticClass:"selectable-list-checkbox-wrapper"},[s("Checkbox",{attrs:{checked:t.isSelected(a)},on:{change:function(e){return t.toggle(e,a)}}})],1),t._v(" "),t._t("item",null,{item:a})],2)]}}],null,!0)},[t._v(" "),s("template",{slot:"empty"},[t._t("empty")],2)],2)],1)},[],!1,B,null,null).exports,M=s(190),U=s.n(M),V=s(7),A=s.n(V),D=s(1),N=s.n(D),W=s(10),z=s.n(W),q=s(6),G=s.n(q),H=s(191),K=s.n(H),J=s(192);s(609);function Q(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}function X(t){for(var e=1;e0?s("ProgressButton",{staticClass:"btn btn-default bulk-action-button",attrs:{click:function(){return t.blockUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.block"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.block_progress"))+"\n ")])],2):t._e(),t._v(" "),a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.unblockUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.unblock"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.unblock_progress"))+"\n ")])],2):t._e()],1)]}},{key:"item",fn:function(t){var e=t.item;return[s("BlockCard",{attrs:{"user-id":e}})]}}])},[t._v(" "),t._v(" "),s("template",{slot:"empty"},[t._v("\n "+t._s(t.$t("settings.no_blocks"))+"\n ")])],2)],1),t._v(" "),s("div",{attrs:{label:t.$t("settings.mutes_tab")}},[s("tab-switcher",[s("div",{attrs:{label:"Users"}},[s("div",{staticClass:"usersearch-wrapper"},[s("Autosuggest",{attrs:{filter:t.filterUnMutedUsers,query:t.queryUserIds,placeholder:t.$t("settings.search_user_to_mute")},scopedSlots:t._u([{key:"default",fn:function(t){return s("MuteCard",{attrs:{"user-id":t.item}})}}])})],1),t._v(" "),s("MuteList",{attrs:{refresh:!0,"get-key":function(t){return t}},scopedSlots:t._u([{key:"header",fn:function(e){var a=e.selected;return[s("div",{staticClass:"bulk-actions"},[a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.muteUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.mute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.mute_progress"))+"\n ")])],2):t._e(),t._v(" "),a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.unmuteUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.unmute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.unmute_progress"))+"\n ")])],2):t._e()],1)]}},{key:"item",fn:function(t){var e=t.item;return[s("MuteCard",{attrs:{"user-id":e}})]}}])},[t._v(" "),t._v(" "),s("template",{slot:"empty"},[t._v("\n "+t._s(t.$t("settings.no_mutes"))+"\n ")])],2)],1),t._v(" "),s("div",{attrs:{label:t.$t("settings.domain_mutes")}},[s("div",{staticClass:"domain-mute-form"},[s("Autosuggest",{attrs:{filter:t.filterUnMutedDomains,query:t.queryKnownDomains,placeholder:t.$t("settings.type_domains_to_mute")},scopedSlots:t._u([{key:"default",fn:function(t){return s("DomainMuteCard",{attrs:{domain:t.item}})}}])})],1),t._v(" "),s("DomainMuteList",{attrs:{refresh:!0,"get-key":function(t){return t}},scopedSlots:t._u([{key:"header",fn:function(e){var a=e.selected;return[s("div",{staticClass:"bulk-actions"},[a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.unmuteDomains(a)}}},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute_progress"))+"\n ")])],2):t._e()],1)]}},{key:"item",fn:function(t){var e=t.item;return[s("DomainMuteCard",{attrs:{domain:e}})]}}])},[t._v(" "),t._v(" "),s("template",{slot:"empty"},[t._v("\n "+t._s(t.$t("settings.no_mutes"))+"\n ")])],2)],1)])],1)])},[],!1,at,null,null).exports,ot={data:function(){return{activeTab:"profile",notificationSettings:this.$store.state.users.currentUser.notification_settings,newDomainToMute:""}},components:{Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser}},methods:{updateNotificationSettings:function(){this.$store.state.api.backendInteractor.updateNotificationSettings({settings:this.notificationSettings})}}},it=Object(o.a)(ot,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.notifications")}},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.notification_setting_filters")))]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.notificationSettings.block_from_strangers,callback:function(e){t.$set(t.notificationSettings,"block_from_strangers",e)},expression:"notificationSettings.block_from_strangers"}},[t._v("\n "+t._s(t.$t("settings.notification_setting_block_from_strangers"))+"\n ")])],1)]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.notification_setting_privacy")))]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.notificationSettings.hide_notification_contents,callback:function(e){t.$set(t.notificationSettings,"hide_notification_contents",e)},expression:"notificationSettings.hide_notification_contents"}},[t._v("\n "+t._s(t.$t("settings.notification_setting_hide_notification_contents"))+"\n ")])],1)]),t._v(" "),s("div",{staticClass:"setting-item"},[s("p",[t._v(t._s(t.$t("settings.notification_mutes")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.notification_blocks")))]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.updateNotificationSettings}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")])])])},[],!1,null,null,null).exports,rt=s(610),lt=s.n(rt),ct=s(37),ut=s.n(ct),dt=s(95);function pt(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}function mt(t){for(var e=1;e0})})}}}),watch:{notificationVisibility:{handler:function(t){this.$store.dispatch("setOption",{name:"notificationVisibility",value:this.$store.getters.mergedConfig.notificationVisibility})},deep:!0},replyVisibility:function(){this.$store.dispatch("queueFlushAll")}}},ft=Object(o.a)(bt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.filtering")}},[s("div",{staticClass:"setting-item"},[s("div",{staticClass:"select-multiple"},[s("span",{staticClass:"label"},[t._v(t._s(t.$t("settings.notification_visibility")))]),t._v(" "),s("ul",{staticClass:"option-list"},[s("li",[s("Checkbox",{model:{value:t.notificationVisibility.likes,callback:function(e){t.$set(t.notificationVisibility,"likes",e)},expression:"notificationVisibility.likes"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_likes"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.repeats,callback:function(e){t.$set(t.notificationVisibility,"repeats",e)},expression:"notificationVisibility.repeats"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_repeats"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.follows,callback:function(e){t.$set(t.notificationVisibility,"follows",e)},expression:"notificationVisibility.follows"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_follows"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.mentions,callback:function(e){t.$set(t.notificationVisibility,"mentions",e)},expression:"notificationVisibility.mentions"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_mentions"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.moves,callback:function(e){t.$set(t.notificationVisibility,"moves",e)},expression:"notificationVisibility.moves"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_moves"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.emojiReactions,callback:function(e){t.$set(t.notificationVisibility,"emojiReactions",e)},expression:"notificationVisibility.emojiReactions"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_emoji_reactions"))+"\n ")])],1)])]),t._v(" "),s("div",[t._v("\n "+t._s(t.$t("settings.replies_in_timeline"))+"\n "),s("label",{staticClass:"select",attrs:{for:"replyVisibility"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.replyVisibility,expression:"replyVisibility"}],attrs:{id:"replyVisibility"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.replyVisibility=e.target.multiple?s:s[0]}}},[s("option",{attrs:{value:"all",selected:""}},[t._v(t._s(t.$t("settings.reply_visibility_all")))]),t._v(" "),s("option",{attrs:{value:"following"}},[t._v(t._s(t.$t("settings.reply_visibility_following")))]),t._v(" "),s("option",{attrs:{value:"self"}},[t._v(t._s(t.$t("settings.reply_visibility_self")))])]),t._v(" "),s("i",{staticClass:"icon-down-open"})])]),t._v(" "),s("div",[s("Checkbox",{model:{value:t.hidePostStats,callback:function(e){t.hidePostStats=e},expression:"hidePostStats"}},[t._v("\n "+t._s(t.$t("settings.hide_post_stats"))+" "+t._s(t.$t("settings.instance_default",{value:t.hidePostStatsLocalizedValue}))+"\n ")])],1),t._v(" "),s("div",[s("Checkbox",{model:{value:t.hideUserStats,callback:function(e){t.hideUserStats=e},expression:"hideUserStats"}},[t._v("\n "+t._s(t.$t("settings.hide_user_stats"))+" "+t._s(t.$t("settings.instance_default",{value:t.hideUserStatsLocalizedValue}))+"\n ")])],1)]),t._v(" "),s("div",{staticClass:"setting-item"},[s("div",[s("p",[t._v(t._s(t.$t("settings.filtering_explanation")))]),t._v(" "),s("textarea",{directives:[{name:"model",rawName:"v-model",value:t.muteWordsString,expression:"muteWordsString"}],attrs:{id:"muteWords"},domProps:{value:t.muteWordsString},on:{input:function(e){e.target.composing||(t.muteWordsString=e.target.value)}}})]),t._v(" "),s("div",[s("Checkbox",{model:{value:t.hideFilteredStatuses,callback:function(e){t.hideFilteredStatuses=e},expression:"hideFilteredStatuses"}},[t._v("\n "+t._s(t.$t("settings.hide_filtered_statuses"))+" "+t._s(t.$t("settings.instance_default",{value:t.hideFilteredStatusesLocalizedValue}))+"\n ")])],1)])])},[],!1,null,null,null).exports,gt=s(3),_t=s.n(gt),wt={props:{backupCodes:{type:Object,default:function(){return{inProgress:!1,codes:[]}}}},data:function(){return{}},computed:{inProgress:function(){return this.backupCodes.inProgress},ready:function(){return this.backupCodes.codes.length>0},displayTitle:function(){return this.inProgress||this.ready}}};var Ct=function(t){s(615)},xt=Object(o.a)(wt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"mfa-backup-codes"},[t.displayTitle?s("h4",[t._v("\n "+t._s(t.$t("settings.mfa.recovery_codes"))+"\n ")]):t._e(),t._v(" "),t.inProgress?s("i",[t._v(t._s(t.$t("settings.mfa.waiting_a_recovery_codes")))]):t._e(),t._v(" "),t.ready?[s("p",{staticClass:"alert warning"},[t._v("\n "+t._s(t.$t("settings.mfa.recovery_codes_warning"))+"\n ")]),t._v(" "),s("ul",{staticClass:"backup-codes"},t._l(t.backupCodes.codes,function(e){return s("li",{key:e},[t._v("\n "+t._s(e)+"\n ")])}),0)]:t._e()],2)},[],!1,Ct,null,null).exports,kt={props:["disabled"],data:function(){return{}},methods:{confirm:function(){this.$emit("confirm")},cancel:function(){this.$emit("cancel")}}},yt=Object(o.a)(kt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",[t._t("default"),t._v(" "),s("button",{staticClass:"btn btn-default",attrs:{disabled:t.disabled},on:{click:t.confirm}},[t._v("\n "+t._s(t.$t("general.confirm"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn btn-default",attrs:{disabled:t.disabled},on:{click:t.cancel}},[t._v("\n "+t._s(t.$t("general.cancel"))+"\n ")])],2)},[],!1,null,null,null).exports,$t=s(2);function Lt(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}var Tt={props:["settings"],data:function(){return{error:!1,currentPassword:"",deactivate:!1,inProgress:!1}},components:{confirm:yt},computed:function(t){for(var e=1;e0},confirmNewBackupCodes:function(){return this.backupCodes.getNewCodes}},Object($t.e)({backendInteractor:function(t){return t.api.backendInteractor}})),methods:{activateOTP:function(){this.settings.enabled||(this.setupState.state="getBackupcodes",this.fetchBackupCodes())},fetchBackupCodes:function(){var t=this;return this.backupCodes.inProgress=!0,this.backupCodes.codes=[],this.backendInteractor.generateMfaBackupCodes().then(function(e){t.backupCodes.codes=e.codes,t.backupCodes.inProgress=!1})},getBackupCodes:function(){this.backupCodes.getNewCodes=!0},confirmBackupCodes:function(){var t=this;this.fetchBackupCodes().then(function(e){t.backupCodes.getNewCodes=!1})},cancelBackupCodes:function(){this.backupCodes.getNewCodes=!1},setupOTP:function(){var t=this;this.setupState.state="setupOTP",this.setupState.setupOTPState="prepare",this.backendInteractor.mfaSetupOTP().then(function(e){t.otpSettings=e,t.setupState.setupOTPState="confirm"})},doConfirmOTP:function(){var t=this;this.error=null,this.backendInteractor.mfaConfirmOTP({token:this.otpConfirmToken,password:this.currentPassword}).then(function(e){e.error?t.error=e.error:t.completeSetup()})},completeSetup:function(){this.setupState.setupOTPState="complete",this.setupState.state="complete",this.currentPassword=null,this.error=null,this.fetchSettings()},cancelSetup:function(){this.setupState.setupOTPState="",this.setupState.state="",this.currentPassword=null,this.error=null},fetchSettings:function(){var t;return _t.a.async(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,_t.a.awrap(this.backendInteractor.settingsMFA());case 2:if(!(t=e.sent).error){e.next=5;break}return e.abrupt("return");case 5:return this.settings=t.settings,this.settings.available=!0,e.abrupt("return",t);case 8:case"end":return e.stop()}},null,this)}},mounted:function(){var t=this;this.fetchSettings().then(function(){t.readyInit=!0})}};var St=function(t){s(613)},It=Object(o.a)(Pt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return t.readyInit&&t.settings.available?s("div",{staticClass:"setting-item mfa-settings"},[s("div",{staticClass:"mfa-heading"},[s("h2",[t._v(t._s(t.$t("settings.mfa.title")))])]),t._v(" "),s("div",[t.setupInProgress?t._e():s("div",{staticClass:"setting-item"},[s("h3",[t._v(t._s(t.$t("settings.mfa.authentication_methods")))]),t._v(" "),s("totp-item",{attrs:{settings:t.settings},on:{deactivate:t.fetchSettings,activate:t.activateOTP}}),t._v(" "),s("br"),t._v(" "),t.settings.enabled?s("div",[t.confirmNewBackupCodes?t._e():s("recovery-codes",{attrs:{"backup-codes":t.backupCodes}}),t._v(" "),t.confirmNewBackupCodes?t._e():s("button",{staticClass:"btn btn-default",on:{click:t.getBackupCodes}},[t._v("\n "+t._s(t.$t("settings.mfa.generate_new_recovery_codes"))+"\n ")]),t._v(" "),t.confirmNewBackupCodes?s("div",[s("confirm",{attrs:{disabled:t.backupCodes.inProgress},on:{confirm:t.confirmBackupCodes,cancel:t.cancelBackupCodes}},[s("p",{staticClass:"warning"},[t._v("\n "+t._s(t.$t("settings.mfa.warning_of_generate_new_codes"))+"\n ")])])],1):t._e()],1):t._e()],1),t._v(" "),t.setupInProgress?s("div",[s("h3",[t._v(t._s(t.$t("settings.mfa.setup_otp")))]),t._v(" "),t.setupOTPInProgress?t._e():s("recovery-codes",{attrs:{"backup-codes":t.backupCodes}}),t._v(" "),t.canSetupOTP?s("button",{staticClass:"btn btn-default",on:{click:t.cancelSetup}},[t._v("\n "+t._s(t.$t("general.cancel"))+"\n ")]):t._e(),t._v(" "),t.canSetupOTP?s("button",{staticClass:"btn btn-default",on:{click:t.setupOTP}},[t._v("\n "+t._s(t.$t("settings.mfa.setup_otp"))+"\n ")]):t._e(),t._v(" "),t.setupOTPInProgress?[t.prepareOTP?s("i",[t._v(t._s(t.$t("settings.mfa.wait_pre_setup_otp")))]):t._e(),t._v(" "),t.confirmOTP?s("div",[s("div",{staticClass:"setup-otp"},[s("div",{staticClass:"qr-code"},[s("h4",[t._v(t._s(t.$t("settings.mfa.scan.title")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.mfa.scan.desc")))]),t._v(" "),s("qrcode",{attrs:{value:t.otpSettings.provisioning_uri,options:{width:200}}}),t._v(" "),s("p",[t._v("\n "+t._s(t.$t("settings.mfa.scan.secret_code"))+":\n "+t._s(t.otpSettings.key)+"\n ")])],1),t._v(" "),s("div",{staticClass:"verify"},[s("h4",[t._v(t._s(t.$t("general.verify")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.mfa.verify.desc")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.otpConfirmToken,expression:"otpConfirmToken"}],attrs:{type:"text"},domProps:{value:t.otpConfirmToken},on:{input:function(e){e.target.composing||(t.otpConfirmToken=e.target.value)}}}),t._v(" "),s("p",[t._v(t._s(t.$t("settings.enter_current_password_to_confirm"))+":")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.currentPassword,expression:"currentPassword"}],attrs:{type:"password"},domProps:{value:t.currentPassword},on:{input:function(e){e.target.composing||(t.currentPassword=e.target.value)}}}),t._v(" "),s("div",{staticClass:"confirm-otp-actions"},[s("button",{staticClass:"btn btn-default",on:{click:t.doConfirmOTP}},[t._v("\n "+t._s(t.$t("settings.mfa.confirm_and_enable"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.cancelSetup}},[t._v("\n "+t._s(t.$t("general.cancel"))+"\n ")])]),t._v(" "),t.error?s("div",{staticClass:"alert error"},[t._v("\n "+t._s(t.error)+"\n ")]):t._e()])])]):t._e()]:t._e()],2):t._e()])]):t._e()},[],!1,St,null,null).exports,jt={data:function(){return{newEmail:"",changeEmailError:!1,changeEmailPassword:"",changedEmail:!1,deletingAccount:!1,deleteAccountConfirmPasswordInput:"",deleteAccountError:!1,changePasswordInputs:["","",""],changedPassword:!1,changePasswordError:!1}},created:function(){this.$store.dispatch("fetchTokens")},components:{ProgressButton:S.a,Mfa:It,Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser},pleromaBackend:function(){return this.$store.state.instance.pleromaBackend},oauthTokens:function(){return this.$store.state.oauthTokens.tokens.map(function(t){return{id:t.id,appName:t.app_name,validUntil:new Date(t.valid_until).toLocaleDateString()}})}},methods:{confirmDelete:function(){this.deletingAccount=!0},deleteAccount:function(){var t=this;this.$store.state.api.backendInteractor.deleteAccount({password:this.deleteAccountConfirmPasswordInput}).then(function(e){"success"===e.status?(t.$store.dispatch("logout"),t.$router.push({name:"root"})):t.deleteAccountError=e.error})},changePassword:function(){var t=this,e={password:this.changePasswordInputs[0],newPassword:this.changePasswordInputs[1],newPasswordConfirmation:this.changePasswordInputs[2]};this.$store.state.api.backendInteractor.changePassword(e).then(function(e){"success"===e.status?(t.changedPassword=!0,t.changePasswordError=!1,t.logout()):(t.changedPassword=!1,t.changePasswordError=e.error)})},changeEmail:function(){var t=this,e={email:this.newEmail,password:this.changeEmailPassword};this.$store.state.api.backendInteractor.changeEmail(e).then(function(e){"success"===e.status?(t.changedEmail=!0,t.changeEmailError=!1):(t.changedEmail=!1,t.changeEmailError=e.error)})},logout:function(){this.$store.dispatch("logout"),this.$router.replace("/")},revokeToken:function(t){window.confirm("".concat(this.$i18n.t("settings.revoke_token"),"?"))&&this.$store.dispatch("revokeToken",t)}}},Et=Object(o.a)(jt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.security_tab")}},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.change_email")))]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.new_email")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.newEmail,expression:"newEmail"}],attrs:{type:"email",autocomplete:"email"},domProps:{value:t.newEmail},on:{input:function(e){e.target.composing||(t.newEmail=e.target.value)}}})]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.current_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changeEmailPassword,expression:"changeEmailPassword"}],attrs:{type:"password",autocomplete:"current-password"},domProps:{value:t.changeEmailPassword},on:{input:function(e){e.target.composing||(t.changeEmailPassword=e.target.value)}}})]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.changeEmail}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")]),t._v(" "),t.changedEmail?s("p",[t._v("\n "+t._s(t.$t("settings.changed_email"))+"\n ")]):t._e(),t._v(" "),!1!==t.changeEmailError?[s("p",[t._v(t._s(t.$t("settings.change_email_error")))]),t._v(" "),s("p",[t._v(t._s(t.changeEmailError))])]:t._e()],2),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.change_password")))]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.current_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changePasswordInputs[0],expression:"changePasswordInputs[0]"}],attrs:{type:"password"},domProps:{value:t.changePasswordInputs[0]},on:{input:function(e){e.target.composing||t.$set(t.changePasswordInputs,0,e.target.value)}}})]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.new_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changePasswordInputs[1],expression:"changePasswordInputs[1]"}],attrs:{type:"password"},domProps:{value:t.changePasswordInputs[1]},on:{input:function(e){e.target.composing||t.$set(t.changePasswordInputs,1,e.target.value)}}})]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.confirm_new_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changePasswordInputs[2],expression:"changePasswordInputs[2]"}],attrs:{type:"password"},domProps:{value:t.changePasswordInputs[2]},on:{input:function(e){e.target.composing||t.$set(t.changePasswordInputs,2,e.target.value)}}})]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.changePassword}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")]),t._v(" "),t.changedPassword?s("p",[t._v("\n "+t._s(t.$t("settings.changed_password"))+"\n ")]):!1!==t.changePasswordError?s("p",[t._v("\n "+t._s(t.$t("settings.change_password_error"))+"\n ")]):t._e(),t._v(" "),t.changePasswordError?s("p",[t._v("\n "+t._s(t.changePasswordError)+"\n ")]):t._e()]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.oauth_tokens")))]),t._v(" "),s("table",{staticClass:"oauth-tokens"},[s("thead",[s("tr",[s("th",[t._v(t._s(t.$t("settings.app_name")))]),t._v(" "),s("th",[t._v(t._s(t.$t("settings.valid_until")))]),t._v(" "),s("th")])]),t._v(" "),s("tbody",t._l(t.oauthTokens,function(e){return s("tr",{key:e.id},[s("td",[t._v(t._s(e.appName))]),t._v(" "),s("td",[t._v(t._s(e.validUntil))]),t._v(" "),s("td",{staticClass:"actions"},[s("button",{staticClass:"btn btn-default",on:{click:function(s){return t.revokeToken(e.id)}}},[t._v("\n "+t._s(t.$t("settings.revoke_token"))+"\n ")])])])}),0)])]),t._v(" "),s("mfa"),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.delete_account")))]),t._v(" "),t.deletingAccount?t._e():s("p",[t._v("\n "+t._s(t.$t("settings.delete_account_description"))+"\n ")]),t._v(" "),t.deletingAccount?s("div",[s("p",[t._v(t._s(t.$t("settings.delete_account_instructions")))]),t._v(" "),s("p",[t._v(t._s(t.$t("login.password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.deleteAccountConfirmPasswordInput,expression:"deleteAccountConfirmPasswordInput"}],attrs:{type:"password"},domProps:{value:t.deleteAccountConfirmPasswordInput},on:{input:function(e){e.target.composing||(t.deleteAccountConfirmPasswordInput=e.target.value)}}}),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.deleteAccount}},[t._v("\n "+t._s(t.$t("settings.delete_account"))+"\n ")])]):t._e(),t._v(" "),!1!==t.deleteAccountError?s("p",[t._v("\n "+t._s(t.$t("settings.delete_account_error"))+"\n ")]):t._e(),t._v(" "),t.deleteAccountError?s("p",[t._v("\n "+t._s(t.deleteAccountError)+"\n ")]):t._e(),t._v(" "),t.deletingAccount?t._e():s("button",{staticClass:"btn btn-default",on:{click:t.confirmDelete}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")])])],1)},[],!1,null,null,null).exports,Rt=s(188),Bt=s.n(Rt),Ft=s(96),Mt=s.n(Ft),Ut=s(27),Vt=s.n(Ut),At=s(622),Dt=(s(623),{props:{trigger:{type:[String,window.Element],required:!0},submitHandler:{type:Function,required:!0},cropperOptions:{type:Object,default:function(){return{aspectRatio:1,autoCropArea:1,viewMode:1,movable:!1,zoomable:!1,guides:!1}}},mimes:{type:String,default:"image/png, image/gif, image/jpeg, image/bmp, image/x-icon"},saveButtonLabel:{type:String},saveWithoutCroppingButtonlabel:{type:String},cancelButtonLabel:{type:String}},data:function(){return{cropper:void 0,dataUrl:void 0,filename:void 0,submitting:!1,submitError:null}},computed:{saveText:function(){return this.saveButtonLabel||this.$t("image_cropper.save")},saveWithoutCroppingText:function(){return this.saveWithoutCroppingButtonlabel||this.$t("image_cropper.save_without_cropping")},cancelText:function(){return this.cancelButtonLabel||this.$t("image_cropper.cancel")},submitErrorMsg:function(){return this.submitError&&this.submitError instanceof Error?this.submitError.toString():this.submitError}},methods:{destroy:function(){this.cropper&&this.cropper.destroy(),this.$refs.input.value="",this.dataUrl=void 0,this.$emit("close")},submit:function(){var t=this,e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.submitting=!0,this.avatarUploadError=null,this.submitHandler(e&&this.cropper,this.file).then(function(){return t.destroy()}).catch(function(e){t.submitError=e}).finally(function(){t.submitting=!1})},pickImage:function(){this.$refs.input.click()},createCropper:function(){this.cropper=new At.a(this.$refs.img,this.cropperOptions)},getTriggerDOM:function(){return"object"===Vt()(this.trigger)?this.trigger:document.querySelector(this.trigger)},readFile:function(){var t=this,e=this.$refs.input;if(null!=e.files&&null!=e.files[0]){this.file=e.files[0];var s=new window.FileReader;s.onload=function(e){t.dataUrl=e.target.result,t.$emit("open")},s.readAsDataURL(this.file),this.$emit("changed",this.file,s)}},clearError:function(){this.submitError=null}},mounted:function(){var t=this.getTriggerDOM();t?t.addEventListener("click",this.pickImage):this.$emit("error","No image make trigger found.","user"),this.$refs.input.addEventListener("change",this.readFile)},beforeDestroy:function(){var t=this.getTriggerDOM();t&&t.removeEventListener("click",this.pickImage),this.$refs.input.removeEventListener("change",this.readFile)}});var Nt=function(t){s(620)},Wt=Object(o.a)(Dt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"image-cropper"},[t.dataUrl?s("div",[s("div",{staticClass:"image-cropper-image-container"},[s("img",{ref:"img",attrs:{src:t.dataUrl,alt:""},on:{load:function(e){return e.stopPropagation(),t.createCropper(e)}}})]),t._v(" "),s("div",{staticClass:"image-cropper-buttons-wrapper"},[s("button",{staticClass:"btn",attrs:{type:"button",disabled:t.submitting},domProps:{textContent:t._s(t.saveText)},on:{click:function(e){return t.submit()}}}),t._v(" "),s("button",{staticClass:"btn",attrs:{type:"button",disabled:t.submitting},domProps:{textContent:t._s(t.cancelText)},on:{click:t.destroy}}),t._v(" "),s("button",{staticClass:"btn",attrs:{type:"button",disabled:t.submitting},domProps:{textContent:t._s(t.saveWithoutCroppingText)},on:{click:function(e){return t.submit(!1)}}}),t._v(" "),t.submitting?s("i",{staticClass:"icon-spin4 animate-spin"}):t._e()]),t._v(" "),t.submitError?s("div",{staticClass:"alert error"},[t._v("\n "+t._s(t.submitErrorMsg)+"\n "),s("i",{staticClass:"button-icon icon-cancel",on:{click:t.clearError}})]):t._e()]):t._e(),t._v(" "),s("input",{ref:"input",staticClass:"image-cropper-img-input",attrs:{type:"file",accept:t.mimes}})])},[],!1,Nt,null,null).exports,zt=s(196),qt=s(134),Gt=s(195),Ht=s(135),Kt={data:function(){return{newName:this.$store.state.users.currentUser.name,newBio:Bt()(this.$store.state.users.currentUser.description),newLocked:this.$store.state.users.currentUser.locked,newNoRichText:this.$store.state.users.currentUser.no_rich_text,newDefaultScope:this.$store.state.users.currentUser.default_scope,newFields:this.$store.state.users.currentUser.fields.map(function(t){return{name:t.name,value:t.value}}),hideFollows:this.$store.state.users.currentUser.hide_follows,hideFollowers:this.$store.state.users.currentUser.hide_followers,hideFollowsCount:this.$store.state.users.currentUser.hide_follows_count,hideFollowersCount:this.$store.state.users.currentUser.hide_followers_count,showRole:this.$store.state.users.currentUser.show_role,role:this.$store.state.users.currentUser.role,discoverable:this.$store.state.users.currentUser.discoverable,bot:this.$store.state.users.currentUser.bot,allowFollowingMove:this.$store.state.users.currentUser.allow_following_move,pickAvatarBtnVisible:!0,bannerUploading:!1,backgroundUploading:!1,banner:null,bannerPreview:null,background:null,backgroundPreview:null,bannerUploadError:null,backgroundUploadError:null}},components:{ScopeSelector:zt.a,ImageCropper:Wt,EmojiInput:Gt.a,Autosuggest:x,ProgressButton:S.a,Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser},emojiUserSuggestor:function(){var t=this;return Object(Ht.a)({emoji:[].concat(z()(this.$store.state.instance.emoji),z()(this.$store.state.instance.customEmoji)),users:this.$store.state.users.users,updateUsersList:function(e){return t.$store.dispatch("searchUsers",{query:e})}})},emojiSuggestor:function(){return Object(Ht.a)({emoji:[].concat(z()(this.$store.state.instance.emoji),z()(this.$store.state.instance.customEmoji))})},userSuggestor:function(){var t=this;return Object(Ht.a)({users:this.$store.state.users.users,updateUsersList:function(e){return t.$store.dispatch("searchUsers",{query:e})}})},fieldsLimits:function(){return this.$store.state.instance.fieldsLimits},maxFields:function(){return this.fieldsLimits?this.fieldsLimits.maxFields:0},defaultAvatar:function(){return this.$store.state.instance.server+this.$store.state.instance.defaultAvatar},defaultBanner:function(){return this.$store.state.instance.server+this.$store.state.instance.defaultBanner},isDefaultAvatar:function(){var t=this.$store.state.instance.defaultAvatar;return!this.$store.state.users.currentUser.profile_image_url||this.$store.state.users.currentUser.profile_image_url.includes(t)},isDefaultBanner:function(){var t=this.$store.state.instance.defaultBanner;return!this.$store.state.users.currentUser.cover_photo||this.$store.state.users.currentUser.cover_photo.includes(t)},isDefaultBackground:function(){return!this.$store.state.users.currentUser.background_image},avatarImgSrc:function(){var t=this.$store.state.users.currentUser.profile_image_url_original;return t||this.defaultAvatar},bannerImgSrc:function(){var t=this.$store.state.users.currentUser.cover_photo;return t||this.defaultBanner}},methods:{updateProfile:function(){var t=this;this.$store.state.api.backendInteractor.updateProfile({params:{note:this.newBio,locked:this.newLocked,display_name:this.newName,fields_attributes:this.newFields.filter(function(t){return null!=t}),default_scope:this.newDefaultScope,no_rich_text:this.newNoRichText,hide_follows:this.hideFollows,hide_followers:this.hideFollowers,discoverable:this.discoverable,bot:this.bot,allow_following_move:this.allowFollowingMove,hide_follows_count:this.hideFollowsCount,hide_followers_count:this.hideFollowersCount,show_role:this.showRole}}).then(function(e){t.newFields.splice(e.fields.length),Mt()(t.newFields,e.fields),t.$store.commit("addNewUsers",[e]),t.$store.commit("setCurrentUser",e)})},changeVis:function(t){this.newDefaultScope=t},addField:function(){return this.newFields.lengththis.$store.state.instance[t+"limit"]){var n=qt.a.fileSizeFormat(a.size),o=qt.a.fileSizeFormat(this.$store.state.instance[t+"limit"]);this[t+"UploadError"]=[this.$t("upload.error.base"),this.$t("upload.error.file_too_big",{filesize:n.num,filesizeunit:n.unit,allowedsize:o.num,allowedsizeunit:o.unit})].join(" ")}else{var i=new FileReader;i.onload=function(e){var n=e.target.result;s[t+"Preview"]=n,s[t]=a},i.readAsDataURL(a)}},resetAvatar:function(){window.confirm(this.$t("settings.reset_avatar_confirm"))&&this.submitAvatar(void 0,"")},resetBanner:function(){window.confirm(this.$t("settings.reset_banner_confirm"))&&this.submitBanner("")},resetBackground:function(){window.confirm(this.$t("settings.reset_background_confirm"))&&this.submitBackground("")},submitAvatar:function(t,e){var s=this;return new Promise(function(a,n){function o(t){s.$store.state.api.backendInteractor.updateProfileImages({avatar:t}).then(function(t){s.$store.commit("addNewUsers",[t]),s.$store.commit("setCurrentUser",t),a()}).catch(function(t){n(new Error(s.$t("upload.error.base")+" "+t.message))})}t?t.getCroppedCanvas().toBlob(o,e.type):o(e)})},submitBanner:function(t){var e=this;(this.bannerPreview||""===t)&&(this.bannerUploading=!0,this.$store.state.api.backendInteractor.updateProfileImages({banner:t}).then(function(t){e.$store.commit("addNewUsers",[t]),e.$store.commit("setCurrentUser",t),e.bannerPreview=null}).catch(function(t){e.bannerUploadError=e.$t("upload.error.base")+" "+t.message}).then(function(){e.bannerUploading=!1}))},submitBackground:function(t){var e=this;(this.backgroundPreview||""===t)&&(this.backgroundUploading=!0,this.$store.state.api.backendInteractor.updateProfileImages({background:t}).then(function(t){t.error?e.backgroundUploadError=e.$t("upload.error.base")+t.error:(e.$store.commit("addNewUsers",[t]),e.$store.commit("setCurrentUser",t),e.backgroundPreview=null),e.backgroundUploading=!1}))}}};var Jt=function(t){s(618)},Qt=Object(o.a)(Kt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"profile-tab"},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.name_bio")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.name")))]),t._v(" "),s("EmojiInput",{attrs:{"enable-emoji-picker":"",suggest:t.emojiSuggestor},model:{value:t.newName,callback:function(e){t.newName=e},expression:"newName"}},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.newName,expression:"newName"}],attrs:{id:"username",classname:"name-changer"},domProps:{value:t.newName},on:{input:function(e){e.target.composing||(t.newName=e.target.value)}}})]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.bio")))]),t._v(" "),s("EmojiInput",{attrs:{"enable-emoji-picker":"",suggest:t.emojiUserSuggestor},model:{value:t.newBio,callback:function(e){t.newBio=e},expression:"newBio"}},[s("textarea",{directives:[{name:"model",rawName:"v-model",value:t.newBio,expression:"newBio"}],attrs:{classname:"bio"},domProps:{value:t.newBio},on:{input:function(e){e.target.composing||(t.newBio=e.target.value)}}})]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.newLocked,callback:function(e){t.newLocked=e},expression:"newLocked"}},[t._v("\n "+t._s(t.$t("settings.lock_account_description"))+"\n ")])],1),t._v(" "),s("div",[s("label",{attrs:{for:"default-vis"}},[t._v(t._s(t.$t("settings.default_vis")))]),t._v(" "),s("div",{staticClass:"visibility-tray",attrs:{id:"default-vis"}},[s("scope-selector",{attrs:{"show-all":!0,"user-default":t.newDefaultScope,"initial-scope":t.newDefaultScope,"on-scope-change":t.changeVis}})],1)]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.newNoRichText,callback:function(e){t.newNoRichText=e},expression:"newNoRichText"}},[t._v("\n "+t._s(t.$t("settings.no_rich_text_description"))+"\n ")])],1),t._v(" "),s("p",[s("Checkbox",{model:{value:t.hideFollows,callback:function(e){t.hideFollows=e},expression:"hideFollows"}},[t._v("\n "+t._s(t.$t("settings.hide_follows_description"))+"\n ")])],1),t._v(" "),s("p",{staticClass:"setting-subitem"},[s("Checkbox",{attrs:{disabled:!t.hideFollows},model:{value:t.hideFollowsCount,callback:function(e){t.hideFollowsCount=e},expression:"hideFollowsCount"}},[t._v("\n "+t._s(t.$t("settings.hide_follows_count_description"))+"\n ")])],1),t._v(" "),s("p",[s("Checkbox",{model:{value:t.hideFollowers,callback:function(e){t.hideFollowers=e},expression:"hideFollowers"}},[t._v("\n "+t._s(t.$t("settings.hide_followers_description"))+"\n ")])],1),t._v(" "),s("p",{staticClass:"setting-subitem"},[s("Checkbox",{attrs:{disabled:!t.hideFollowers},model:{value:t.hideFollowersCount,callback:function(e){t.hideFollowersCount=e},expression:"hideFollowersCount"}},[t._v("\n "+t._s(t.$t("settings.hide_followers_count_description"))+"\n ")])],1),t._v(" "),s("p",[s("Checkbox",{model:{value:t.allowFollowingMove,callback:function(e){t.allowFollowingMove=e},expression:"allowFollowingMove"}},[t._v("\n "+t._s(t.$t("settings.allow_following_move"))+"\n ")])],1),t._v(" "),"admin"===t.role||"moderator"===t.role?s("p",[s("Checkbox",{model:{value:t.showRole,callback:function(e){t.showRole=e},expression:"showRole"}},["admin"===t.role?[t._v("\n "+t._s(t.$t("settings.show_admin_badge"))+"\n ")]:t._e(),t._v(" "),"moderator"===t.role?[t._v("\n "+t._s(t.$t("settings.show_moderator_badge"))+"\n ")]:t._e()],2)],1):t._e(),t._v(" "),s("p",[s("Checkbox",{model:{value:t.discoverable,callback:function(e){t.discoverable=e},expression:"discoverable"}},[t._v("\n "+t._s(t.$t("settings.discoverable"))+"\n ")])],1),t._v(" "),t.maxFields>0?s("div",[s("p",[t._v(t._s(t.$t("settings.profile_fields.label")))]),t._v(" "),t._l(t.newFields,function(e,a){return s("div",{key:a,staticClass:"profile-fields"},[s("EmojiInput",{attrs:{"enable-emoji-picker":"","hide-emoji-button":"",suggest:t.userSuggestor},model:{value:t.newFields[a].name,callback:function(e){t.$set(t.newFields[a],"name",e)},expression:"newFields[i].name"}},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.newFields[a].name,expression:"newFields[i].name"}],attrs:{placeholder:t.$t("settings.profile_fields.name")},domProps:{value:t.newFields[a].name},on:{input:function(e){e.target.composing||t.$set(t.newFields[a],"name",e.target.value)}}})]),t._v(" "),s("EmojiInput",{attrs:{"enable-emoji-picker":"","hide-emoji-button":"",suggest:t.userSuggestor},model:{value:t.newFields[a].value,callback:function(e){t.$set(t.newFields[a],"value",e)},expression:"newFields[i].value"}},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.newFields[a].value,expression:"newFields[i].value"}],attrs:{placeholder:t.$t("settings.profile_fields.value")},domProps:{value:t.newFields[a].value},on:{input:function(e){e.target.composing||t.$set(t.newFields[a],"value",e.target.value)}}})]),t._v(" "),s("div",{staticClass:"icon-container"},[s("i",{directives:[{name:"show",rawName:"v-show",value:t.newFields.length>1,expression:"newFields.length > 1"}],staticClass:"icon-cancel",on:{click:function(e){return t.deleteField(a)}}})])],1)}),t._v(" "),t.newFields.length0?s("li",[s("div",[t._v("\n "+t._s(t.$t("settings.post_status_content_type"))+"\n "),s("label",{staticClass:"select",attrs:{for:"postContentType"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.postContentType,expression:"postContentType"}],attrs:{id:"postContentType"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.postContentType=e.target.multiple?s:s[0]}}},t._l(t.postFormats,function(e){return s("option",{key:e,domProps:{value:e}},[t._v("\n "+t._s(t.$t('post_status.content_type["'+e+'"]'))+"\n "+t._s(t.postContentTypeDefaultValue===e?t.$t("settings.instance_default_simple"):"")+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})])])]):t._e(),t._v(" "),s("li",[s("Checkbox",{model:{value:t.minimalScopesMode,callback:function(e){t.minimalScopesMode=e},expression:"minimalScopesMode"}},[t._v("\n "+t._s(t.$t("settings.minimal_scopes_mode"))+" "+t._s(t.$t("settings.instance_default",{value:t.minimalScopesModeLocalizedValue}))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.autohideFloatingPostButton,callback:function(e){t.autohideFloatingPostButton=e},expression:"autohideFloatingPostButton"}},[t._v("\n "+t._s(t.$t("settings.autohide_floating_post_button"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.padEmoji,callback:function(e){t.padEmoji=e},expression:"padEmoji"}},[t._v("\n "+t._s(t.$t("settings.pad_emoji"))+"\n ")])],1)])]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.attachments")))]),t._v(" "),s("ul",{staticClass:"setting-list"},[s("li",[s("Checkbox",{model:{value:t.hideAttachments,callback:function(e){t.hideAttachments=e},expression:"hideAttachments"}},[t._v("\n "+t._s(t.$t("settings.hide_attachments_in_tl"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.hideAttachmentsInConv,callback:function(e){t.hideAttachmentsInConv=e},expression:"hideAttachmentsInConv"}},[t._v("\n "+t._s(t.$t("settings.hide_attachments_in_convo"))+"\n ")])],1),t._v(" "),s("li",[s("label",{attrs:{for:"maxThumbnails"}},[t._v("\n "+t._s(t.$t("settings.max_thumbnails"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model.number",value:t.maxThumbnails,expression:"maxThumbnails",modifiers:{number:!0}}],staticClass:"number-input",attrs:{id:"maxThumbnails",type:"number",min:"0",step:"1"},domProps:{value:t.maxThumbnails},on:{input:function(e){e.target.composing||(t.maxThumbnails=t._n(e.target.value))},blur:function(e){return t.$forceUpdate()}}})]),t._v(" "),s("li",[s("Checkbox",{model:{value:t.hideNsfw,callback:function(e){t.hideNsfw=e},expression:"hideNsfw"}},[t._v("\n "+t._s(t.$t("settings.nsfw_clickthrough"))+"\n ")])],1),t._v(" "),s("ul",{staticClass:"setting-list suboptions"},[s("li",[s("Checkbox",{attrs:{disabled:!t.hideNsfw},model:{value:t.preloadImage,callback:function(e){t.preloadImage=e},expression:"preloadImage"}},[t._v("\n "+t._s(t.$t("settings.preload_images"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{attrs:{disabled:!t.hideNsfw},model:{value:t.useOneClickNsfw,callback:function(e){t.useOneClickNsfw=e},expression:"useOneClickNsfw"}},[t._v("\n "+t._s(t.$t("settings.use_one_click_nsfw"))+"\n ")])],1)]),t._v(" "),s("li",[s("Checkbox",{model:{value:t.stopGifs,callback:function(e){t.stopGifs=e},expression:"stopGifs"}},[t._v("\n "+t._s(t.$t("settings.stop_gifs"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.loopVideo,callback:function(e){t.loopVideo=e},expression:"loopVideo"}},[t._v("\n "+t._s(t.$t("settings.loop_video"))+"\n ")]),t._v(" "),s("ul",{staticClass:"setting-list suboptions",class:[{disabled:!t.streaming}]},[s("li",[s("Checkbox",{attrs:{disabled:!t.loopVideo||!t.loopSilentAvailable},model:{value:t.loopVideoSilentOnly,callback:function(e){t.loopVideoSilentOnly=e},expression:"loopVideoSilentOnly"}},[t._v("\n "+t._s(t.$t("settings.loop_video_silent_only"))+"\n ")]),t._v(" "),t.loopSilentAvailable?t._e():s("div",{staticClass:"unavailable"},[s("i",{staticClass:"icon-globe"}),t._v("! "+t._s(t.$t("settings.limited_availability"))+"\n ")])],1)])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.playVideosInModal,callback:function(e){t.playVideosInModal=e},expression:"playVideosInModal"}},[t._v("\n "+t._s(t.$t("settings.play_videos_in_modal"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.useContainFit,callback:function(e){t.useContainFit=e},expression:"useContainFit"}},[t._v("\n "+t._s(t.$t("settings.use_contain_fit"))+"\n ")])],1)])]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.notifications")))]),t._v(" "),s("ul",{staticClass:"setting-list"},[s("li",[s("Checkbox",{model:{value:t.webPushNotifications,callback:function(e){t.webPushNotifications=e},expression:"webPushNotifications"}},[t._v("\n "+t._s(t.$t("settings.enable_web_push_notifications"))+"\n ")])],1)])]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.fun")))]),t._v(" "),s("ul",{staticClass:"setting-list"},[s("li",[s("Checkbox",{model:{value:t.greentext,callback:function(e){t.greentext=e},expression:"greentext"}},[t._v("\n "+t._s(t.$t("settings.greentext"))+" "+t._s(t.$t("settings.instance_default",{value:t.greentextLocalizedValue}))+"\n ")])],1)])])])},[],!1,null,null,null).exports,ne={data:function(){var t=this.$store.state.instance;return{backendVersion:t.backendVersion,frontendVersion:t.frontendVersion}},computed:{frontendVersionLink:function(){return"https://git.pleroma.social/pleroma/pleroma-fe/commit/"+this.frontendVersion},backendVersionLink:function(){return"https://git.pleroma.social/pleroma/pleroma/commit/"+(t=this.backendVersion,(e=t.match(/-g(\w+)/i))?e[1]:"");var t,e}}},oe=Object(o.a)(ne,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.version.title")}},[s("div",{staticClass:"setting-item"},[s("ul",{staticClass:"setting-list"},[s("li",[s("p",[t._v(t._s(t.$t("settings.version.backend_version")))]),t._v(" "),s("ul",{staticClass:"option-list"},[s("li",[s("a",{attrs:{href:t.backendVersionLink,target:"_blank"}},[t._v(t._s(t.backendVersion))])])])]),t._v(" "),s("li",[s("p",[t._v(t._s(t.$t("settings.version.frontend_version")))]),t._v(" "),s("ul",{staticClass:"option-list"},[s("li",[s("a",{attrs:{href:t.frontendVersionLink,target:"_blank"}},[t._v(t._s(t.frontendVersion))])])])])])])])},[],!1,null,null,null).exports,ie=s(9),re=s(32),le=s(29),ce=s(39),ue={components:{Checkbox:d.a},props:{name:{required:!0,type:String},label:{required:!0,type:String},value:{required:!1,type:String,default:void 0},fallback:{required:!1,type:String,default:void 0},disabled:{required:!1,type:Boolean,default:!1},showOptionalTickbox:{required:!1,type:Boolean,default:!0}},computed:{present:function(){return void 0!==this.value},validColor:function(){return Object(ie.f)(this.value||this.fallback)},transparentColor:function(){return"transparent"===this.value},computedColor:function(){return this.value&&this.value.startsWith("--")}}};var de=function(t){s(626),s(628)},pe=Object(o.a)(ue,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"color-input style-control",class:{disabled:!t.present||t.disabled}},[s("label",{staticClass:"label",attrs:{for:t.name}},[t._v("\n "+t._s(t.label)+"\n ")]),t._v(" "),void 0!==t.fallback&&t.showOptionalTickbox?s("Checkbox",{staticClass:"opt",attrs:{checked:t.present,disabled:t.disabled},on:{change:function(e){return t.$emit("input",void 0===t.value?t.fallback:void 0)}}}):t._e(),t._v(" "),s("div",{staticClass:"input color-input-field"},[s("input",{staticClass:"textColor unstyled",attrs:{id:t.name+"-t",type:"text",disabled:!t.present||t.disabled},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}}),t._v(" "),t.validColor?s("input",{staticClass:"nativeColor unstyled",attrs:{id:t.name,type:"color",disabled:!t.present||t.disabled},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}}):t._e(),t._v(" "),t.transparentColor?s("div",{staticClass:"transparentIndicator"}):t._e(),t._v(" "),t.computedColor?s("div",{staticClass:"computedIndicator",style:{backgroundColor:t.fallback}}):t._e()])],1)},[],!1,de,null,null).exports,me=Object(o.a)({props:["name","value","fallback","disabled","label","max","min","step","hardMin","hardMax"],computed:{present:function(){return void 0!==this.value}}},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"range-control style-control",class:{disabled:!t.present||t.disabled}},[s("label",{staticClass:"label",attrs:{for:t.name}},[t._v("\n "+t._s(t.label)+"\n ")]),t._v(" "),void 0!==t.fallback?s("input",{staticClass:"opt",attrs:{id:t.name+"-o",type:"checkbox"},domProps:{checked:t.present},on:{input:function(e){return t.$emit("input",t.present?void 0:t.fallback)}}}):t._e(),t._v(" "),void 0!==t.fallback?s("label",{staticClass:"opt-l",attrs:{for:t.name+"-o"}}):t._e(),t._v(" "),s("input",{staticClass:"input-number",attrs:{id:t.name,type:"range",disabled:!t.present||t.disabled,max:t.max||t.hardMax||100,min:t.min||t.hardMin||0,step:t.step||1},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}}),t._v(" "),s("input",{staticClass:"input-number",attrs:{id:t.name,type:"number",disabled:!t.present||t.disabled,max:t.hardMax,min:t.hardMin,step:t.step||1},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}})])},[],!1,null,null,null).exports,ve={components:{Checkbox:d.a},props:["name","value","fallback","disabled"],computed:{present:function(){return void 0!==this.value}}},he=Object(o.a)(ve,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"opacity-control style-control",class:{disabled:!t.present||t.disabled}},[s("label",{staticClass:"label",attrs:{for:t.name}},[t._v("\n "+t._s(t.$t("settings.style.common.opacity"))+"\n ")]),t._v(" "),void 0!==t.fallback?s("Checkbox",{staticClass:"opt",attrs:{checked:t.present,disabled:t.disabled},on:{change:function(e){return t.$emit("input",t.present?void 0:t.fallback)}}}):t._e(),t._v(" "),s("input",{staticClass:"input-number",attrs:{id:t.name,type:"number",disabled:!t.present||t.disabled,max:"1",min:"0",step:".05"},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}})],1)},[],!1,null,null,null).exports;function be(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}var fe=function(){return function(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:{})},ge={props:["value","fallback","ready"],data:function(){return{selectedId:0,cValue:(this.value||this.fallback||[]).map(fe)}},components:{ColorInput:pe,OpacityInput:he},methods:{add:function(){this.cValue.push(fe(this.selected)),this.selectedId=this.cValue.length-1},del:function(){this.cValue.splice(this.selectedId,1),this.selectedId=0===this.cValue.length?void 0:Math.max(this.selectedId-1,0)},moveUp:function(){var t=this.cValue.splice(this.selectedId,1)[0];this.cValue.splice(this.selectedId-1,0,t),this.selectedId-=1},moveDn:function(){var t=this.cValue.splice(this.selectedId,1)[0];this.cValue.splice(this.selectedId+1,0,t),this.selectedId+=1}},beforeUpdate:function(){this.cValue=this.value||this.fallback},computed:{anyShadows:function(){return this.cValue.length>0},anyShadowsFallback:function(){return this.fallback.length>0},selected:function(){return this.ready&&this.anyShadows?this.cValue[this.selectedId]:fe({})},currentFallback:function(){return this.ready&&this.anyShadowsFallback?this.fallback[this.selectedId]:fe({})},moveUpValid:function(){return this.ready&&this.selectedId>0},moveDnValid:function(){return this.ready&&this.selectedId-1:t.selected.inset},on:{change:function(e){var s=t.selected.inset,a=e.target,n=!!a.checked;if(Array.isArray(s)){var o=t._i(s,null);a.checked?o<0&&t.$set(t.selected,"inset",s.concat([null])):o>-1&&t.$set(t.selected,"inset",s.slice(0,o).concat(s.slice(o+1)))}else t.$set(t.selected,"inset",n)}}}),t._v(" "),s("label",{staticClass:"checkbox-label",attrs:{for:"inset"}})]),t._v(" "),s("div",{staticClass:"blur-control style-control",attrs:{disabled:!t.present}},[s("label",{staticClass:"label",attrs:{for:"spread"}},[t._v("\n "+t._s(t.$t("settings.style.shadows.blur"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.blur,expression:"selected.blur"}],staticClass:"input-range",attrs:{id:"blur",disabled:!t.present,name:"blur",type:"range",max:"20",min:"0"},domProps:{value:t.selected.blur},on:{__r:function(e){return t.$set(t.selected,"blur",e.target.value)}}}),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.blur,expression:"selected.blur"}],staticClass:"input-number",attrs:{disabled:!t.present,type:"number",min:"0"},domProps:{value:t.selected.blur},on:{input:function(e){e.target.composing||t.$set(t.selected,"blur",e.target.value)}}})]),t._v(" "),s("div",{staticClass:"spread-control style-control",attrs:{disabled:!t.present}},[s("label",{staticClass:"label",attrs:{for:"spread"}},[t._v("\n "+t._s(t.$t("settings.style.shadows.spread"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.spread,expression:"selected.spread"}],staticClass:"input-range",attrs:{id:"spread",disabled:!t.present,name:"spread",type:"range",max:"20",min:"-20"},domProps:{value:t.selected.spread},on:{__r:function(e){return t.$set(t.selected,"spread",e.target.value)}}}),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.spread,expression:"selected.spread"}],staticClass:"input-number",attrs:{disabled:!t.present,type:"number"},domProps:{value:t.selected.spread},on:{input:function(e){e.target.composing||t.$set(t.selected,"spread",e.target.value)}}})]),t._v(" "),s("ColorInput",{attrs:{disabled:!t.present,label:t.$t("settings.style.common.color"),fallback:t.currentFallback.color,"show-optional-tickbox":!1,name:"shadow"},model:{value:t.selected.color,callback:function(e){t.$set(t.selected,"color",e)},expression:"selected.color"}}),t._v(" "),s("OpacityInput",{attrs:{disabled:!t.present},model:{value:t.selected.alpha,callback:function(e){t.$set(t.selected,"alpha",e)},expression:"selected.alpha"}}),t._v(" "),s("i18n",{attrs:{path:"settings.style.shadows.hintV3",tag:"p"}},[s("code",[t._v("--variable,mod")])])],1)])},[],!1,_e,null,null).exports,Ce={props:["name","label","value","fallback","options","no-inherit"],data:function(){return{lValue:this.value,availableOptions:[this.noInherit?"":"inherit","custom"].concat(z()(this.options||[]),["serif","monospace","sans-serif"]).filter(function(t){return t})}},beforeUpdate:function(){this.lValue=this.value},computed:{present:function(){return void 0!==this.lValue},dValue:function(){return this.lValue||this.fallback||{}},family:{get:function(){return this.dValue.family},set:function(t){Object(q.set)(this.lValue,"family",t),this.$emit("input",this.lValue)}},isCustom:function(){return"custom"===this.preset},preset:{get:function(){return"serif"===this.family||"sans-serif"===this.family||"monospace"===this.family||"inherit"===this.family?this.family:"custom"},set:function(t){this.family="custom"===t?"":t}}}};var xe=function(t){s(632)},ke=Object(o.a)(Ce,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"font-control style-control",class:{custom:t.isCustom}},[s("label",{staticClass:"label",attrs:{for:"custom"===t.preset?t.name:t.name+"-font-switcher"}},[t._v("\n "+t._s(t.label)+"\n ")]),t._v(" "),void 0!==t.fallback?s("input",{staticClass:"opt exlcude-disabled",attrs:{id:t.name+"-o",type:"checkbox"},domProps:{checked:t.present},on:{input:function(e){return t.$emit("input",void 0===t.value?t.fallback:void 0)}}}):t._e(),t._v(" "),void 0!==t.fallback?s("label",{staticClass:"opt-l",attrs:{for:t.name+"-o"}}):t._e(),t._v(" "),s("label",{staticClass:"select",attrs:{for:t.name+"-font-switcher",disabled:!t.present}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.preset,expression:"preset"}],staticClass:"font-switcher",attrs:{id:t.name+"-font-switcher",disabled:!t.present},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.preset=e.target.multiple?s:s[0]}}},t._l(t.availableOptions,function(e){return s("option",{key:e,domProps:{value:e}},[t._v("\n "+t._s("custom"===e?t.$t("settings.style.fonts.custom"):e)+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})]),t._v(" "),t.isCustom?s("input",{directives:[{name:"model",rawName:"v-model",value:t.family,expression:"family"}],staticClass:"custom-font",attrs:{id:t.name,type:"text"},domProps:{value:t.family},on:{input:function(e){e.target.composing||(t.family=e.target.value)}}}):t._e()])},[],!1,xe,null,null).exports,ye={props:{large:{required:!1},contrast:{required:!1,type:Object}},computed:{hint:function(){var t=this.contrast.aaa?"aaa":this.contrast.aa?"aa":"bad",e=this.$t("settings.style.common.contrast.level.".concat(t)),s=this.$t("settings.style.common.contrast.context.text"),a=this.contrast.text;return this.$t("settings.style.common.contrast.hint",{level:e,context:s,ratio:a})},hint_18pt:function(){var t=this.contrast.laaa?"aaa":this.contrast.laa?"aa":"bad",e=this.$t("settings.style.common.contrast.level.".concat(t)),s=this.$t("settings.style.common.contrast.context.18pt"),a=this.contrast.text;return this.$t("settings.style.common.contrast.hint",{level:e,context:s,ratio:a})}}};var $e=function(t){s(634)},Le=Object(o.a)(ye,function(){var t=this,e=t.$createElement,s=t._self._c||e;return t.contrast?s("span",{staticClass:"contrast-ratio"},[s("span",{staticClass:"rating",attrs:{title:t.hint}},[t.contrast.aaa?s("span",[s("i",{staticClass:"icon-thumbs-up-alt"})]):t._e(),t._v(" "),!t.contrast.aaa&&t.contrast.aa?s("span",[s("i",{staticClass:"icon-adjust"})]):t._e(),t._v(" "),t.contrast.aaa||t.contrast.aa?t._e():s("span",[s("i",{staticClass:"icon-attention"})])]),t._v(" "),t.contrast&&t.large?s("span",{staticClass:"rating",attrs:{title:t.hint_18pt}},[t.contrast.laaa?s("span",[s("i",{staticClass:"icon-thumbs-up-alt"})]):t._e(),t._v(" "),!t.contrast.laaa&&t.contrast.laa?s("span",[s("i",{staticClass:"icon-adjust"})]):t._e(),t._v(" "),t.contrast.laaa||t.contrast.laa?t._e():s("span",[s("i",{staticClass:"icon-attention"})])]):t._e()]):t._e()},[],!1,$e,null,null).exports,Te={props:["exportObject","importLabel","exportLabel","importFailedText","validator","onImport","onImportFailure"],data:function(){return{importFailed:!1}},methods:{exportData:function(){var t=JSON.stringify(this.exportObject,null,2),e=document.createElement("a");e.setAttribute("download","pleroma_theme.json"),e.setAttribute("href","data:application/json;base64,"+window.btoa(t)),e.style.display="none",document.body.appendChild(e),e.click(),document.body.removeChild(e)},importData:function(){var t=this;this.importFailed=!1;var e=document.createElement("input");e.setAttribute("type","file"),e.setAttribute("accept",".json"),e.addEventListener("change",function(e){if(e.target.files[0]){var s=new FileReader;s.onload=function(e){var s=e.target;try{var a=JSON.parse(s.result);t.validator(a)?t.onImport(a):t.importFailed=!0}catch(e){t.importFailed=!0}},s.readAsText(e.target.files[0])}}),document.body.appendChild(e),e.click(),document.body.removeChild(e)}}};var Oe=function(t){s(636)},Pe=Object(o.a)(Te,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"import-export-container"},[t._t("before"),t._v(" "),s("button",{staticClass:"btn",on:{click:t.exportData}},[t._v("\n "+t._s(t.exportLabel)+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.importData}},[t._v("\n "+t._s(t.importLabel)+"\n ")]),t._v(" "),t._t("afterButtons"),t._v(" "),t.importFailed?s("p",{staticClass:"alert error"},[t._v("\n "+t._s(t.importFailedText)+"\n ")]):t._e(),t._v(" "),t._t("afterError")],2)},[],!1,Oe,null,null).exports;var Se=function(t){s(638)},Ie=Object(o.a)(null,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"preview-container"},[s("div",{staticClass:"underlay underlay-preview"}),t._v(" "),s("div",{staticClass:"panel dummy"},[s("div",{staticClass:"panel-heading"},[s("div",{staticClass:"title"},[t._v("\n "+t._s(t.$t("settings.style.preview.header"))+"\n "),s("span",{staticClass:"badge badge-notification"},[t._v("\n 99\n ")])]),t._v(" "),s("span",{staticClass:"faint"},[t._v("\n "+t._s(t.$t("settings.style.preview.header_faint"))+"\n ")]),t._v(" "),s("span",{staticClass:"alert error"},[t._v("\n "+t._s(t.$t("settings.style.preview.error"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn"},[t._v("\n "+t._s(t.$t("settings.style.preview.button"))+"\n ")])]),t._v(" "),s("div",{staticClass:"panel-body theme-preview-content"},[s("div",{staticClass:"post"},[s("div",{staticClass:"avatar still-image"},[t._v("\n ( ͡° ͜ʖ ͡°)\n ")]),t._v(" "),s("div",{staticClass:"content"},[s("h4",[t._v("\n "+t._s(t.$t("settings.style.preview.content"))+"\n ")]),t._v(" "),s("i18n",{attrs:{path:"settings.style.preview.text"}},[s("code",{staticStyle:{"font-family":"var(--postCodeFont)"}},[t._v("\n "+t._s(t.$t("settings.style.preview.mono"))+"\n ")]),t._v(" "),s("a",{staticStyle:{color:"var(--link)"}},[t._v("\n "+t._s(t.$t("settings.style.preview.link"))+"\n ")])]),t._v(" "),t._m(0)],1)]),t._v(" "),s("div",{staticClass:"after-post"},[s("div",{staticClass:"avatar-alt"},[t._v("\n :^)\n ")]),t._v(" "),s("div",{staticClass:"content"},[s("i18n",{staticClass:"faint",attrs:{path:"settings.style.preview.fine_print",tag:"span"}},[s("a",{staticStyle:{color:"var(--faintLink)"}},[t._v("\n "+t._s(t.$t("settings.style.preview.faint_link"))+"\n ")])])],1)]),t._v(" "),s("div",{staticClass:"separator"}),t._v(" "),s("span",{staticClass:"alert error"},[t._v("\n "+t._s(t.$t("settings.style.preview.error"))+"\n ")]),t._v(" "),s("input",{attrs:{type:"text"},domProps:{value:t.$t("settings.style.preview.input")}}),t._v(" "),s("div",{staticClass:"actions"},[s("span",{staticClass:"checkbox"},[s("input",{attrs:{id:"preview_checkbox",checked:"very yes",type:"checkbox"}}),t._v(" "),s("label",{attrs:{for:"preview_checkbox"}},[t._v(t._s(t.$t("settings.style.preview.checkbox")))])]),t._v(" "),s("button",{staticClass:"btn"},[t._v("\n "+t._s(t.$t("settings.style.preview.button"))+"\n ")])])])])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"icons"},[e("i",{staticClass:"button-icon icon-reply",staticStyle:{color:"var(--cBlue)"}}),this._v(" "),e("i",{staticClass:"button-icon icon-retweet",staticStyle:{color:"var(--cGreen)"}}),this._v(" "),e("i",{staticClass:"button-icon icon-star",staticStyle:{color:"var(--cOrange)"}}),this._v(" "),e("i",{staticClass:"button-icon icon-cancel",staticStyle:{color:"var(--cRed)"}})])}],!1,Se,null,null).exports;function je(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}function Ee(t){for(var e=1;ece.a)return t(e+"future_version_imported")+" "+t(i?e+"snapshot_missing":e+"snapshot_present");if(nce.a)return t(e+"fe_downgraded")+" "+t(i?e+"migration_snapshot_ok":e+"migration_snapshot_gone");if(n=4.5,aaa:s>=7,laa:s>=3,laaa:s>=4.5},t},{})}catch(t){console.warn("Failure computing contrasts",t)}},previewRules:function(){return this.preview.rules?[].concat(z()(Object.values(this.preview.rules)),["color: var(--text)","font-family: var(--interfaceFont, sans-serif)"]).join(";"):""},shadowsAvailable:function(){return Object.keys(re.a).sort()},currentShadowOverriden:{get:function(){return!!this.currentShadow},set:function(t){t?Object(q.set)(this.shadowsLocal,this.shadowSelected,this.currentShadowFallback.map(function(t){return Object.assign({},t)})):Object(q.delete)(this.shadowsLocal,this.shadowSelected)}},currentShadowFallback:function(){return(this.previewTheme.shadows||{})[this.shadowSelected]},currentShadow:{get:function(){return this.shadowsLocal[this.shadowSelected]},set:function(t){Object(q.set)(this.shadowsLocal,this.shadowSelected,t)}},themeValid:function(){return!this.shadowsInvalid&&!this.colorsInvalid&&!this.radiiInvalid},exportedTheme:function(){var t=!(this.keepFonts||this.keepShadows||this.keepOpacity||this.keepRoundness||this.keepColor),e={themeEngineVersion:ce.a};return(this.keepFonts||t)&&(e.fonts=this.fontsLocal),(this.keepShadows||t)&&(e.shadows=this.shadowsLocal),(this.keepOpacity||t)&&(e.opacity=this.currentOpacity),(this.keepColor||t)&&(e.colors=this.currentColors),(this.keepRoundness||t)&&(e.radii=this.currentRadii),{_pleroma_theme_version:2,theme:Ee({themeEngineVersion:ce.a},this.previewTheme),source:e}}},components:{ColorInput:pe,OpacityInput:he,RangeInput:me,ContrastRatio:Le,ShadowControl:we,FontControl:ke,TabSwitcher:a.a,Preview:Ie,ExportImport:Pe,Checkbox:d.a},methods:{loadTheme:function(t,e){var s=t.theme,a=t.source,n=t._pleroma_theme_version,o=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(this.dismissWarning(),!a&&!s)throw new Error("Can't load theme: empty");var i="localStorage"!==e||s.colors?n:"l1",r=(s||{}).themeEngineVersion,l=(a||{}).themeEngineVersion||2,c=l===ce.a,u=void 0!==s&&void 0!==a&&l!==r,d=a&&o||!s;c&&!u||d||"l1"===i||"defaults"===e||(u&&"localStorage"===e?this.themeWarning={origin:e,themeEngineVersion:l,type:"snapshot_source_mismatch"}:s?c||(this.themeWarning={origin:e,noActionsPossible:!a,themeEngineVersion:l,type:"wrong_version"}):this.themeWarning={origin:e,noActionsPossible:!0,themeEngineVersion:l,type:"no_snapshot_old_version"}),this.normalizeLocalState(s,i,a,d)},forceLoadLocalStorage:function(){this.loadThemeFromLocalStorage(!0)},dismissWarning:function(){this.themeWarning=void 0,this.tempImportFile=void 0},forceLoad:function(){switch(this.themeWarning.origin){case"localStorage":this.loadThemeFromLocalStorage(!0);break;case"file":this.onImport(this.tempImportFile,!0)}this.dismissWarning()},forceSnapshot:function(){switch(this.themeWarning.origin){case"localStorage":this.loadThemeFromLocalStorage(!1,!0);break;case"file":console.err("Forcing snapshout from file is not supported yet")}this.dismissWarning()},loadThemeFromLocalStorage:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],s=this.$store.getters.mergedConfig,a=s.customTheme,n=s.customThemeSource;a||n?this.loadTheme({theme:a,source:e?a:n},"localStorage",t):this.loadTheme(this.$store.state.instance.themeData,"defaults",t)},setCustomTheme:function(){this.$store.dispatch("setOption",{name:"customTheme",value:Ee({themeEngineVersion:ce.a},this.previewTheme)}),this.$store.dispatch("setOption",{name:"customThemeSource",value:{themeEngineVersion:ce.a,shadows:this.shadowsLocal,fonts:this.fontsLocal,opacity:this.currentOpacity,colors:this.currentColors,radii:this.currentRadii}})},updatePreviewColorsAndShadows:function(){this.previewColors=Object(re.e)({opacity:this.currentOpacity,colors:this.currentColors}),this.previewShadows=Object(re.h)({shadows:this.shadowsLocal,opacity:this.previewTheme.opacity,themeEngineVersion:this.engineVersion},this.previewColors.theme.colors,this.previewColors.mod)},onImport:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.tempImportFile=t,this.loadTheme(t,"file",e)},importValidator:function(t){var e=t._pleroma_theme_version;return e>=1||e<=2},clearAll:function(){this.loadThemeFromLocalStorage()},clearV1:function(){var t=this;Object.keys(this.$data).filter(function(t){return t.endsWith("ColorLocal")||t.endsWith("OpacityLocal")}).filter(function(t){return!Re.includes(t)}).forEach(function(e){Object(q.set)(t.$data,e,void 0)})},clearRoundness:function(){var t=this;Object.keys(this.$data).filter(function(t){return t.endsWith("RadiusLocal")}).forEach(function(e){Object(q.set)(t.$data,e,void 0)})},clearOpacity:function(){var t=this;Object.keys(this.$data).filter(function(t){return t.endsWith("OpacityLocal")}).forEach(function(e){Object(q.set)(t.$data,e,void 0)})},clearShadows:function(){this.shadowsLocal={}},clearFonts:function(){this.fontsLocal={}},normalizeLocalState:function(t){var e,s=this,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0,o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];void 0!==n&&(o||n.themeEngineVersion===ce.a)?(e=n,a=n.themeEngineVersion):e=t;var i=e.radii||e,r=e.opacity,l=e.shadows||{},c=e.fonts||{},u=e.themeEngineVersion?e.colors||e:Object(re.c)(e.colors||e);if(0===a&&(e.version&&(a=e.version),void 0===u.text&&void 0!==u.fg&&(a=1),void 0!==u.text&&void 0!==u.fg&&(a=2)),this.engineVersion=a,1===a&&(this.fgColorLocal=Object(ie.i)(u.btn),this.textColorLocal=Object(ie.i)(u.fg)),!this.keepColor){this.clearV1();var d=new Set(1!==a?Object.keys(le.c):[]);1!==a&&"l1"!==a||d.add("bg").add("link").add("cRed").add("cBlue").add("cGreen").add("cOrange"),d.forEach(function(t){var e=u[t],a=Object(ie.i)(u[t]);s[t+"ColorLocal"]="#aN"===a?e:a})}r&&!this.keepOpacity&&(this.clearOpacity(),Object.entries(r).forEach(function(t){var e=A()(t,2),a=e[0],n=e[1];null==n||Number.isNaN(n)||(s[a+"OpacityLocal"]=n)})),this.keepRoundness||(this.clearRoundness(),Object.entries(i).forEach(function(t){var e=A()(t,2),a=e[0],n=e[1],o=a.endsWith("Radius")?a.split("Radius")[0]:a;s[o+"RadiusLocal"]=n})),this.keepShadows||(this.clearShadows(),this.shadowsLocal=2===a?Object(re.m)(l,this.previewTheme.opacity):l,this.shadowSelected=this.shadowsAvailable[0]),this.keepFonts||(this.clearFonts(),this.fontsLocal=c)}},watch:{currentRadii:function(){try{this.previewRadii=Object(re.g)({radii:this.currentRadii}),this.radiiInvalid=!1}catch(t){this.radiiInvalid=!0,console.warn(t)}},shadowsLocal:{handler:function(){if(1!==Object.getOwnPropertyNames(this.previewColors).length)try{this.updatePreviewColorsAndShadows(),this.shadowsInvalid=!1}catch(t){this.shadowsInvalid=!0,console.warn(t)}},deep:!0},fontsLocal:{handler:function(){try{this.previewFonts=Object(re.f)({fonts:this.fontsLocal}),this.fontsInvalid=!1}catch(t){this.fontsInvalid=!0,console.warn(t)}},deep:!0},currentColors:function(){try{this.updatePreviewColorsAndShadows(),this.colorsInvalid=!1,this.shadowsInvalid=!1}catch(t){this.colorsInvalid=!0,this.shadowsInvalid=!0,console.warn(t)}},currentOpacity:function(){try{this.updatePreviewColorsAndShadows()}catch(t){console.warn(t)}},selected:function(){this.dismissWarning(),1===this.selectedVersion?(this.keepRoundness||this.clearRoundness(),this.keepShadows||this.clearShadows(),this.keepOpacity||this.clearOpacity(),this.keepColor||(this.clearV1(),this.bgColorLocal=this.selected[1],this.fgColorLocal=this.selected[2],this.textColorLocal=this.selected[3],this.linkColorLocal=this.selected[4],this.cRedColorLocal=this.selected[5],this.cGreenColorLocal=this.selected[6],this.cBlueColorLocal=this.selected[7],this.cOrangeColorLocal=this.selected[8])):this.selectedVersion>=2&&this.normalizeLocalState(this.selected.theme,2,this.selected.source)}}};var Fe=function(t){s(624)},Me=Object(o.a)(Be,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"theme-tab"},[s("div",{staticClass:"presets-container"},[s("div",{staticClass:"save-load"},[t.themeWarning?s("div",{staticClass:"theme-warning"},[s("div",{staticClass:"alert warning"},[t._v("\n "+t._s(t.themeWarningHelp)+"\n ")]),t._v(" "),s("div",{staticClass:"buttons"},["snapshot_source_mismatch"===t.themeWarning.type?[s("button",{staticClass:"btn",on:{click:t.forceLoad}},[t._v("\n "+t._s(t.$t("settings.style.switcher.use_source"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.forceSnapshot}},[t._v("\n "+t._s(t.$t("settings.style.switcher.use_snapshot"))+"\n ")])]:t.themeWarning.noActionsPossible?[s("button",{staticClass:"btn",on:{click:t.dismissWarning}},[t._v("\n "+t._s(t.$t("general.dismiss"))+"\n ")])]:[s("button",{staticClass:"btn",on:{click:t.forceLoad}},[t._v("\n "+t._s(t.$t("settings.style.switcher.load_theme"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.dismissWarning}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_as_is"))+"\n ")])]],2)]):t._e(),t._v(" "),s("ExportImport",{attrs:{"export-object":t.exportedTheme,"export-label":t.$t("settings.export_theme"),"import-label":t.$t("settings.import_theme"),"import-failed-text":t.$t("settings.invalid_theme_imported"),"on-import":t.onImport,validator:t.importValidator}},[s("template",{slot:"before"},[s("div",{staticClass:"presets"},[t._v("\n "+t._s(t.$t("settings.presets"))+"\n "),s("label",{staticClass:"select",attrs:{for:"preset-switcher"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.selected,expression:"selected"}],staticClass:"preset-switcher",attrs:{id:"preset-switcher"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.selected=e.target.multiple?s:s[0]}}},t._l(t.availableStyles,function(e){return s("option",{key:e.name,style:{backgroundColor:e[1]||(e.theme||e.source).colors.bg,color:e[3]||(e.theme||e.source).colors.text},domProps:{value:e}},[t._v("\n "+t._s(e[0]||e.name)+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})])])])],2)],1),t._v(" "),s("div",{staticClass:"save-load-options"},[s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepColor,callback:function(e){t.keepColor=e},expression:"keepColor"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_color"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepShadows,callback:function(e){t.keepShadows=e},expression:"keepShadows"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_shadows"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepOpacity,callback:function(e){t.keepOpacity=e},expression:"keepOpacity"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_opacity"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepRoundness,callback:function(e){t.keepRoundness=e},expression:"keepRoundness"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_roundness"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepFonts,callback:function(e){t.keepFonts=e},expression:"keepFonts"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_fonts"))+"\n ")])],1),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.switcher.save_load_hint")))])])]),t._v(" "),s("preview",{style:t.previewRules}),t._v(" "),s("keep-alive",[s("tab-switcher",{key:"style-tweak"},[s("div",{staticClass:"color-container",attrs:{label:t.$t("settings.style.common_colors._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.theme_help")))]),t._v(" "),s("div",{staticClass:"tab-header-buttons"},[s("button",{staticClass:"btn",on:{click:t.clearOpacity}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_opacity"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearV1}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])])]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.theme_help_v2_1")))]),t._v(" "),s("h4",[t._v(t._s(t.$t("settings.style.common_colors.main")))]),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"bgColor",label:t.$t("settings.background")},model:{value:t.bgColorLocal,callback:function(e){t.bgColorLocal=e},expression:"bgColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"bgOpacity",fallback:t.previewTheme.opacity.bg},model:{value:t.bgOpacityLocal,callback:function(e){t.bgOpacityLocal=e},expression:"bgOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"textColor",label:t.$t("settings.text")},model:{value:t.textColorLocal,callback:function(e){t.textColorLocal=e},expression:"textColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgText}}),t._v(" "),s("ColorInput",{attrs:{name:"accentColor",fallback:t.previewTheme.colors.link,label:t.$t("settings.accent"),"show-optional-tickbox":void 0!==t.linkColorLocal},model:{value:t.accentColorLocal,callback:function(e){t.accentColorLocal=e},expression:"accentColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"linkColor",fallback:t.previewTheme.colors.accent,label:t.$t("settings.links"),"show-optional-tickbox":void 0!==t.accentColorLocal},model:{value:t.linkColorLocal,callback:function(e){t.linkColorLocal=e},expression:"linkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"fgColor",label:t.$t("settings.foreground")},model:{value:t.fgColorLocal,callback:function(e){t.fgColorLocal=e},expression:"fgColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"fgTextColor",label:t.$t("settings.text"),fallback:t.previewTheme.colors.fgText},model:{value:t.fgTextColorLocal,callback:function(e){t.fgTextColorLocal=e},expression:"fgTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"fgLinkColor",label:t.$t("settings.links"),fallback:t.previewTheme.colors.fgLink},model:{value:t.fgLinkColorLocal,callback:function(e){t.fgLinkColorLocal=e},expression:"fgLinkColorLocal"}}),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.common_colors.foreground_hint")))])],1),t._v(" "),s("h4",[t._v(t._s(t.$t("settings.style.common_colors.rgbo")))]),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"cRedColor",label:t.$t("settings.cRed")},model:{value:t.cRedColorLocal,callback:function(e){t.cRedColorLocal=e},expression:"cRedColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCRed}}),t._v(" "),s("ColorInput",{attrs:{name:"cBlueColor",label:t.$t("settings.cBlue")},model:{value:t.cBlueColorLocal,callback:function(e){t.cBlueColorLocal=e},expression:"cBlueColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCBlue}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"cGreenColor",label:t.$t("settings.cGreen")},model:{value:t.cGreenColorLocal,callback:function(e){t.cGreenColorLocal=e},expression:"cGreenColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCGreen}}),t._v(" "),s("ColorInput",{attrs:{name:"cOrangeColor",label:t.$t("settings.cOrange")},model:{value:t.cOrangeColorLocal,callback:function(e){t.cOrangeColorLocal=e},expression:"cOrangeColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCOrange}})],1),t._v(" "),s("p",[t._v(t._s(t.$t("settings.theme_help_v2_2")))])]),t._v(" "),s("div",{staticClass:"color-container",attrs:{label:t.$t("settings.style.advanced_colors._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.theme_help")))]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearOpacity}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_opacity"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearV1}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.post")))]),t._v(" "),s("ColorInput",{attrs:{name:"postLinkColor",fallback:t.previewTheme.colors.accent,label:t.$t("settings.links")},model:{value:t.postLinkColorLocal,callback:function(e){t.postLinkColorLocal=e},expression:"postLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.postLink}}),t._v(" "),s("ColorInput",{attrs:{name:"postGreentextColor",fallback:t.previewTheme.colors.cGreen,label:t.$t("settings.greentext")},model:{value:t.postGreentextColorLocal,callback:function(e){t.postGreentextColorLocal=e},expression:"postGreentextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.postGreentext}}),t._v(" "),s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.alert")))]),t._v(" "),s("ColorInput",{attrs:{name:"alertError",label:t.$t("settings.style.advanced_colors.alert_error"),fallback:t.previewTheme.colors.alertError},model:{value:t.alertErrorColorLocal,callback:function(e){t.alertErrorColorLocal=e},expression:"alertErrorColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertErrorText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.alertErrorText},model:{value:t.alertErrorTextColorLocal,callback:function(e){t.alertErrorTextColorLocal=e},expression:"alertErrorTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.alertErrorText,large:"true"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertWarning",label:t.$t("settings.style.advanced_colors.alert_warning"),fallback:t.previewTheme.colors.alertWarning},model:{value:t.alertWarningColorLocal,callback:function(e){t.alertWarningColorLocal=e},expression:"alertWarningColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertWarningText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.alertWarningText},model:{value:t.alertWarningTextColorLocal,callback:function(e){t.alertWarningTextColorLocal=e},expression:"alertWarningTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.alertWarningText,large:"true"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertNeutral",label:t.$t("settings.style.advanced_colors.alert_neutral"),fallback:t.previewTheme.colors.alertNeutral},model:{value:t.alertNeutralColorLocal,callback:function(e){t.alertNeutralColorLocal=e},expression:"alertNeutralColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertNeutralText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.alertNeutralText},model:{value:t.alertNeutralTextColorLocal,callback:function(e){t.alertNeutralTextColorLocal=e},expression:"alertNeutralTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.alertNeutralText,large:"true"}}),t._v(" "),s("OpacityInput",{attrs:{name:"alertOpacity",fallback:t.previewTheme.opacity.alert},model:{value:t.alertOpacityLocal,callback:function(e){t.alertOpacityLocal=e},expression:"alertOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.badge")))]),t._v(" "),s("ColorInput",{attrs:{name:"badgeNotification",label:t.$t("settings.style.advanced_colors.badge_notification"),fallback:t.previewTheme.colors.badgeNotification},model:{value:t.badgeNotificationColorLocal,callback:function(e){t.badgeNotificationColorLocal=e},expression:"badgeNotificationColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"badgeNotificationText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.badgeNotificationText},model:{value:t.badgeNotificationTextColorLocal,callback:function(e){t.badgeNotificationTextColorLocal=e},expression:"badgeNotificationTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.badgeNotificationText,large:"true"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.panel_header")))]),t._v(" "),s("ColorInput",{attrs:{name:"panelColor",fallback:t.previewTheme.colors.panel,label:t.$t("settings.background")},model:{value:t.panelColorLocal,callback:function(e){t.panelColorLocal=e},expression:"panelColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"panelOpacity",fallback:t.previewTheme.opacity.panel,disabled:"transparent"===t.panelColorLocal},model:{value:t.panelOpacityLocal,callback:function(e){t.panelOpacityLocal=e},expression:"panelOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"panelTextColor",fallback:t.previewTheme.colors.panelText,label:t.$t("settings.text")},model:{value:t.panelTextColorLocal,callback:function(e){t.panelTextColorLocal=e},expression:"panelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.panelText,large:"true"}}),t._v(" "),s("ColorInput",{attrs:{name:"panelLinkColor",fallback:t.previewTheme.colors.panelLink,label:t.$t("settings.links")},model:{value:t.panelLinkColorLocal,callback:function(e){t.panelLinkColorLocal=e},expression:"panelLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.panelLink,large:"true"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.top_bar")))]),t._v(" "),s("ColorInput",{attrs:{name:"topBarColor",fallback:t.previewTheme.colors.topBar,label:t.$t("settings.background")},model:{value:t.topBarColorLocal,callback:function(e){t.topBarColorLocal=e},expression:"topBarColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"topBarTextColor",fallback:t.previewTheme.colors.topBarText,label:t.$t("settings.text")},model:{value:t.topBarTextColorLocal,callback:function(e){t.topBarTextColorLocal=e},expression:"topBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.topBarText}}),t._v(" "),s("ColorInput",{attrs:{name:"topBarLinkColor",fallback:t.previewTheme.colors.topBarLink,label:t.$t("settings.links")},model:{value:t.topBarLinkColorLocal,callback:function(e){t.topBarLinkColorLocal=e},expression:"topBarLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.topBarLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.inputs")))]),t._v(" "),s("ColorInput",{attrs:{name:"inputColor",fallback:t.previewTheme.colors.input,label:t.$t("settings.background")},model:{value:t.inputColorLocal,callback:function(e){t.inputColorLocal=e},expression:"inputColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"inputOpacity",fallback:t.previewTheme.opacity.input,disabled:"transparent"===t.inputColorLocal},model:{value:t.inputOpacityLocal,callback:function(e){t.inputOpacityLocal=e},expression:"inputOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"inputTextColor",fallback:t.previewTheme.colors.inputText,label:t.$t("settings.text")},model:{value:t.inputTextColorLocal,callback:function(e){t.inputTextColorLocal=e},expression:"inputTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.inputText}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.buttons")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnColor",fallback:t.previewTheme.colors.btn,label:t.$t("settings.background")},model:{value:t.btnColorLocal,callback:function(e){t.btnColorLocal=e},expression:"btnColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"btnOpacity",fallback:t.previewTheme.opacity.btn,disabled:"transparent"===t.btnColorLocal},model:{value:t.btnOpacityLocal,callback:function(e){t.btnOpacityLocal=e},expression:"btnOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnTextColor",fallback:t.previewTheme.colors.btnText,label:t.$t("settings.text")},model:{value:t.btnTextColorLocal,callback:function(e){t.btnTextColorLocal=e},expression:"btnTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPanelTextColor",fallback:t.previewTheme.colors.btnPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnPanelTextColorLocal,callback:function(e){t.btnPanelTextColorLocal=e},expression:"btnPanelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPanelText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnTopBarTextColor",fallback:t.previewTheme.colors.btnTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnTopBarTextColorLocal,callback:function(e){t.btnTopBarTextColorLocal=e},expression:"btnTopBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnTopBarText}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.pressed")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedColor",fallback:t.previewTheme.colors.btnPressed,label:t.$t("settings.background")},model:{value:t.btnPressedColorLocal,callback:function(e){t.btnPressedColorLocal=e},expression:"btnPressedColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedTextColor",fallback:t.previewTheme.colors.btnPressedText,label:t.$t("settings.text")},model:{value:t.btnPressedTextColorLocal,callback:function(e){t.btnPressedTextColorLocal=e},expression:"btnPressedTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPressedText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedPanelTextColor",fallback:t.previewTheme.colors.btnPressedPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnPressedPanelTextColorLocal,callback:function(e){t.btnPressedPanelTextColorLocal=e},expression:"btnPressedPanelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPressedPanelText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedTopBarTextColor",fallback:t.previewTheme.colors.btnPressedTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnPressedTopBarTextColorLocal,callback:function(e){t.btnPressedTopBarTextColorLocal=e},expression:"btnPressedTopBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPressedTopBarText}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.disabled")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledColor",fallback:t.previewTheme.colors.btnDisabled,label:t.$t("settings.background")},model:{value:t.btnDisabledColorLocal,callback:function(e){t.btnDisabledColorLocal=e},expression:"btnDisabledColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledTextColor",fallback:t.previewTheme.colors.btnDisabledText,label:t.$t("settings.text")},model:{value:t.btnDisabledTextColorLocal,callback:function(e){t.btnDisabledTextColorLocal=e},expression:"btnDisabledTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledPanelTextColor",fallback:t.previewTheme.colors.btnDisabledPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnDisabledPanelTextColorLocal,callback:function(e){t.btnDisabledPanelTextColorLocal=e},expression:"btnDisabledPanelTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledTopBarTextColor",fallback:t.previewTheme.colors.btnDisabledTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnDisabledTopBarTextColorLocal,callback:function(e){t.btnDisabledTopBarTextColorLocal=e},expression:"btnDisabledTopBarTextColorLocal"}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.toggled")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledColor",fallback:t.previewTheme.colors.btnToggled,label:t.$t("settings.background")},model:{value:t.btnToggledColorLocal,callback:function(e){t.btnToggledColorLocal=e},expression:"btnToggledColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledTextColor",fallback:t.previewTheme.colors.btnToggledText,label:t.$t("settings.text")},model:{value:t.btnToggledTextColorLocal,callback:function(e){t.btnToggledTextColorLocal=e},expression:"btnToggledTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnToggledText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledPanelTextColor",fallback:t.previewTheme.colors.btnToggledPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnToggledPanelTextColorLocal,callback:function(e){t.btnToggledPanelTextColorLocal=e},expression:"btnToggledPanelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnToggledPanelText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledTopBarTextColor",fallback:t.previewTheme.colors.btnToggledTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnToggledTopBarTextColorLocal,callback:function(e){t.btnToggledTopBarTextColorLocal=e},expression:"btnToggledTopBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnToggledTopBarText}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.tabs")))]),t._v(" "),s("ColorInput",{attrs:{name:"tabColor",fallback:t.previewTheme.colors.tab,label:t.$t("settings.background")},model:{value:t.tabColorLocal,callback:function(e){t.tabColorLocal=e},expression:"tabColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"tabTextColor",fallback:t.previewTheme.colors.tabText,label:t.$t("settings.text")},model:{value:t.tabTextColorLocal,callback:function(e){t.tabTextColorLocal=e},expression:"tabTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.tabText}}),t._v(" "),s("ColorInput",{attrs:{name:"tabActiveTextColor",fallback:t.previewTheme.colors.tabActiveText,label:t.$t("settings.text")},model:{value:t.tabActiveTextColorLocal,callback:function(e){t.tabActiveTextColorLocal=e},expression:"tabActiveTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.tabActiveText}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.borders")))]),t._v(" "),s("ColorInput",{attrs:{name:"borderColor",fallback:t.previewTheme.colors.border,label:t.$t("settings.style.common.color")},model:{value:t.borderColorLocal,callback:function(e){t.borderColorLocal=e},expression:"borderColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"borderOpacity",fallback:t.previewTheme.opacity.border,disabled:"transparent"===t.borderColorLocal},model:{value:t.borderOpacityLocal,callback:function(e){t.borderOpacityLocal=e},expression:"borderOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.faint_text")))]),t._v(" "),s("ColorInput",{attrs:{name:"faintColor",fallback:t.previewTheme.colors.faint,label:t.$t("settings.text")},model:{value:t.faintColorLocal,callback:function(e){t.faintColorLocal=e},expression:"faintColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"faintLinkColor",fallback:t.previewTheme.colors.faintLink,label:t.$t("settings.links")},model:{value:t.faintLinkColorLocal,callback:function(e){t.faintLinkColorLocal=e},expression:"faintLinkColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"panelFaintColor",fallback:t.previewTheme.colors.panelFaint,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.panelFaintColorLocal,callback:function(e){t.panelFaintColorLocal=e},expression:"panelFaintColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"faintOpacity",fallback:t.previewTheme.opacity.faint},model:{value:t.faintOpacityLocal,callback:function(e){t.faintOpacityLocal=e},expression:"faintOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.underlay")))]),t._v(" "),s("ColorInput",{attrs:{name:"underlay",label:t.$t("settings.style.advanced_colors.underlay"),fallback:t.previewTheme.colors.underlay},model:{value:t.underlayColorLocal,callback:function(e){t.underlayColorLocal=e},expression:"underlayColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"underlayOpacity",fallback:t.previewTheme.opacity.underlay,disabled:"transparent"===t.underlayOpacityLocal},model:{value:t.underlayOpacityLocal,callback:function(e){t.underlayOpacityLocal=e},expression:"underlayOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.poll")))]),t._v(" "),s("ColorInput",{attrs:{name:"poll",label:t.$t("settings.background"),fallback:t.previewTheme.colors.poll},model:{value:t.pollColorLocal,callback:function(e){t.pollColorLocal=e},expression:"pollColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"pollText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.pollText},model:{value:t.pollTextColorLocal,callback:function(e){t.pollTextColorLocal=e},expression:"pollTextColorLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.icons")))]),t._v(" "),s("ColorInput",{attrs:{name:"icon",label:t.$t("settings.style.advanced_colors.icons"),fallback:t.previewTheme.colors.icon},model:{value:t.iconColorLocal,callback:function(e){t.iconColorLocal=e},expression:"iconColorLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.highlight")))]),t._v(" "),s("ColorInput",{attrs:{name:"highlight",label:t.$t("settings.background"),fallback:t.previewTheme.colors.highlight},model:{value:t.highlightColorLocal,callback:function(e){t.highlightColorLocal=e},expression:"highlightColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"highlightText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.highlightText},model:{value:t.highlightTextColorLocal,callback:function(e){t.highlightTextColorLocal=e},expression:"highlightTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.highlightText}}),t._v(" "),s("ColorInput",{attrs:{name:"highlightLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.highlightLink},model:{value:t.highlightLinkColorLocal,callback:function(e){t.highlightLinkColorLocal=e},expression:"highlightLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.highlightLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.popover")))]),t._v(" "),s("ColorInput",{attrs:{name:"popover",label:t.$t("settings.background"),fallback:t.previewTheme.colors.popover},model:{value:t.popoverColorLocal,callback:function(e){t.popoverColorLocal=e},expression:"popoverColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"popoverOpacity",fallback:t.previewTheme.opacity.popover,disabled:"transparent"===t.popoverOpacityLocal},model:{value:t.popoverOpacityLocal,callback:function(e){t.popoverOpacityLocal=e},expression:"popoverOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"popoverText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.popoverText},model:{value:t.popoverTextColorLocal,callback:function(e){t.popoverTextColorLocal=e},expression:"popoverTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.popoverText}}),t._v(" "),s("ColorInput",{attrs:{name:"popoverLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.popoverLink},model:{value:t.popoverLinkColorLocal,callback:function(e){t.popoverLinkColorLocal=e},expression:"popoverLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.popoverLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.selectedPost")))]),t._v(" "),s("ColorInput",{attrs:{name:"selectedPost",label:t.$t("settings.background"),fallback:t.previewTheme.colors.selectedPost},model:{value:t.selectedPostColorLocal,callback:function(e){t.selectedPostColorLocal=e},expression:"selectedPostColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedPostText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.selectedPostText},model:{value:t.selectedPostTextColorLocal,callback:function(e){t.selectedPostTextColorLocal=e},expression:"selectedPostTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedPostText}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedPostLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.selectedPostLink},model:{value:t.selectedPostLinkColorLocal,callback:function(e){t.selectedPostLinkColorLocal=e},expression:"selectedPostLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedPostLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.selectedMenu")))]),t._v(" "),s("ColorInput",{attrs:{name:"selectedMenu",label:t.$t("settings.background"),fallback:t.previewTheme.colors.selectedMenu},model:{value:t.selectedMenuColorLocal,callback:function(e){t.selectedMenuColorLocal=e},expression:"selectedMenuColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedMenuText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.selectedMenuText},model:{value:t.selectedMenuTextColorLocal,callback:function(e){t.selectedMenuTextColorLocal=e},expression:"selectedMenuTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedMenuText}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedMenuLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.selectedMenuLink},model:{value:t.selectedMenuLinkColorLocal,callback:function(e){t.selectedMenuLinkColorLocal=e},expression:"selectedMenuLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedMenuLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("chats.chats")))]),t._v(" "),s("ColorInput",{attrs:{name:"chatBgColor",fallback:t.previewTheme.colors.bg||1,label:t.$t("settings.background")},model:{value:t.chatBgColorLocal,callback:function(e){t.chatBgColorLocal=e},expression:"chatBgColorLocal"}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.chat.incoming")))]),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingBgColor",fallback:t.previewTheme.colors.bg||1,label:t.$t("settings.background")},model:{value:t.chatMessageIncomingBgColorLocal,callback:function(e){t.chatMessageIncomingBgColorLocal=e},expression:"chatMessageIncomingBgColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingTextColor",fallback:t.previewTheme.colors.text||1,label:t.$t("settings.text")},model:{value:t.chatMessageIncomingTextColorLocal,callback:function(e){t.chatMessageIncomingTextColorLocal=e},expression:"chatMessageIncomingTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingLinkColor",fallback:t.previewTheme.colors.link||1,label:t.$t("settings.links")},model:{value:t.chatMessageIncomingLinkColorLocal,callback:function(e){t.chatMessageIncomingLinkColorLocal=e},expression:"chatMessageIncomingLinkColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingBorderLinkColor",fallback:t.previewTheme.colors.fg||1,label:t.$t("settings.style.advanced_colors.chat.border")},model:{value:t.chatMessageIncomingBorderColorLocal,callback:function(e){t.chatMessageIncomingBorderColorLocal=e},expression:"chatMessageIncomingBorderColorLocal"}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.chat.outgoing")))]),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingBgColor",fallback:t.previewTheme.colors.bg||1,label:t.$t("settings.background")},model:{value:t.chatMessageOutgoingBgColorLocal,callback:function(e){t.chatMessageOutgoingBgColorLocal=e},expression:"chatMessageOutgoingBgColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingTextColor",fallback:t.previewTheme.colors.text||1,label:t.$t("settings.text")},model:{value:t.chatMessageOutgoingTextColorLocal,callback:function(e){t.chatMessageOutgoingTextColorLocal=e},expression:"chatMessageOutgoingTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingLinkColor",fallback:t.previewTheme.colors.link||1,label:t.$t("settings.links")},model:{value:t.chatMessageOutgoingLinkColorLocal,callback:function(e){t.chatMessageOutgoingLinkColorLocal=e},expression:"chatMessageOutgoingLinkColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingBorderLinkColor",fallback:t.previewTheme.colors.bg||1,label:t.$t("settings.style.advanced_colors.chat.border")},model:{value:t.chatMessageOutgoingBorderColorLocal,callback:function(e){t.chatMessageOutgoingBorderColorLocal=e},expression:"chatMessageOutgoingBorderColorLocal"}})],1)]),t._v(" "),s("div",{staticClass:"radius-container",attrs:{label:t.$t("settings.style.radii._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.radii_help")))]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearRoundness}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("RangeInput",{attrs:{name:"btnRadius",label:t.$t("settings.btnRadius"),fallback:t.previewTheme.radii.btn,max:"16","hard-min":"0"},model:{value:t.btnRadiusLocal,callback:function(e){t.btnRadiusLocal=e},expression:"btnRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"inputRadius",label:t.$t("settings.inputRadius"),fallback:t.previewTheme.radii.input,max:"9","hard-min":"0"},model:{value:t.inputRadiusLocal,callback:function(e){t.inputRadiusLocal=e},expression:"inputRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"checkboxRadius",label:t.$t("settings.checkboxRadius"),fallback:t.previewTheme.radii.checkbox,max:"16","hard-min":"0"},model:{value:t.checkboxRadiusLocal,callback:function(e){t.checkboxRadiusLocal=e},expression:"checkboxRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"panelRadius",label:t.$t("settings.panelRadius"),fallback:t.previewTheme.radii.panel,max:"50","hard-min":"0"},model:{value:t.panelRadiusLocal,callback:function(e){t.panelRadiusLocal=e},expression:"panelRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"avatarRadius",label:t.$t("settings.avatarRadius"),fallback:t.previewTheme.radii.avatar,max:"28","hard-min":"0"},model:{value:t.avatarRadiusLocal,callback:function(e){t.avatarRadiusLocal=e},expression:"avatarRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"avatarAltRadius",label:t.$t("settings.avatarAltRadius"),fallback:t.previewTheme.radii.avatarAlt,max:"28","hard-min":"0"},model:{value:t.avatarAltRadiusLocal,callback:function(e){t.avatarAltRadiusLocal=e},expression:"avatarAltRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"attachmentRadius",label:t.$t("settings.attachmentRadius"),fallback:t.previewTheme.radii.attachment,max:"50","hard-min":"0"},model:{value:t.attachmentRadiusLocal,callback:function(e){t.attachmentRadiusLocal=e},expression:"attachmentRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"tooltipRadius",label:t.$t("settings.tooltipRadius"),fallback:t.previewTheme.radii.tooltip,max:"50","hard-min":"0"},model:{value:t.tooltipRadiusLocal,callback:function(e){t.tooltipRadiusLocal=e},expression:"tooltipRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"chatMessageRadius",label:t.$t("settings.chatMessageRadius"),fallback:t.previewTheme.radii.chatMessage||2,max:"50","hard-min":"0"},model:{value:t.chatMessageRadiusLocal,callback:function(e){t.chatMessageRadiusLocal=e},expression:"chatMessageRadiusLocal"}})],1),t._v(" "),s("div",{staticClass:"shadow-container",attrs:{label:t.$t("settings.style.shadows._tab_label")}},[s("div",{staticClass:"tab-header shadow-selector"},[s("div",{staticClass:"select-container"},[t._v("\n "+t._s(t.$t("settings.style.shadows.component"))+"\n "),s("label",{staticClass:"select",attrs:{for:"shadow-switcher"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.shadowSelected,expression:"shadowSelected"}],staticClass:"shadow-switcher",attrs:{id:"shadow-switcher"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.shadowSelected=e.target.multiple?s:s[0]}}},t._l(t.shadowsAvailable,function(e){return s("option",{key:e,domProps:{value:e}},[t._v("\n "+t._s(t.$t("settings.style.shadows.components."+e))+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})])]),t._v(" "),s("div",{staticClass:"override"},[s("label",{staticClass:"label",attrs:{for:"override"}},[t._v("\n "+t._s(t.$t("settings.style.shadows.override"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.currentShadowOverriden,expression:"currentShadowOverriden"}],staticClass:"input-override",attrs:{id:"override",name:"override",type:"checkbox"},domProps:{checked:Array.isArray(t.currentShadowOverriden)?t._i(t.currentShadowOverriden,null)>-1:t.currentShadowOverriden},on:{change:function(e){var s=t.currentShadowOverriden,a=e.target,n=!!a.checked;if(Array.isArray(s)){var o=t._i(s,null);a.checked?o<0&&(t.currentShadowOverriden=s.concat([null])):o>-1&&(t.currentShadowOverriden=s.slice(0,o).concat(s.slice(o+1)))}else t.currentShadowOverriden=n}}}),t._v(" "),s("label",{staticClass:"checkbox-label",attrs:{for:"override"}})]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearShadows}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("ShadowControl",{attrs:{ready:!!t.currentShadowFallback,fallback:t.currentShadowFallback},model:{value:t.currentShadow,callback:function(e){t.currentShadow=e},expression:"currentShadow"}}),t._v(" "),"avatar"===t.shadowSelected||"avatarStatus"===t.shadowSelected?s("div",[s("i18n",{attrs:{path:"settings.style.shadows.filter_hint.always_drop_shadow",tag:"p"}},[s("code",[t._v("filter: drop-shadow()")])]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.shadows.filter_hint.avatar_inset")))]),t._v(" "),s("i18n",{attrs:{path:"settings.style.shadows.filter_hint.drop_shadow_syntax",tag:"p"}},[s("code",[t._v("drop-shadow")]),t._v(" "),s("code",[t._v("spread-radius")]),t._v(" "),s("code",[t._v("inset")])]),t._v(" "),s("i18n",{attrs:{path:"settings.style.shadows.filter_hint.inset_classic",tag:"p"}},[s("code",[t._v("box-shadow")])]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.shadows.filter_hint.spread_zero")))])],1):t._e()],1),t._v(" "),s("div",{staticClass:"fonts-container",attrs:{label:t.$t("settings.style.fonts._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.style.fonts.help")))]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearFonts}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("FontControl",{attrs:{name:"ui",label:t.$t("settings.style.fonts.components.interface"),fallback:t.previewTheme.fonts.interface,"no-inherit":"1"},model:{value:t.fontsLocal.interface,callback:function(e){t.$set(t.fontsLocal,"interface",e)},expression:"fontsLocal.interface"}}),t._v(" "),s("FontControl",{attrs:{name:"input",label:t.$t("settings.style.fonts.components.input"),fallback:t.previewTheme.fonts.input},model:{value:t.fontsLocal.input,callback:function(e){t.$set(t.fontsLocal,"input",e)},expression:"fontsLocal.input"}}),t._v(" "),s("FontControl",{attrs:{name:"post",label:t.$t("settings.style.fonts.components.post"),fallback:t.previewTheme.fonts.post},model:{value:t.fontsLocal.post,callback:function(e){t.$set(t.fontsLocal,"post",e)},expression:"fontsLocal.post"}}),t._v(" "),s("FontControl",{attrs:{name:"postCode",label:t.$t("settings.style.fonts.components.postCode"),fallback:t.previewTheme.fonts.postCode},model:{value:t.fontsLocal.postCode,callback:function(e){t.$set(t.fontsLocal,"postCode",e)},expression:"fontsLocal.postCode"}})],1)])],1),t._v(" "),s("div",{staticClass:"apply-container"},[s("button",{staticClass:"btn submit",attrs:{disabled:!t.themeValid},on:{click:t.setCustomTheme}},[t._v("\n "+t._s(t.$t("general.apply"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearAll}},[t._v("\n "+t._s(t.$t("settings.style.switcher.reset"))+"\n ")])])],1)},[],!1,Fe,null,null).exports,Ue={components:{TabSwitcher:a.a,DataImportExportTab:m,MutesAndBlocksTab:nt,NotificationsTab:it,FilteringTab:ft,SecurityTab:Et,ProfileTab:Qt,GeneralTab:ae,VersionTab:oe,ThemeTab:Me},computed:{isLoggedIn:function(){return!!this.$store.state.users.currentUser},open:function(){return"hidden"!==this.$store.state.interface.settingsModalState}},methods:{onOpen:function(){var t=this.$store.state.interface.settingsModalTargetTab;if(t){var e=this.$refs.tabSwitcher.$slots.default.findIndex(function(e){return e.data&&e.data.attrs["data-tab-name"]===t});e>=0&&this.$refs.tabSwitcher.setTab(e)}this.$store.dispatch("clearSettingsModalTargetTab")}},mounted:function(){this.onOpen()},watch:{open:function(t){t&&this.onOpen()}}};var Ve=function(t){s(591)},Ae=Object(o.a)(Ue,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tab-switcher",{ref:"tabSwitcher",staticClass:"settings_tab-switcher",attrs:{"side-tab-bar":!0,"scrollable-tabs":!0}},[s("div",{attrs:{label:t.$t("settings.general"),icon:"wrench","data-tab-name":"general"}},[s("GeneralTab")],1),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.profile_tab"),icon:"user","data-tab-name":"profile"}},[s("ProfileTab")],1):t._e(),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.security_tab"),icon:"lock","data-tab-name":"security"}},[s("SecurityTab")],1):t._e(),t._v(" "),s("div",{attrs:{label:t.$t("settings.filtering"),icon:"filter","data-tab-name":"filtering"}},[s("FilteringTab")],1),t._v(" "),s("div",{attrs:{label:t.$t("settings.theme"),icon:"brush","data-tab-name":"theme"}},[s("ThemeTab")],1),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.notifications"),icon:"bell-ringing-o","data-tab-name":"notifications"}},[s("NotificationsTab")],1):t._e(),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.data_import_export_tab"),icon:"download","data-tab-name":"dataImportExport"}},[s("DataImportExportTab")],1):t._e(),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.mutes_and_blocks"),fullHeight:!0,icon:"eye-off","data-tab-name":"mutesAndBlocks"}},[s("MutesAndBlocksTab")],1):t._e(),t._v(" "),s("div",{attrs:{label:t.$t("settings.version.title"),icon:"info-circled","data-tab-name":"version"}},[s("VersionTab")],1)])},[],!1,Ve,null,null);e.default=Ae.exports}}]); -//# sourceMappingURL=2.c92f4803ff24726cea58.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{591:function(t,e,s){var a=s(592);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("a45e17ec",a,!0,{})},592:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".settings_tab-switcher{height:100%}.settings_tab-switcher .setting-item{border-bottom:2px solid var(--fg,#182230);margin:1em 1em 1.4em;padding-bottom:1.4em}.settings_tab-switcher .setting-item>div{margin-bottom:.5em}.settings_tab-switcher .setting-item>div:last-child{margin-bottom:0}.settings_tab-switcher .setting-item:last-child{border-bottom:none;padding-bottom:0;margin-bottom:1em}.settings_tab-switcher .setting-item select{min-width:10em}.settings_tab-switcher .setting-item textarea{width:100%;max-width:100%;height:100px}.settings_tab-switcher .setting-item .unavailable,.settings_tab-switcher .setting-item .unavailable i{color:var(--cRed,red);color:red}.settings_tab-switcher .setting-item .number-input{max-width:6em}",""])},593:function(t,e,s){var a=s(594);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("5bed876c",a,!0,{})},594:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".importer-uploading{font-size:1.5em;margin:.25em}",""])},595:function(t,e,s){var a=s(596);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("432fc7c6",a,!0,{})},596:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".exporter-processing{font-size:1.5em;margin:.25em}",""])},597:function(t,e,s){var a=s(598);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("33ca0d90",a,!0,{})},598:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mutes-and-blocks-tab{height:100%}.mutes-and-blocks-tab .usersearch-wrapper{padding:1em}.mutes-and-blocks-tab .bulk-actions{text-align:right;padding:0 1em;min-height:28px}.mutes-and-blocks-tab .bulk-action-button{width:10em}.mutes-and-blocks-tab .domain-mute-form{padding:1em;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.mutes-and-blocks-tab .domain-mute-button{-ms-flex-item-align:end;align-self:flex-end;margin-top:1em;width:10em}",""])},599:function(t,e,s){var a=s(600);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("3a9ec1bf",a,!0,{})},600:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".autosuggest{position:relative}.autosuggest-input{display:block;width:100%}.autosuggest-results{position:absolute;left:0;top:100%;right:0;max-height:400px;background-color:#121a24;background-color:var(--bg,#121a24);border-color:#222;border:1px solid var(--border,#222);border-radius:4px;border-radius:var(--inputRadius,4px);border-top-left-radius:0;border-top-right-radius:0;box-shadow:1px 1px 4px rgba(0,0,0,.6);box-shadow:var(--panelShadow);overflow-y:auto;z-index:1}",""])},601:function(t,e,s){var a=s(602);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("211aa67c",a,!0,{})},602:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".block-card-content-container{margin-top:.5em;text-align:right}.block-card-content-container button{width:10em}",""])},603:function(t,e,s){var a=s(604);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("7ea980e0",a,!0,{})},604:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mute-card-content-container{margin-top:.5em;text-align:right}.mute-card-content-container button{width:10em}",""])},605:function(t,e,s){var a=s(606);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("39a942c3",a,!0,{})},606:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".domain-mute-card{-ms-flex:1 0;flex:1 0;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;padding:.6em 1em .6em 0}.domain-mute-card-domain{margin-right:1em;overflow:hidden;text-overflow:ellipsis}.domain-mute-card button{width:10em}.autosuggest-results .domain-mute-card{padding-left:1em}",""])},607:function(t,e,s){var a=s(608);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("3724291e",a,!0,{})},608:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".selectable-list-item-inner{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.selectable-list-item-inner>*{min-width:0}.selectable-list-item-selected-inner{background-color:#151e2a;background-color:var(--selectedMenu,#151e2a);color:var(--selectedMenuText,#b9b9ba);--faint:var(--selectedMenuFaintText,$fallback--faint);--faintLink:var(--selectedMenuFaintLink,$fallback--faint);--lightText:var(--selectedMenuLightText,$fallback--lightText);--icon:var(--selectedMenuIcon,$fallback--icon)}.selectable-list-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.6em 0;border-bottom:2px solid;border-bottom-color:#222;border-bottom-color:var(--border,#222)}.selectable-list-header-actions{-ms-flex:1;flex:1}.selectable-list-checkbox-wrapper{padding:0 10px;-ms-flex:none;flex:none}",""])},609:function(t,e,s){},613:function(t,e,s){var a=s(614);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("a588473e",a,!0,{})},614:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mfa-settings .method-item,.mfa-settings .mfa-heading{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:baseline;align-items:baseline}.mfa-settings .warning{color:orange;color:var(--cOrange,orange)}.mfa-settings .setup-otp{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.mfa-settings .setup-otp .qr-code{-ms-flex:1;flex:1;padding-right:10px}.mfa-settings .setup-otp .verify{-ms-flex:1;flex:1}.mfa-settings .setup-otp .error{margin:4px 0 0}.mfa-settings .setup-otp .confirm-otp-actions button{width:15em;margin-top:5px}",""])},615:function(t,e,s){var a=s(616);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("4065bf15",a,!0,{})},616:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".mfa-backup-codes .warning{color:orange;color:var(--cOrange,orange)}.mfa-backup-codes .backup-codes{font-family:var(--postCodeFont,monospace)}",""])},618:function(t,e,s){var a=s(619);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("27925ae8",a,!0,{})},619:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".profile-tab .bio{margin:0}.profile-tab .visibility-tray{padding-top:5px}.profile-tab input[type=file]{padding:5px;height:auto}.profile-tab .banner-background-preview{max-width:100%;width:300px;position:relative}.profile-tab .banner-background-preview img{width:100%}.profile-tab .uploading{font-size:1.5em;margin:.25em}.profile-tab .name-changer{width:100%}.profile-tab .current-avatar-container{position:relative;width:150px;height:150px}.profile-tab .current-avatar{display:block;width:100%;height:100%;border-radius:4px;border-radius:var(--avatarRadius,4px)}.profile-tab .reset-button{position:absolute;top:.2em;right:.2em;border-radius:5px;border-radius:var(--tooltipRadius,5px);background-color:rgba(0,0,0,.6);opacity:.7;color:#fff;width:1.5em;height:1.5em;text-align:center;line-height:1.5em;font-size:1.5em;cursor:pointer}.profile-tab .reset-button:hover{opacity:1}.profile-tab .oauth-tokens{width:100%}.profile-tab .oauth-tokens th{text-align:left}.profile-tab .oauth-tokens .actions{text-align:right}.profile-tab-usersearch-wrapper{padding:1em}.profile-tab-bulk-actions{text-align:right;padding:0 1em;min-height:28px}.profile-tab-bulk-actions button{width:10em}.profile-tab-domain-mute-form{padding:1em;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.profile-tab-domain-mute-form button{-ms-flex-item-align:end;align-self:flex-end;margin-top:1em;width:10em}.profile-tab .setting-subitem{margin-left:1.75em}.profile-tab .profile-fields{display:-ms-flexbox;display:flex}.profile-tab .profile-fields>.emoji-input{-ms-flex:1 1 auto;flex:1 1 auto;margin:0 .2em .5em;min-width:0}.profile-tab .profile-fields>.icon-container{width:20px}.profile-tab .profile-fields>.icon-container>.icon-cancel{vertical-align:sub}",""])},620:function(t,e,s){var a=s(621);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("0dfd0b33",a,!0,{})},621:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".image-cropper-img-input{display:none}.image-cropper-image-container{position:relative}.image-cropper-image-container img{display:block;max-width:100%}.image-cropper-buttons-wrapper{margin-top:10px}.image-cropper-buttons-wrapper button{margin-top:5px}",""])},624:function(t,e,s){var a=s(625);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("4fafab12",a,!0,{})},625:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".theme-tab{padding-bottom:2em}.theme-tab .theme-warning{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline;margin-bottom:.5em}.theme-tab .theme-warning .buttons .btn{margin-bottom:.5em}.theme-tab .preset-switcher{margin-right:1em}.theme-tab .style-control{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline;margin-bottom:5px}.theme-tab .style-control .label{-ms-flex:1;flex:1}.theme-tab .style-control.disabled input,.theme-tab .style-control.disabled select{opacity:.5}.theme-tab .style-control .opt{margin:.5em}.theme-tab .style-control .color-input{-ms-flex:0 0 0px;flex:0 0 0}.theme-tab .style-control input,.theme-tab .style-control select{min-width:3em;margin:0;-ms-flex:0;flex:0}.theme-tab .style-control input[type=number],.theme-tab .style-control select[type=number]{min-width:5em}.theme-tab .style-control input[type=range],.theme-tab .style-control select[type=range]{-ms-flex:1;flex:1;min-width:3em;-ms-flex-item-align:start;align-self:flex-start}.theme-tab .reset-container{-ms-flex-wrap:wrap;flex-wrap:wrap}.theme-tab .apply-container,.theme-tab .color-container,.theme-tab .fonts-container,.theme-tab .radius-container,.theme-tab .reset-container{display:-ms-flexbox;display:flex}.theme-tab .fonts-container,.theme-tab .radius-container{-ms-flex-direction:column;flex-direction:column}.theme-tab .color-container{-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:justify;justify-content:space-between}.theme-tab .color-container>h4{width:99%}.theme-tab .color-container,.theme-tab .fonts-container,.theme-tab .presets-container,.theme-tab .radius-container,.theme-tab .shadow-container{margin:1em 1em 0}.theme-tab .tab-header{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:baseline;align-items:baseline;width:100%;min-height:30px;margin-bottom:1em}.theme-tab .tab-header p{-ms-flex:1;flex:1;margin:0;margin-right:.5em}.theme-tab .tab-header-buttons{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.theme-tab .tab-header-buttons .btn{min-width:1px;-ms-flex:0 auto;flex:0 auto;padding:0 1em;margin-bottom:.5em}.theme-tab .shadow-selector .override{-ms-flex:1;flex:1;margin-left:.5em}.theme-tab .shadow-selector .select-container{margin-top:-4px;margin-bottom:-3px}.theme-tab .save-load,.theme-tab .save-load-options{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:baseline;align-items:baseline;-ms-flex-wrap:wrap;flex-wrap:wrap}.theme-tab .save-load-options .import-export,.theme-tab .save-load-options .presets,.theme-tab .save-load .import-export,.theme-tab .save-load .presets{margin-bottom:.5em}.theme-tab .save-load-options .import-export,.theme-tab .save-load .import-export{display:-ms-flexbox;display:flex}.theme-tab .save-load-options .override,.theme-tab .save-load .override{margin-left:.5em}.theme-tab .save-load-options{-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5em;-ms-flex-pack:center;justify-content:center}.theme-tab .save-load-options .keep-option{margin:0 .5em .5em;min-width:25%}.theme-tab .preview-container{border-top:1px dashed;border-bottom:1px dashed;border-color:#222;border-color:var(--border,#222);margin:1em 0;padding:1em;background:var(--body-background-image);background-size:cover;background-position:50% 50%}.theme-tab .preview-container .dummy .post{font-family:var(--postFont);display:-ms-flexbox;display:flex}.theme-tab .preview-container .dummy .post .content{-ms-flex:1;flex:1}.theme-tab .preview-container .dummy .post .content h4{margin-bottom:.25em}.theme-tab .preview-container .dummy .post .content .icons{margin-top:.5em;display:-ms-flexbox;display:flex}.theme-tab .preview-container .dummy .post .content .icons i{margin-right:1em}.theme-tab .preview-container .dummy .after-post{margin-top:1em;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.theme-tab .preview-container .dummy .avatar,.theme-tab .preview-container .dummy .avatar-alt{background:linear-gradient(135deg,#b8e1fc,#a9d2f3 10%,#90bae4 25%,#90bcea 37%,#90bff0 50%,#6ba8e5 51%,#a2daf5 83%,#bdf3fd);color:#000;font-family:sans-serif;text-align:center;margin-right:1em}.theme-tab .preview-container .dummy .avatar-alt{-ms-flex:0 auto;flex:0 auto;margin-left:28px;font-size:12px;min-width:20px;min-height:20px;line-height:20px;border-radius:10px;border-radius:var(--avatarAltRadius,10px)}.theme-tab .preview-container .dummy .avatar{-ms-flex:0 auto;flex:0 auto;width:48px;height:48px;font-size:14px;line-height:48px}.theme-tab .preview-container .dummy .actions{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline}.theme-tab .preview-container .dummy .actions .checkbox{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:baseline;align-items:baseline;margin-right:1em;-ms-flex:1;flex:1}.theme-tab .preview-container .dummy .separator{margin:1em;border-bottom:1px solid;border-color:#222;border-color:var(--border,#222)}.theme-tab .preview-container .dummy .panel-heading .alert,.theme-tab .preview-container .dummy .panel-heading .badge,.theme-tab .preview-container .dummy .panel-heading .btn,.theme-tab .preview-container .dummy .panel-heading .faint{margin-left:1em;white-space:nowrap}.theme-tab .preview-container .dummy .panel-heading .faint{text-overflow:ellipsis;min-width:2em;overflow-x:hidden}.theme-tab .preview-container .dummy .panel-heading .flex-spacer{-ms-flex:1;flex:1}.theme-tab .preview-container .dummy .btn{margin-left:0;padding:0 1em;min-width:3em;min-height:30px}.theme-tab .apply-container{-ms-flex-pack:center;justify-content:center}.theme-tab .color-item,.theme-tab .radius-item{min-width:20em;margin:5px 6px 0 0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1 1 0px;flex:1 1 0}.theme-tab .color-item.wide,.theme-tab .radius-item.wide{min-width:60%}.theme-tab .color-item:not(.wide):nth-child(odd),.theme-tab .radius-item:not(.wide):nth-child(odd){margin-right:7px}.theme-tab .color-item .color,.theme-tab .color-item .opacity,.theme-tab .radius-item .color,.theme-tab .radius-item .opacity{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline}.theme-tab .radius-item{-ms-flex-preferred-size:auto;flex-basis:auto}.theme-tab .theme-color-cl,.theme-tab .theme-radius-rn{border:0;box-shadow:none;background:transparent;color:var(--faint,hsla(240,1%,73%,.5));-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch}.theme-tab .theme-color-cl,.theme-tab .theme-color-in,.theme-tab .theme-radius-in{margin-left:4px}.theme-tab .theme-radius-in{min-width:1em;max-width:7em;-ms-flex:1;flex:1}.theme-tab .theme-radius-lb{max-width:50em}.theme-tab .theme-preview-content{padding:20px}.theme-tab .apply-container .btn{min-height:28px;min-width:10em;padding:0 2em}.theme-tab .btn{margin-left:.25em;margin-right:.25em}",""])},626:function(t,e,s){var a=s(627);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("7e57f952",a,!0,{})},627:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,'.color-input,.color-input-field.input{display:-ms-inline-flexbox;display:inline-flex}.color-input-field.input{-ms-flex:0 0 0px;flex:0 0 0;max-width:9em;-ms-flex-align:stretch;align-items:stretch;padding:.2em 8px}.color-input-field.input input{background:none;color:#b9b9ba;color:var(--inputText,#b9b9ba);border:none;padding:0;margin:0}.color-input-field.input input.textColor{-ms-flex:1 0 3em;flex:1 0 3em;min-width:3em;padding:0}.color-input-field.input .computedIndicator,.color-input-field.input .transparentIndicator,.color-input-field.input input.nativeColor{-ms-flex:0 0 2em;flex:0 0 2em;min-width:2em;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;height:100%}.color-input-field.input .transparentIndicator{background-color:#f0f;position:relative}.color-input-field.input .transparentIndicator:after,.color-input-field.input .transparentIndicator:before{display:block;content:"";background-color:#000;position:absolute;height:50%;width:50%}.color-input-field.input .transparentIndicator:after{top:0;left:0}.color-input-field.input .transparentIndicator:before{bottom:0;right:0}.color-input .label{-ms-flex:1 1 auto;flex:1 1 auto}',""])},628:function(t,e,s){var a=s(629);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("6c632637",a,!0,{})},629:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".color-control input.text-input{max-width:7em;-ms-flex:1;flex:1}",""])},630:function(t,e,s){var a=s(631);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("d219da80",a,!0,{})},631:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".shadow-control{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:center;justify-content:center;margin-bottom:1em}.shadow-control .shadow-preview-container,.shadow-control .shadow-tweak{margin:5px 6px 0 0}.shadow-control .shadow-preview-container{-ms-flex:0;flex:0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.shadow-control .shadow-preview-container input[type=number]{width:5em;min-width:2em}.shadow-control .shadow-preview-container .x-shift-control,.shadow-control .shadow-preview-container .y-shift-control{display:-ms-flexbox;display:flex;-ms-flex:0;flex:0}.shadow-control .shadow-preview-container .x-shift-control[disabled=disabled] *,.shadow-control .shadow-preview-container .y-shift-control[disabled=disabled] *{opacity:.5}.shadow-control .shadow-preview-container .x-shift-control{-ms-flex-align:start;align-items:flex-start}.shadow-control .shadow-preview-container .x-shift-control .wrap,.shadow-control .shadow-preview-container input[type=range]{margin:0;width:15em;height:2em}.shadow-control .shadow-preview-container .y-shift-control{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:end;align-items:flex-end}.shadow-control .shadow-preview-container .y-shift-control .wrap{width:2em;height:15em}.shadow-control .shadow-preview-container .y-shift-control input[type=range]{transform-origin:1em 1em;transform:rotate(90deg)}.shadow-control .shadow-preview-container .preview-window{-ms-flex:1;flex:1;background-color:#999;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;background-image:linear-gradient(45deg,#666 25%,transparent 0),linear-gradient(-45deg,#666 25%,transparent 0),linear-gradient(45deg,transparent 75%,#666 0),linear-gradient(-45deg,transparent 75%,#666 0);background-size:20px 20px;background-position:0 0,0 10px,10px -10px,-10px 0;border-radius:4px;border-radius:var(--inputRadius,4px)}.shadow-control .shadow-preview-container .preview-window .preview-block{width:33%;height:33%;background-color:#121a24;background-color:var(--bg,#121a24);border-radius:10px;border-radius:var(--panelRadius,10px)}.shadow-control .shadow-tweak{-ms-flex:1;flex:1;min-width:280px}.shadow-control .shadow-tweak .id-control{-ms-flex-align:stretch;align-items:stretch}.shadow-control .shadow-tweak .id-control .btn,.shadow-control .shadow-tweak .id-control .select{min-width:1px;margin-right:5px}.shadow-control .shadow-tweak .id-control .btn{padding:0 .4em;margin:0 .1em}.shadow-control .shadow-tweak .id-control .select{-ms-flex:1;flex:1}.shadow-control .shadow-tweak .id-control .select select{-ms-flex-item-align:initial;-ms-grid-row-align:initial;align-self:auto}",""])},632:function(t,e,s){var a=s(633);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("d9c0acde",a,!0,{})},633:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".font-control input.custom-font{min-width:10em}.font-control.custom .select{border-top-right-radius:0;border-bottom-right-radius:0}.font-control.custom .custom-font{border-top-left-radius:0;border-bottom-left-radius:0}",""])},634:function(t,e,s){var a=s(635);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("b94bc120",a,!0,{})},635:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".contrast-ratio{display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end;margin-top:-4px;margin-bottom:5px}.contrast-ratio .label{margin-right:1em}.contrast-ratio .rating{display:inline-block;text-align:center}",""])},636:function(t,e,s){var a=s(637);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("66a4eaba",a,!0,{})},637:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".import-export-container{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:baseline;align-items:baseline;-ms-flex-pack:center;justify-content:center}",""])},638:function(t,e,s){var a=s(639);"string"==typeof a&&(a=[[t.i,a,""]]),a.locals&&(t.exports=a.locals);(0,s(5).default)("6fe23c76",a,!0,{})},639:function(t,e,s){(t.exports=s(4)(!1)).push([t.i,".preview-container{position:relative}.underlay-preview{position:absolute;top:0;bottom:0;left:10px;right:10px}",""])},641:function(t,e,s){"use strict";s.r(e);var a=s(141),n={props:{submitHandler:{type:Function,required:!0},submitButtonLabel:{type:String,default:function(){return this.$t("importer.submit")}},successMessage:{type:String,default:function(){return this.$t("importer.success")}},errorMessage:{type:String,default:function(){return this.$t("importer.error")}}},data:function(){return{file:null,error:!1,success:!1,submitting:!1}},methods:{change:function(){this.file=this.$refs.input.files[0]},submit:function(){var t=this;this.dismiss(),this.submitting=!0,this.submitHandler(this.file).then(function(){t.success=!0}).catch(function(){t.error=!0}).finally(function(){t.submitting=!1})},dismiss:function(){this.success=!1,this.error=!1}}},o=s(0);var i=function(t){s(593)},r=Object(o.a)(n,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"importer"},[s("form",[s("input",{ref:"input",attrs:{type:"file"},on:{change:t.change}})]),t._v(" "),t.submitting?s("i",{staticClass:"icon-spin4 animate-spin importer-uploading"}):s("button",{staticClass:"btn btn-default",on:{click:t.submit}},[t._v("\n "+t._s(t.submitButtonLabel)+"\n ")]),t._v(" "),t.success?s("div",[s("i",{staticClass:"icon-cross",on:{click:t.dismiss}}),t._v(" "),s("p",[t._v(t._s(t.successMessage))])]):t.error?s("div",[s("i",{staticClass:"icon-cross",on:{click:t.dismiss}}),t._v(" "),s("p",[t._v(t._s(t.errorMessage))])]):t._e()])},[],!1,i,null,null).exports,l={props:{getContent:{type:Function,required:!0},filename:{type:String,default:"export.csv"},exportButtonLabel:{type:String,default:function(){return this.$t("exporter.export")}},processingMessage:{type:String,default:function(){return this.$t("exporter.processing")}}},data:function(){return{processing:!1}},methods:{process:function(){var t=this;this.processing=!0,this.getContent().then(function(e){var s=document.createElement("a");s.setAttribute("href","data:text/plain;charset=utf-8,"+encodeURIComponent(e)),s.setAttribute("download",t.filename),s.style.display="none",document.body.appendChild(s),s.click(),document.body.removeChild(s),setTimeout(function(){t.processing=!1},2e3)})}}};var c=function(t){s(595)},u=Object(o.a)(l,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"exporter"},[t.processing?s("div",[s("i",{staticClass:"icon-spin4 animate-spin exporter-processing"}),t._v(" "),s("span",[t._v(t._s(t.processingMessage))])]):s("button",{staticClass:"btn btn-default",on:{click:t.process}},[t._v("\n "+t._s(t.exportButtonLabel)+"\n ")])])},[],!1,c,null,null).exports,d=s(54),p={data:function(){return{activeTab:"profile",newDomainToMute:""}},created:function(){this.$store.dispatch("fetchTokens")},components:{Importer:r,Exporter:u,Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser}},methods:{getFollowsContent:function(){return this.$store.state.api.backendInteractor.exportFriends({id:this.$store.state.users.currentUser.id}).then(this.generateExportableUsersContent)},getBlocksContent:function(){return this.$store.state.api.backendInteractor.fetchBlocks().then(this.generateExportableUsersContent)},importFollows:function(t){return this.$store.state.api.backendInteractor.importFollows({file:t}).then(function(t){if(!t)throw new Error("failed")})},importBlocks:function(t){return this.$store.state.api.backendInteractor.importBlocks({file:t}).then(function(t){if(!t)throw new Error("failed")})},generateExportableUsersContent:function(t){return t.map(function(t){return t&&t.is_local?t.screen_name+"@"+location.hostname:t.screen_name}).join("\n")}}},m=Object(o.a)(p,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.data_import_export_tab")}},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.follow_import")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.import_followers_from_a_csv_file")))]),t._v(" "),s("Importer",{attrs:{"submit-handler":t.importFollows,"success-message":t.$t("settings.follows_imported"),"error-message":t.$t("settings.follow_import_error")}})],1),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.follow_export")))]),t._v(" "),s("Exporter",{attrs:{"get-content":t.getFollowsContent,filename:"friends.csv","export-button-label":t.$t("settings.follow_export_button")}})],1),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.block_import")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.import_blocks_from_a_csv_file")))]),t._v(" "),s("Importer",{attrs:{"submit-handler":t.importBlocks,"success-message":t.$t("settings.blocks_imported"),"error-message":t.$t("settings.block_import_error")}})],1),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.block_export")))]),t._v(" "),s("Exporter",{attrs:{"get-content":t.getBlocksContent,filename:"blocks.csv","export-button-label":t.$t("settings.block_export_button")}})],1)])},[],!1,null,null,null).exports,v=s(12),h=s.n(v),b=s(15),f=s.n(b),g=s(189),_=s.n(g),w={props:{query:{type:Function,required:!0},filter:{type:Function},placeholder:{type:String,default:"Search..."}},data:function(){return{term:"",timeout:null,results:[],resultsVisible:!1}},computed:{filtered:function(){return this.filter?this.filter(this.results):this.results}},watch:{term:function(t){this.fetchResults(t)}},methods:{fetchResults:function(t){var e=this;clearTimeout(this.timeout),this.timeout=setTimeout(function(){e.results=[],t&&e.query(t).then(function(t){e.results=t})},500)},onInputClick:function(){this.resultsVisible=!0},onClickOutside:function(){this.resultsVisible=!1}}};var C=function(t){s(599)},x=Object(o.a)(w,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:t.onClickOutside,expression:"onClickOutside"}],staticClass:"autosuggest"},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.term,expression:"term"}],staticClass:"autosuggest-input",attrs:{placeholder:t.placeholder},domProps:{value:t.term},on:{click:t.onInputClick,input:function(e){e.target.composing||(t.term=e.target.value)}}}),t._v(" "),t.resultsVisible&&t.filtered.length>0?s("div",{staticClass:"autosuggest-results"},[t._l(t.filtered,function(e){return t._t("default",null,{item:e})})],2):t._e()])},[],!1,C,null,null).exports,k=s(38),y={props:["userId"],data:function(){return{progress:!1}},computed:{user:function(){return this.$store.getters.findUser(this.userId)},relationship:function(){return this.$store.getters.relationship(this.userId)},blocked:function(){return this.relationship.blocking}},components:{BasicUserCard:k.a},methods:{unblockUser:function(){var t=this;this.progress=!0,this.$store.dispatch("unblockUser",this.user.id).then(function(){t.progress=!1})},blockUser:function(){var t=this;this.progress=!0,this.$store.dispatch("blockUser",this.user.id).then(function(){t.progress=!1})}}};var $=function(t){s(601)},L=Object(o.a)(y,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("basic-user-card",{attrs:{user:t.user}},[s("div",{staticClass:"block-card-content-container"},[t.blocked?s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.unblockUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.unblock_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.unblock"))+"\n ")]],2):s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.blockUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.block_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.block"))+"\n ")]],2)])])},[],!1,$,null,null).exports,T={props:["userId"],data:function(){return{progress:!1}},computed:{user:function(){return this.$store.getters.findUser(this.userId)},relationship:function(){return this.$store.getters.relationship(this.userId)},muted:function(){return this.relationship.muting}},components:{BasicUserCard:k.a},methods:{unmuteUser:function(){var t=this;this.progress=!0,this.$store.dispatch("unmuteUser",this.userId).then(function(){t.progress=!1})},muteUser:function(){var t=this;this.progress=!0,this.$store.dispatch("muteUser",this.userId).then(function(){t.progress=!1})}}};var O=function(t){s(603)},P=Object(o.a)(T,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("basic-user-card",{attrs:{user:t.user}},[s("div",{staticClass:"mute-card-content-container"},[t.muted?s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.unmuteUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.unmute_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.unmute"))+"\n ")]],2):s("button",{staticClass:"btn btn-default",attrs:{disabled:t.progress},on:{click:t.muteUser}},[t.progress?[t._v("\n "+t._s(t.$t("user_card.mute_progress"))+"\n ")]:[t._v("\n "+t._s(t.$t("user_card.mute"))+"\n ")]],2)])])},[],!1,O,null,null).exports,S=s(78),I={props:["domain"],components:{ProgressButton:S.a},computed:{user:function(){return this.$store.state.users.currentUser},muted:function(){return this.user.domainMutes.includes(this.domain)}},methods:{unmuteDomain:function(){return this.$store.dispatch("unmuteDomain",this.domain)},muteDomain:function(){return this.$store.dispatch("muteDomain",this.domain)}}};var j=function(t){s(605)},E=Object(o.a)(I,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"domain-mute-card"},[s("div",{staticClass:"domain-mute-card-domain"},[t._v("\n "+t._s(t.domain)+"\n ")]),t._v(" "),t.muted?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:t.unmuteDomain}},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute_progress"))+"\n ")])],2):s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:t.muteDomain}},[t._v("\n "+t._s(t.$t("domain_mute_card.mute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("domain_mute_card.mute_progress"))+"\n ")])],2)],1)},[],!1,j,null,null).exports,R={components:{List:s(52).a,Checkbox:d.a},props:{items:{type:Array,default:function(){return[]}},getKey:{type:Function,default:function(t){return t.id}}},data:function(){return{selected:[]}},computed:{allKeys:function(){return this.items.map(this.getKey)},filteredSelected:function(){var t=this;return this.allKeys.filter(function(e){return-1!==t.selected.indexOf(e)})},allSelected:function(){return this.filteredSelected.length===this.items.length},noneSelected:function(){return 0===this.filteredSelected.length},someSelected:function(){return!this.allSelected&&!this.noneSelected}},methods:{isSelected:function(t){return-1!==this.filteredSelected.indexOf(this.getKey(t))},toggle:function(t,e){var s=this.getKey(e);t!==this.isSelected(s)&&(t?this.selected.push(s):this.selected.splice(this.selected.indexOf(s),1))},toggleAll:function(t){this.selected=t?this.allKeys.slice(0):[]}}};var B=function(t){s(607)},F=Object(o.a)(R,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"selectable-list"},[t.items.length>0?s("div",{staticClass:"selectable-list-header"},[s("div",{staticClass:"selectable-list-checkbox-wrapper"},[s("Checkbox",{attrs:{checked:t.allSelected,indeterminate:t.someSelected},on:{change:t.toggleAll}},[t._v("\n "+t._s(t.$t("selectable_list.select_all"))+"\n ")])],1),t._v(" "),s("div",{staticClass:"selectable-list-header-actions"},[t._t("header",null,{selected:t.filteredSelected})],2)]):t._e(),t._v(" "),s("List",{attrs:{items:t.items,"get-key":t.getKey},scopedSlots:t._u([{key:"item",fn:function(e){var a=e.item;return[s("div",{staticClass:"selectable-list-item-inner",class:{"selectable-list-item-selected-inner":t.isSelected(a)}},[s("div",{staticClass:"selectable-list-checkbox-wrapper"},[s("Checkbox",{attrs:{checked:t.isSelected(a)},on:{change:function(e){return t.toggle(e,a)}}})],1),t._v(" "),t._t("item",null,{item:a})],2)]}}],null,!0)},[t._v(" "),s("template",{slot:"empty"},[t._t("empty")],2)],2)],1)},[],!1,B,null,null).exports,M=s(190),U=s.n(M),V=s(7),A=s.n(V),D=s(1),N=s.n(D),W=s(10),z=s.n(W),q=s(6),G=s.n(q),H=s(191),K=s.n(H),J=s(192);s(609);function Q(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}function X(t){for(var e=1;e0?s("ProgressButton",{staticClass:"btn btn-default bulk-action-button",attrs:{click:function(){return t.blockUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.block"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.block_progress"))+"\n ")])],2):t._e(),t._v(" "),a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.unblockUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.unblock"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.unblock_progress"))+"\n ")])],2):t._e()],1)]}},{key:"item",fn:function(t){var e=t.item;return[s("BlockCard",{attrs:{"user-id":e}})]}}])},[t._v(" "),t._v(" "),s("template",{slot:"empty"},[t._v("\n "+t._s(t.$t("settings.no_blocks"))+"\n ")])],2)],1),t._v(" "),s("div",{attrs:{label:t.$t("settings.mutes_tab")}},[s("tab-switcher",[s("div",{attrs:{label:"Users"}},[s("div",{staticClass:"usersearch-wrapper"},[s("Autosuggest",{attrs:{filter:t.filterUnMutedUsers,query:t.queryUserIds,placeholder:t.$t("settings.search_user_to_mute")},scopedSlots:t._u([{key:"default",fn:function(t){return s("MuteCard",{attrs:{"user-id":t.item}})}}])})],1),t._v(" "),s("MuteList",{attrs:{refresh:!0,"get-key":function(t){return t}},scopedSlots:t._u([{key:"header",fn:function(e){var a=e.selected;return[s("div",{staticClass:"bulk-actions"},[a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.muteUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.mute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.mute_progress"))+"\n ")])],2):t._e(),t._v(" "),a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.unmuteUsers(a)}}},[t._v("\n "+t._s(t.$t("user_card.unmute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("user_card.unmute_progress"))+"\n ")])],2):t._e()],1)]}},{key:"item",fn:function(t){var e=t.item;return[s("MuteCard",{attrs:{"user-id":e}})]}}])},[t._v(" "),t._v(" "),s("template",{slot:"empty"},[t._v("\n "+t._s(t.$t("settings.no_mutes"))+"\n ")])],2)],1),t._v(" "),s("div",{attrs:{label:t.$t("settings.domain_mutes")}},[s("div",{staticClass:"domain-mute-form"},[s("Autosuggest",{attrs:{filter:t.filterUnMutedDomains,query:t.queryKnownDomains,placeholder:t.$t("settings.type_domains_to_mute")},scopedSlots:t._u([{key:"default",fn:function(t){return s("DomainMuteCard",{attrs:{domain:t.item}})}}])})],1),t._v(" "),s("DomainMuteList",{attrs:{refresh:!0,"get-key":function(t){return t}},scopedSlots:t._u([{key:"header",fn:function(e){var a=e.selected;return[s("div",{staticClass:"bulk-actions"},[a.length>0?s("ProgressButton",{staticClass:"btn btn-default",attrs:{click:function(){return t.unmuteDomains(a)}}},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute"))+"\n "),s("template",{slot:"progress"},[t._v("\n "+t._s(t.$t("domain_mute_card.unmute_progress"))+"\n ")])],2):t._e()],1)]}},{key:"item",fn:function(t){var e=t.item;return[s("DomainMuteCard",{attrs:{domain:e}})]}}])},[t._v(" "),t._v(" "),s("template",{slot:"empty"},[t._v("\n "+t._s(t.$t("settings.no_mutes"))+"\n ")])],2)],1)])],1)])},[],!1,at,null,null).exports,ot={data:function(){return{activeTab:"profile",notificationSettings:this.$store.state.users.currentUser.notification_settings,newDomainToMute:""}},components:{Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser}},methods:{updateNotificationSettings:function(){this.$store.state.api.backendInteractor.updateNotificationSettings({settings:this.notificationSettings})}}},it=Object(o.a)(ot,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.notifications")}},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.notification_setting_filters")))]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.notificationSettings.block_from_strangers,callback:function(e){t.$set(t.notificationSettings,"block_from_strangers",e)},expression:"notificationSettings.block_from_strangers"}},[t._v("\n "+t._s(t.$t("settings.notification_setting_block_from_strangers"))+"\n ")])],1)]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.notification_setting_privacy")))]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.notificationSettings.hide_notification_contents,callback:function(e){t.$set(t.notificationSettings,"hide_notification_contents",e)},expression:"notificationSettings.hide_notification_contents"}},[t._v("\n "+t._s(t.$t("settings.notification_setting_hide_notification_contents"))+"\n ")])],1)]),t._v(" "),s("div",{staticClass:"setting-item"},[s("p",[t._v(t._s(t.$t("settings.notification_mutes")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.notification_blocks")))]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.updateNotificationSettings}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")])])])},[],!1,null,null,null).exports,rt=s(610),lt=s.n(rt),ct=s(37),ut=s.n(ct),dt=s(95);function pt(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}function mt(t){for(var e=1;e0})})}}}),watch:{notificationVisibility:{handler:function(t){this.$store.dispatch("setOption",{name:"notificationVisibility",value:this.$store.getters.mergedConfig.notificationVisibility})},deep:!0},replyVisibility:function(){this.$store.dispatch("queueFlushAll")}}},ft=Object(o.a)(bt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.filtering")}},[s("div",{staticClass:"setting-item"},[s("div",{staticClass:"select-multiple"},[s("span",{staticClass:"label"},[t._v(t._s(t.$t("settings.notification_visibility")))]),t._v(" "),s("ul",{staticClass:"option-list"},[s("li",[s("Checkbox",{model:{value:t.notificationVisibility.likes,callback:function(e){t.$set(t.notificationVisibility,"likes",e)},expression:"notificationVisibility.likes"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_likes"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.repeats,callback:function(e){t.$set(t.notificationVisibility,"repeats",e)},expression:"notificationVisibility.repeats"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_repeats"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.follows,callback:function(e){t.$set(t.notificationVisibility,"follows",e)},expression:"notificationVisibility.follows"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_follows"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.mentions,callback:function(e){t.$set(t.notificationVisibility,"mentions",e)},expression:"notificationVisibility.mentions"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_mentions"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.moves,callback:function(e){t.$set(t.notificationVisibility,"moves",e)},expression:"notificationVisibility.moves"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_moves"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.notificationVisibility.emojiReactions,callback:function(e){t.$set(t.notificationVisibility,"emojiReactions",e)},expression:"notificationVisibility.emojiReactions"}},[t._v("\n "+t._s(t.$t("settings.notification_visibility_emoji_reactions"))+"\n ")])],1)])]),t._v(" "),s("div",[t._v("\n "+t._s(t.$t("settings.replies_in_timeline"))+"\n "),s("label",{staticClass:"select",attrs:{for:"replyVisibility"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.replyVisibility,expression:"replyVisibility"}],attrs:{id:"replyVisibility"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.replyVisibility=e.target.multiple?s:s[0]}}},[s("option",{attrs:{value:"all",selected:""}},[t._v(t._s(t.$t("settings.reply_visibility_all")))]),t._v(" "),s("option",{attrs:{value:"following"}},[t._v(t._s(t.$t("settings.reply_visibility_following")))]),t._v(" "),s("option",{attrs:{value:"self"}},[t._v(t._s(t.$t("settings.reply_visibility_self")))])]),t._v(" "),s("i",{staticClass:"icon-down-open"})])]),t._v(" "),s("div",[s("Checkbox",{model:{value:t.hidePostStats,callback:function(e){t.hidePostStats=e},expression:"hidePostStats"}},[t._v("\n "+t._s(t.$t("settings.hide_post_stats"))+" "+t._s(t.$t("settings.instance_default",{value:t.hidePostStatsLocalizedValue}))+"\n ")])],1),t._v(" "),s("div",[s("Checkbox",{model:{value:t.hideUserStats,callback:function(e){t.hideUserStats=e},expression:"hideUserStats"}},[t._v("\n "+t._s(t.$t("settings.hide_user_stats"))+" "+t._s(t.$t("settings.instance_default",{value:t.hideUserStatsLocalizedValue}))+"\n ")])],1)]),t._v(" "),s("div",{staticClass:"setting-item"},[s("div",[s("p",[t._v(t._s(t.$t("settings.filtering_explanation")))]),t._v(" "),s("textarea",{directives:[{name:"model",rawName:"v-model",value:t.muteWordsString,expression:"muteWordsString"}],attrs:{id:"muteWords"},domProps:{value:t.muteWordsString},on:{input:function(e){e.target.composing||(t.muteWordsString=e.target.value)}}})]),t._v(" "),s("div",[s("Checkbox",{model:{value:t.hideFilteredStatuses,callback:function(e){t.hideFilteredStatuses=e},expression:"hideFilteredStatuses"}},[t._v("\n "+t._s(t.$t("settings.hide_filtered_statuses"))+" "+t._s(t.$t("settings.instance_default",{value:t.hideFilteredStatusesLocalizedValue}))+"\n ")])],1)])])},[],!1,null,null,null).exports,gt=s(3),_t=s.n(gt),wt={props:{backupCodes:{type:Object,default:function(){return{inProgress:!1,codes:[]}}}},data:function(){return{}},computed:{inProgress:function(){return this.backupCodes.inProgress},ready:function(){return this.backupCodes.codes.length>0},displayTitle:function(){return this.inProgress||this.ready}}};var Ct=function(t){s(615)},xt=Object(o.a)(wt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"mfa-backup-codes"},[t.displayTitle?s("h4",[t._v("\n "+t._s(t.$t("settings.mfa.recovery_codes"))+"\n ")]):t._e(),t._v(" "),t.inProgress?s("i",[t._v(t._s(t.$t("settings.mfa.waiting_a_recovery_codes")))]):t._e(),t._v(" "),t.ready?[s("p",{staticClass:"alert warning"},[t._v("\n "+t._s(t.$t("settings.mfa.recovery_codes_warning"))+"\n ")]),t._v(" "),s("ul",{staticClass:"backup-codes"},t._l(t.backupCodes.codes,function(e){return s("li",{key:e},[t._v("\n "+t._s(e)+"\n ")])}),0)]:t._e()],2)},[],!1,Ct,null,null).exports,kt={props:["disabled"],data:function(){return{}},methods:{confirm:function(){this.$emit("confirm")},cancel:function(){this.$emit("cancel")}}},yt=Object(o.a)(kt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",[t._t("default"),t._v(" "),s("button",{staticClass:"btn btn-default",attrs:{disabled:t.disabled},on:{click:t.confirm}},[t._v("\n "+t._s(t.$t("general.confirm"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn btn-default",attrs:{disabled:t.disabled},on:{click:t.cancel}},[t._v("\n "+t._s(t.$t("general.cancel"))+"\n ")])],2)},[],!1,null,null,null).exports,$t=s(2);function Lt(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}var Tt={props:["settings"],data:function(){return{error:!1,currentPassword:"",deactivate:!1,inProgress:!1}},components:{confirm:yt},computed:function(t){for(var e=1;e0},confirmNewBackupCodes:function(){return this.backupCodes.getNewCodes}},Object($t.e)({backendInteractor:function(t){return t.api.backendInteractor}})),methods:{activateOTP:function(){this.settings.enabled||(this.setupState.state="getBackupcodes",this.fetchBackupCodes())},fetchBackupCodes:function(){var t=this;return this.backupCodes.inProgress=!0,this.backupCodes.codes=[],this.backendInteractor.generateMfaBackupCodes().then(function(e){t.backupCodes.codes=e.codes,t.backupCodes.inProgress=!1})},getBackupCodes:function(){this.backupCodes.getNewCodes=!0},confirmBackupCodes:function(){var t=this;this.fetchBackupCodes().then(function(e){t.backupCodes.getNewCodes=!1})},cancelBackupCodes:function(){this.backupCodes.getNewCodes=!1},setupOTP:function(){var t=this;this.setupState.state="setupOTP",this.setupState.setupOTPState="prepare",this.backendInteractor.mfaSetupOTP().then(function(e){t.otpSettings=e,t.setupState.setupOTPState="confirm"})},doConfirmOTP:function(){var t=this;this.error=null,this.backendInteractor.mfaConfirmOTP({token:this.otpConfirmToken,password:this.currentPassword}).then(function(e){e.error?t.error=e.error:t.completeSetup()})},completeSetup:function(){this.setupState.setupOTPState="complete",this.setupState.state="complete",this.currentPassword=null,this.error=null,this.fetchSettings()},cancelSetup:function(){this.setupState.setupOTPState="",this.setupState.state="",this.currentPassword=null,this.error=null},fetchSettings:function(){var t;return _t.a.async(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,_t.a.awrap(this.backendInteractor.settingsMFA());case 2:if(!(t=e.sent).error){e.next=5;break}return e.abrupt("return");case 5:return this.settings=t.settings,this.settings.available=!0,e.abrupt("return",t);case 8:case"end":return e.stop()}},null,this)}},mounted:function(){var t=this;this.fetchSettings().then(function(){t.readyInit=!0})}};var St=function(t){s(613)},It=Object(o.a)(Pt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return t.readyInit&&t.settings.available?s("div",{staticClass:"setting-item mfa-settings"},[s("div",{staticClass:"mfa-heading"},[s("h2",[t._v(t._s(t.$t("settings.mfa.title")))])]),t._v(" "),s("div",[t.setupInProgress?t._e():s("div",{staticClass:"setting-item"},[s("h3",[t._v(t._s(t.$t("settings.mfa.authentication_methods")))]),t._v(" "),s("totp-item",{attrs:{settings:t.settings},on:{deactivate:t.fetchSettings,activate:t.activateOTP}}),t._v(" "),s("br"),t._v(" "),t.settings.enabled?s("div",[t.confirmNewBackupCodes?t._e():s("recovery-codes",{attrs:{"backup-codes":t.backupCodes}}),t._v(" "),t.confirmNewBackupCodes?t._e():s("button",{staticClass:"btn btn-default",on:{click:t.getBackupCodes}},[t._v("\n "+t._s(t.$t("settings.mfa.generate_new_recovery_codes"))+"\n ")]),t._v(" "),t.confirmNewBackupCodes?s("div",[s("confirm",{attrs:{disabled:t.backupCodes.inProgress},on:{confirm:t.confirmBackupCodes,cancel:t.cancelBackupCodes}},[s("p",{staticClass:"warning"},[t._v("\n "+t._s(t.$t("settings.mfa.warning_of_generate_new_codes"))+"\n ")])])],1):t._e()],1):t._e()],1),t._v(" "),t.setupInProgress?s("div",[s("h3",[t._v(t._s(t.$t("settings.mfa.setup_otp")))]),t._v(" "),t.setupOTPInProgress?t._e():s("recovery-codes",{attrs:{"backup-codes":t.backupCodes}}),t._v(" "),t.canSetupOTP?s("button",{staticClass:"btn btn-default",on:{click:t.cancelSetup}},[t._v("\n "+t._s(t.$t("general.cancel"))+"\n ")]):t._e(),t._v(" "),t.canSetupOTP?s("button",{staticClass:"btn btn-default",on:{click:t.setupOTP}},[t._v("\n "+t._s(t.$t("settings.mfa.setup_otp"))+"\n ")]):t._e(),t._v(" "),t.setupOTPInProgress?[t.prepareOTP?s("i",[t._v(t._s(t.$t("settings.mfa.wait_pre_setup_otp")))]):t._e(),t._v(" "),t.confirmOTP?s("div",[s("div",{staticClass:"setup-otp"},[s("div",{staticClass:"qr-code"},[s("h4",[t._v(t._s(t.$t("settings.mfa.scan.title")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.mfa.scan.desc")))]),t._v(" "),s("qrcode",{attrs:{value:t.otpSettings.provisioning_uri,options:{width:200}}}),t._v(" "),s("p",[t._v("\n "+t._s(t.$t("settings.mfa.scan.secret_code"))+":\n "+t._s(t.otpSettings.key)+"\n ")])],1),t._v(" "),s("div",{staticClass:"verify"},[s("h4",[t._v(t._s(t.$t("general.verify")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.mfa.verify.desc")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.otpConfirmToken,expression:"otpConfirmToken"}],attrs:{type:"text"},domProps:{value:t.otpConfirmToken},on:{input:function(e){e.target.composing||(t.otpConfirmToken=e.target.value)}}}),t._v(" "),s("p",[t._v(t._s(t.$t("settings.enter_current_password_to_confirm"))+":")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.currentPassword,expression:"currentPassword"}],attrs:{type:"password"},domProps:{value:t.currentPassword},on:{input:function(e){e.target.composing||(t.currentPassword=e.target.value)}}}),t._v(" "),s("div",{staticClass:"confirm-otp-actions"},[s("button",{staticClass:"btn btn-default",on:{click:t.doConfirmOTP}},[t._v("\n "+t._s(t.$t("settings.mfa.confirm_and_enable"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.cancelSetup}},[t._v("\n "+t._s(t.$t("general.cancel"))+"\n ")])]),t._v(" "),t.error?s("div",{staticClass:"alert error"},[t._v("\n "+t._s(t.error)+"\n ")]):t._e()])])]):t._e()]:t._e()],2):t._e()])]):t._e()},[],!1,St,null,null).exports,jt={data:function(){return{newEmail:"",changeEmailError:!1,changeEmailPassword:"",changedEmail:!1,deletingAccount:!1,deleteAccountConfirmPasswordInput:"",deleteAccountError:!1,changePasswordInputs:["","",""],changedPassword:!1,changePasswordError:!1}},created:function(){this.$store.dispatch("fetchTokens")},components:{ProgressButton:S.a,Mfa:It,Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser},pleromaBackend:function(){return this.$store.state.instance.pleromaBackend},oauthTokens:function(){return this.$store.state.oauthTokens.tokens.map(function(t){return{id:t.id,appName:t.app_name,validUntil:new Date(t.valid_until).toLocaleDateString()}})}},methods:{confirmDelete:function(){this.deletingAccount=!0},deleteAccount:function(){var t=this;this.$store.state.api.backendInteractor.deleteAccount({password:this.deleteAccountConfirmPasswordInput}).then(function(e){"success"===e.status?(t.$store.dispatch("logout"),t.$router.push({name:"root"})):t.deleteAccountError=e.error})},changePassword:function(){var t=this,e={password:this.changePasswordInputs[0],newPassword:this.changePasswordInputs[1],newPasswordConfirmation:this.changePasswordInputs[2]};this.$store.state.api.backendInteractor.changePassword(e).then(function(e){"success"===e.status?(t.changedPassword=!0,t.changePasswordError=!1,t.logout()):(t.changedPassword=!1,t.changePasswordError=e.error)})},changeEmail:function(){var t=this,e={email:this.newEmail,password:this.changeEmailPassword};this.$store.state.api.backendInteractor.changeEmail(e).then(function(e){"success"===e.status?(t.changedEmail=!0,t.changeEmailError=!1):(t.changedEmail=!1,t.changeEmailError=e.error)})},logout:function(){this.$store.dispatch("logout"),this.$router.replace("/")},revokeToken:function(t){window.confirm("".concat(this.$i18n.t("settings.revoke_token"),"?"))&&this.$store.dispatch("revokeToken",t)}}},Et=Object(o.a)(jt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.security_tab")}},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.change_email")))]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.new_email")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.newEmail,expression:"newEmail"}],attrs:{type:"email",autocomplete:"email"},domProps:{value:t.newEmail},on:{input:function(e){e.target.composing||(t.newEmail=e.target.value)}}})]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.current_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changeEmailPassword,expression:"changeEmailPassword"}],attrs:{type:"password",autocomplete:"current-password"},domProps:{value:t.changeEmailPassword},on:{input:function(e){e.target.composing||(t.changeEmailPassword=e.target.value)}}})]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.changeEmail}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")]),t._v(" "),t.changedEmail?s("p",[t._v("\n "+t._s(t.$t("settings.changed_email"))+"\n ")]):t._e(),t._v(" "),!1!==t.changeEmailError?[s("p",[t._v(t._s(t.$t("settings.change_email_error")))]),t._v(" "),s("p",[t._v(t._s(t.changeEmailError))])]:t._e()],2),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.change_password")))]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.current_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changePasswordInputs[0],expression:"changePasswordInputs[0]"}],attrs:{type:"password"},domProps:{value:t.changePasswordInputs[0]},on:{input:function(e){e.target.composing||t.$set(t.changePasswordInputs,0,e.target.value)}}})]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.new_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changePasswordInputs[1],expression:"changePasswordInputs[1]"}],attrs:{type:"password"},domProps:{value:t.changePasswordInputs[1]},on:{input:function(e){e.target.composing||t.$set(t.changePasswordInputs,1,e.target.value)}}})]),t._v(" "),s("div",[s("p",[t._v(t._s(t.$t("settings.confirm_new_password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.changePasswordInputs[2],expression:"changePasswordInputs[2]"}],attrs:{type:"password"},domProps:{value:t.changePasswordInputs[2]},on:{input:function(e){e.target.composing||t.$set(t.changePasswordInputs,2,e.target.value)}}})]),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.changePassword}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")]),t._v(" "),t.changedPassword?s("p",[t._v("\n "+t._s(t.$t("settings.changed_password"))+"\n ")]):!1!==t.changePasswordError?s("p",[t._v("\n "+t._s(t.$t("settings.change_password_error"))+"\n ")]):t._e(),t._v(" "),t.changePasswordError?s("p",[t._v("\n "+t._s(t.changePasswordError)+"\n ")]):t._e()]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.oauth_tokens")))]),t._v(" "),s("table",{staticClass:"oauth-tokens"},[s("thead",[s("tr",[s("th",[t._v(t._s(t.$t("settings.app_name")))]),t._v(" "),s("th",[t._v(t._s(t.$t("settings.valid_until")))]),t._v(" "),s("th")])]),t._v(" "),s("tbody",t._l(t.oauthTokens,function(e){return s("tr",{key:e.id},[s("td",[t._v(t._s(e.appName))]),t._v(" "),s("td",[t._v(t._s(e.validUntil))]),t._v(" "),s("td",{staticClass:"actions"},[s("button",{staticClass:"btn btn-default",on:{click:function(s){return t.revokeToken(e.id)}}},[t._v("\n "+t._s(t.$t("settings.revoke_token"))+"\n ")])])])}),0)])]),t._v(" "),s("mfa"),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.delete_account")))]),t._v(" "),t.deletingAccount?t._e():s("p",[t._v("\n "+t._s(t.$t("settings.delete_account_description"))+"\n ")]),t._v(" "),t.deletingAccount?s("div",[s("p",[t._v(t._s(t.$t("settings.delete_account_instructions")))]),t._v(" "),s("p",[t._v(t._s(t.$t("login.password")))]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.deleteAccountConfirmPasswordInput,expression:"deleteAccountConfirmPasswordInput"}],attrs:{type:"password"},domProps:{value:t.deleteAccountConfirmPasswordInput},on:{input:function(e){e.target.composing||(t.deleteAccountConfirmPasswordInput=e.target.value)}}}),t._v(" "),s("button",{staticClass:"btn btn-default",on:{click:t.deleteAccount}},[t._v("\n "+t._s(t.$t("settings.delete_account"))+"\n ")])]):t._e(),t._v(" "),!1!==t.deleteAccountError?s("p",[t._v("\n "+t._s(t.$t("settings.delete_account_error"))+"\n ")]):t._e(),t._v(" "),t.deleteAccountError?s("p",[t._v("\n "+t._s(t.deleteAccountError)+"\n ")]):t._e(),t._v(" "),t.deletingAccount?t._e():s("button",{staticClass:"btn btn-default",on:{click:t.confirmDelete}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")])])],1)},[],!1,null,null,null).exports,Rt=s(188),Bt=s.n(Rt),Ft=s(96),Mt=s.n(Ft),Ut=s(27),Vt=s.n(Ut),At=s(622),Dt=(s(623),{props:{trigger:{type:[String,window.Element],required:!0},submitHandler:{type:Function,required:!0},cropperOptions:{type:Object,default:function(){return{aspectRatio:1,autoCropArea:1,viewMode:1,movable:!1,zoomable:!1,guides:!1}}},mimes:{type:String,default:"image/png, image/gif, image/jpeg, image/bmp, image/x-icon"},saveButtonLabel:{type:String},saveWithoutCroppingButtonlabel:{type:String},cancelButtonLabel:{type:String}},data:function(){return{cropper:void 0,dataUrl:void 0,filename:void 0,submitting:!1,submitError:null}},computed:{saveText:function(){return this.saveButtonLabel||this.$t("image_cropper.save")},saveWithoutCroppingText:function(){return this.saveWithoutCroppingButtonlabel||this.$t("image_cropper.save_without_cropping")},cancelText:function(){return this.cancelButtonLabel||this.$t("image_cropper.cancel")},submitErrorMsg:function(){return this.submitError&&this.submitError instanceof Error?this.submitError.toString():this.submitError}},methods:{destroy:function(){this.cropper&&this.cropper.destroy(),this.$refs.input.value="",this.dataUrl=void 0,this.$emit("close")},submit:function(){var t=this,e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.submitting=!0,this.avatarUploadError=null,this.submitHandler(e&&this.cropper,this.file).then(function(){return t.destroy()}).catch(function(e){t.submitError=e}).finally(function(){t.submitting=!1})},pickImage:function(){this.$refs.input.click()},createCropper:function(){this.cropper=new At.a(this.$refs.img,this.cropperOptions)},getTriggerDOM:function(){return"object"===Vt()(this.trigger)?this.trigger:document.querySelector(this.trigger)},readFile:function(){var t=this,e=this.$refs.input;if(null!=e.files&&null!=e.files[0]){this.file=e.files[0];var s=new window.FileReader;s.onload=function(e){t.dataUrl=e.target.result,t.$emit("open")},s.readAsDataURL(this.file),this.$emit("changed",this.file,s)}},clearError:function(){this.submitError=null}},mounted:function(){var t=this.getTriggerDOM();t?t.addEventListener("click",this.pickImage):this.$emit("error","No image make trigger found.","user"),this.$refs.input.addEventListener("change",this.readFile)},beforeDestroy:function(){var t=this.getTriggerDOM();t&&t.removeEventListener("click",this.pickImage),this.$refs.input.removeEventListener("change",this.readFile)}});var Nt=function(t){s(620)},Wt=Object(o.a)(Dt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"image-cropper"},[t.dataUrl?s("div",[s("div",{staticClass:"image-cropper-image-container"},[s("img",{ref:"img",attrs:{src:t.dataUrl,alt:""},on:{load:function(e){return e.stopPropagation(),t.createCropper(e)}}})]),t._v(" "),s("div",{staticClass:"image-cropper-buttons-wrapper"},[s("button",{staticClass:"btn",attrs:{type:"button",disabled:t.submitting},domProps:{textContent:t._s(t.saveText)},on:{click:function(e){return t.submit()}}}),t._v(" "),s("button",{staticClass:"btn",attrs:{type:"button",disabled:t.submitting},domProps:{textContent:t._s(t.cancelText)},on:{click:t.destroy}}),t._v(" "),s("button",{staticClass:"btn",attrs:{type:"button",disabled:t.submitting},domProps:{textContent:t._s(t.saveWithoutCroppingText)},on:{click:function(e){return t.submit(!1)}}}),t._v(" "),t.submitting?s("i",{staticClass:"icon-spin4 animate-spin"}):t._e()]),t._v(" "),t.submitError?s("div",{staticClass:"alert error"},[t._v("\n "+t._s(t.submitErrorMsg)+"\n "),s("i",{staticClass:"button-icon icon-cancel",on:{click:t.clearError}})]):t._e()]):t._e(),t._v(" "),s("input",{ref:"input",staticClass:"image-cropper-img-input",attrs:{type:"file",accept:t.mimes}})])},[],!1,Nt,null,null).exports,zt=s(196),qt=s(134),Gt=s(195),Ht=s(135),Kt={data:function(){return{newName:this.$store.state.users.currentUser.name,newBio:Bt()(this.$store.state.users.currentUser.description),newLocked:this.$store.state.users.currentUser.locked,newNoRichText:this.$store.state.users.currentUser.no_rich_text,newDefaultScope:this.$store.state.users.currentUser.default_scope,newFields:this.$store.state.users.currentUser.fields.map(function(t){return{name:t.name,value:t.value}}),hideFollows:this.$store.state.users.currentUser.hide_follows,hideFollowers:this.$store.state.users.currentUser.hide_followers,hideFollowsCount:this.$store.state.users.currentUser.hide_follows_count,hideFollowersCount:this.$store.state.users.currentUser.hide_followers_count,showRole:this.$store.state.users.currentUser.show_role,role:this.$store.state.users.currentUser.role,discoverable:this.$store.state.users.currentUser.discoverable,bot:this.$store.state.users.currentUser.bot,allowFollowingMove:this.$store.state.users.currentUser.allow_following_move,pickAvatarBtnVisible:!0,bannerUploading:!1,backgroundUploading:!1,banner:null,bannerPreview:null,background:null,backgroundPreview:null,bannerUploadError:null,backgroundUploadError:null}},components:{ScopeSelector:zt.a,ImageCropper:Wt,EmojiInput:Gt.a,Autosuggest:x,ProgressButton:S.a,Checkbox:d.a},computed:{user:function(){return this.$store.state.users.currentUser},emojiUserSuggestor:function(){var t=this;return Object(Ht.a)({emoji:[].concat(z()(this.$store.state.instance.emoji),z()(this.$store.state.instance.customEmoji)),users:this.$store.state.users.users,updateUsersList:function(e){return t.$store.dispatch("searchUsers",{query:e})}})},emojiSuggestor:function(){return Object(Ht.a)({emoji:[].concat(z()(this.$store.state.instance.emoji),z()(this.$store.state.instance.customEmoji))})},userSuggestor:function(){var t=this;return Object(Ht.a)({users:this.$store.state.users.users,updateUsersList:function(e){return t.$store.dispatch("searchUsers",{query:e})}})},fieldsLimits:function(){return this.$store.state.instance.fieldsLimits},maxFields:function(){return this.fieldsLimits?this.fieldsLimits.maxFields:0},defaultAvatar:function(){return this.$store.state.instance.server+this.$store.state.instance.defaultAvatar},defaultBanner:function(){return this.$store.state.instance.server+this.$store.state.instance.defaultBanner},isDefaultAvatar:function(){var t=this.$store.state.instance.defaultAvatar;return!this.$store.state.users.currentUser.profile_image_url||this.$store.state.users.currentUser.profile_image_url.includes(t)},isDefaultBanner:function(){var t=this.$store.state.instance.defaultBanner;return!this.$store.state.users.currentUser.cover_photo||this.$store.state.users.currentUser.cover_photo.includes(t)},isDefaultBackground:function(){return!this.$store.state.users.currentUser.background_image},avatarImgSrc:function(){var t=this.$store.state.users.currentUser.profile_image_url_original;return t||this.defaultAvatar},bannerImgSrc:function(){var t=this.$store.state.users.currentUser.cover_photo;return t||this.defaultBanner}},methods:{updateProfile:function(){var t=this;this.$store.state.api.backendInteractor.updateProfile({params:{note:this.newBio,locked:this.newLocked,display_name:this.newName,fields_attributes:this.newFields.filter(function(t){return null!=t}),default_scope:this.newDefaultScope,no_rich_text:this.newNoRichText,hide_follows:this.hideFollows,hide_followers:this.hideFollowers,discoverable:this.discoverable,bot:this.bot,allow_following_move:this.allowFollowingMove,hide_follows_count:this.hideFollowsCount,hide_followers_count:this.hideFollowersCount,show_role:this.showRole}}).then(function(e){t.newFields.splice(e.fields.length),Mt()(t.newFields,e.fields),t.$store.commit("addNewUsers",[e]),t.$store.commit("setCurrentUser",e)})},changeVis:function(t){this.newDefaultScope=t},addField:function(){return this.newFields.lengththis.$store.state.instance[t+"limit"]){var n=qt.a.fileSizeFormat(a.size),o=qt.a.fileSizeFormat(this.$store.state.instance[t+"limit"]);this[t+"UploadError"]=[this.$t("upload.error.base"),this.$t("upload.error.file_too_big",{filesize:n.num,filesizeunit:n.unit,allowedsize:o.num,allowedsizeunit:o.unit})].join(" ")}else{var i=new FileReader;i.onload=function(e){var n=e.target.result;s[t+"Preview"]=n,s[t]=a},i.readAsDataURL(a)}},resetAvatar:function(){window.confirm(this.$t("settings.reset_avatar_confirm"))&&this.submitAvatar(void 0,"")},resetBanner:function(){window.confirm(this.$t("settings.reset_banner_confirm"))&&this.submitBanner("")},resetBackground:function(){window.confirm(this.$t("settings.reset_background_confirm"))&&this.submitBackground("")},submitAvatar:function(t,e){var s=this;return new Promise(function(a,n){function o(t){s.$store.state.api.backendInteractor.updateProfileImages({avatar:t}).then(function(t){s.$store.commit("addNewUsers",[t]),s.$store.commit("setCurrentUser",t),a()}).catch(function(t){n(new Error(s.$t("upload.error.base")+" "+t.message))})}t?t.getCroppedCanvas().toBlob(o,e.type):o(e)})},submitBanner:function(t){var e=this;(this.bannerPreview||""===t)&&(this.bannerUploading=!0,this.$store.state.api.backendInteractor.updateProfileImages({banner:t}).then(function(t){e.$store.commit("addNewUsers",[t]),e.$store.commit("setCurrentUser",t),e.bannerPreview=null}).catch(function(t){e.bannerUploadError=e.$t("upload.error.base")+" "+t.message}).then(function(){e.bannerUploading=!1}))},submitBackground:function(t){var e=this;(this.backgroundPreview||""===t)&&(this.backgroundUploading=!0,this.$store.state.api.backendInteractor.updateProfileImages({background:t}).then(function(t){t.error?e.backgroundUploadError=e.$t("upload.error.base")+t.error:(e.$store.commit("addNewUsers",[t]),e.$store.commit("setCurrentUser",t),e.backgroundPreview=null),e.backgroundUploading=!1}))}}};var Jt=function(t){s(618)},Qt=Object(o.a)(Kt,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"profile-tab"},[s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.name_bio")))]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.name")))]),t._v(" "),s("EmojiInput",{attrs:{"enable-emoji-picker":"",suggest:t.emojiSuggestor},model:{value:t.newName,callback:function(e){t.newName=e},expression:"newName"}},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.newName,expression:"newName"}],attrs:{id:"username",classname:"name-changer"},domProps:{value:t.newName},on:{input:function(e){e.target.composing||(t.newName=e.target.value)}}})]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.bio")))]),t._v(" "),s("EmojiInput",{attrs:{"enable-emoji-picker":"",suggest:t.emojiUserSuggestor},model:{value:t.newBio,callback:function(e){t.newBio=e},expression:"newBio"}},[s("textarea",{directives:[{name:"model",rawName:"v-model",value:t.newBio,expression:"newBio"}],attrs:{classname:"bio"},domProps:{value:t.newBio},on:{input:function(e){e.target.composing||(t.newBio=e.target.value)}}})]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.newLocked,callback:function(e){t.newLocked=e},expression:"newLocked"}},[t._v("\n "+t._s(t.$t("settings.lock_account_description"))+"\n ")])],1),t._v(" "),s("div",[s("label",{attrs:{for:"default-vis"}},[t._v(t._s(t.$t("settings.default_vis")))]),t._v(" "),s("div",{staticClass:"visibility-tray",attrs:{id:"default-vis"}},[s("scope-selector",{attrs:{"show-all":!0,"user-default":t.newDefaultScope,"initial-scope":t.newDefaultScope,"on-scope-change":t.changeVis}})],1)]),t._v(" "),s("p",[s("Checkbox",{model:{value:t.newNoRichText,callback:function(e){t.newNoRichText=e},expression:"newNoRichText"}},[t._v("\n "+t._s(t.$t("settings.no_rich_text_description"))+"\n ")])],1),t._v(" "),s("p",[s("Checkbox",{model:{value:t.hideFollows,callback:function(e){t.hideFollows=e},expression:"hideFollows"}},[t._v("\n "+t._s(t.$t("settings.hide_follows_description"))+"\n ")])],1),t._v(" "),s("p",{staticClass:"setting-subitem"},[s("Checkbox",{attrs:{disabled:!t.hideFollows},model:{value:t.hideFollowsCount,callback:function(e){t.hideFollowsCount=e},expression:"hideFollowsCount"}},[t._v("\n "+t._s(t.$t("settings.hide_follows_count_description"))+"\n ")])],1),t._v(" "),s("p",[s("Checkbox",{model:{value:t.hideFollowers,callback:function(e){t.hideFollowers=e},expression:"hideFollowers"}},[t._v("\n "+t._s(t.$t("settings.hide_followers_description"))+"\n ")])],1),t._v(" "),s("p",{staticClass:"setting-subitem"},[s("Checkbox",{attrs:{disabled:!t.hideFollowers},model:{value:t.hideFollowersCount,callback:function(e){t.hideFollowersCount=e},expression:"hideFollowersCount"}},[t._v("\n "+t._s(t.$t("settings.hide_followers_count_description"))+"\n ")])],1),t._v(" "),s("p",[s("Checkbox",{model:{value:t.allowFollowingMove,callback:function(e){t.allowFollowingMove=e},expression:"allowFollowingMove"}},[t._v("\n "+t._s(t.$t("settings.allow_following_move"))+"\n ")])],1),t._v(" "),"admin"===t.role||"moderator"===t.role?s("p",[s("Checkbox",{model:{value:t.showRole,callback:function(e){t.showRole=e},expression:"showRole"}},["admin"===t.role?[t._v("\n "+t._s(t.$t("settings.show_admin_badge"))+"\n ")]:t._e(),t._v(" "),"moderator"===t.role?[t._v("\n "+t._s(t.$t("settings.show_moderator_badge"))+"\n ")]:t._e()],2)],1):t._e(),t._v(" "),s("p",[s("Checkbox",{model:{value:t.discoverable,callback:function(e){t.discoverable=e},expression:"discoverable"}},[t._v("\n "+t._s(t.$t("settings.discoverable"))+"\n ")])],1),t._v(" "),t.maxFields>0?s("div",[s("p",[t._v(t._s(t.$t("settings.profile_fields.label")))]),t._v(" "),t._l(t.newFields,function(e,a){return s("div",{key:a,staticClass:"profile-fields"},[s("EmojiInput",{attrs:{"enable-emoji-picker":"","hide-emoji-button":"",suggest:t.userSuggestor},model:{value:t.newFields[a].name,callback:function(e){t.$set(t.newFields[a],"name",e)},expression:"newFields[i].name"}},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.newFields[a].name,expression:"newFields[i].name"}],attrs:{placeholder:t.$t("settings.profile_fields.name")},domProps:{value:t.newFields[a].name},on:{input:function(e){e.target.composing||t.$set(t.newFields[a],"name",e.target.value)}}})]),t._v(" "),s("EmojiInput",{attrs:{"enable-emoji-picker":"","hide-emoji-button":"",suggest:t.userSuggestor},model:{value:t.newFields[a].value,callback:function(e){t.$set(t.newFields[a],"value",e)},expression:"newFields[i].value"}},[s("input",{directives:[{name:"model",rawName:"v-model",value:t.newFields[a].value,expression:"newFields[i].value"}],attrs:{placeholder:t.$t("settings.profile_fields.value")},domProps:{value:t.newFields[a].value},on:{input:function(e){e.target.composing||t.$set(t.newFields[a],"value",e.target.value)}}})]),t._v(" "),s("div",{staticClass:"icon-container"},[s("i",{directives:[{name:"show",rawName:"v-show",value:t.newFields.length>1,expression:"newFields.length > 1"}],staticClass:"icon-cancel",on:{click:function(e){return t.deleteField(a)}}})])],1)}),t._v(" "),t.newFields.length0?s("li",[s("div",[t._v("\n "+t._s(t.$t("settings.post_status_content_type"))+"\n "),s("label",{staticClass:"select",attrs:{for:"postContentType"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.postContentType,expression:"postContentType"}],attrs:{id:"postContentType"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.postContentType=e.target.multiple?s:s[0]}}},t._l(t.postFormats,function(e){return s("option",{key:e,domProps:{value:e}},[t._v("\n "+t._s(t.$t('post_status.content_type["'+e+'"]'))+"\n "+t._s(t.postContentTypeDefaultValue===e?t.$t("settings.instance_default_simple"):"")+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})])])]):t._e(),t._v(" "),s("li",[s("Checkbox",{model:{value:t.minimalScopesMode,callback:function(e){t.minimalScopesMode=e},expression:"minimalScopesMode"}},[t._v("\n "+t._s(t.$t("settings.minimal_scopes_mode"))+" "+t._s(t.$t("settings.instance_default",{value:t.minimalScopesModeLocalizedValue}))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.autohideFloatingPostButton,callback:function(e){t.autohideFloatingPostButton=e},expression:"autohideFloatingPostButton"}},[t._v("\n "+t._s(t.$t("settings.autohide_floating_post_button"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.padEmoji,callback:function(e){t.padEmoji=e},expression:"padEmoji"}},[t._v("\n "+t._s(t.$t("settings.pad_emoji"))+"\n ")])],1)])]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.attachments")))]),t._v(" "),s("ul",{staticClass:"setting-list"},[s("li",[s("Checkbox",{model:{value:t.hideAttachments,callback:function(e){t.hideAttachments=e},expression:"hideAttachments"}},[t._v("\n "+t._s(t.$t("settings.hide_attachments_in_tl"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.hideAttachmentsInConv,callback:function(e){t.hideAttachmentsInConv=e},expression:"hideAttachmentsInConv"}},[t._v("\n "+t._s(t.$t("settings.hide_attachments_in_convo"))+"\n ")])],1),t._v(" "),s("li",[s("label",{attrs:{for:"maxThumbnails"}},[t._v("\n "+t._s(t.$t("settings.max_thumbnails"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model.number",value:t.maxThumbnails,expression:"maxThumbnails",modifiers:{number:!0}}],staticClass:"number-input",attrs:{id:"maxThumbnails",type:"number",min:"0",step:"1"},domProps:{value:t.maxThumbnails},on:{input:function(e){e.target.composing||(t.maxThumbnails=t._n(e.target.value))},blur:function(e){return t.$forceUpdate()}}})]),t._v(" "),s("li",[s("Checkbox",{model:{value:t.hideNsfw,callback:function(e){t.hideNsfw=e},expression:"hideNsfw"}},[t._v("\n "+t._s(t.$t("settings.nsfw_clickthrough"))+"\n ")])],1),t._v(" "),s("ul",{staticClass:"setting-list suboptions"},[s("li",[s("Checkbox",{attrs:{disabled:!t.hideNsfw},model:{value:t.preloadImage,callback:function(e){t.preloadImage=e},expression:"preloadImage"}},[t._v("\n "+t._s(t.$t("settings.preload_images"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{attrs:{disabled:!t.hideNsfw},model:{value:t.useOneClickNsfw,callback:function(e){t.useOneClickNsfw=e},expression:"useOneClickNsfw"}},[t._v("\n "+t._s(t.$t("settings.use_one_click_nsfw"))+"\n ")])],1)]),t._v(" "),s("li",[s("Checkbox",{model:{value:t.stopGifs,callback:function(e){t.stopGifs=e},expression:"stopGifs"}},[t._v("\n "+t._s(t.$t("settings.stop_gifs"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.loopVideo,callback:function(e){t.loopVideo=e},expression:"loopVideo"}},[t._v("\n "+t._s(t.$t("settings.loop_video"))+"\n ")]),t._v(" "),s("ul",{staticClass:"setting-list suboptions",class:[{disabled:!t.streaming}]},[s("li",[s("Checkbox",{attrs:{disabled:!t.loopVideo||!t.loopSilentAvailable},model:{value:t.loopVideoSilentOnly,callback:function(e){t.loopVideoSilentOnly=e},expression:"loopVideoSilentOnly"}},[t._v("\n "+t._s(t.$t("settings.loop_video_silent_only"))+"\n ")]),t._v(" "),t.loopSilentAvailable?t._e():s("div",{staticClass:"unavailable"},[s("i",{staticClass:"icon-globe"}),t._v("! "+t._s(t.$t("settings.limited_availability"))+"\n ")])],1)])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.playVideosInModal,callback:function(e){t.playVideosInModal=e},expression:"playVideosInModal"}},[t._v("\n "+t._s(t.$t("settings.play_videos_in_modal"))+"\n ")])],1),t._v(" "),s("li",[s("Checkbox",{model:{value:t.useContainFit,callback:function(e){t.useContainFit=e},expression:"useContainFit"}},[t._v("\n "+t._s(t.$t("settings.use_contain_fit"))+"\n ")])],1)])]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.notifications")))]),t._v(" "),s("ul",{staticClass:"setting-list"},[s("li",[s("Checkbox",{model:{value:t.webPushNotifications,callback:function(e){t.webPushNotifications=e},expression:"webPushNotifications"}},[t._v("\n "+t._s(t.$t("settings.enable_web_push_notifications"))+"\n ")])],1)])]),t._v(" "),s("div",{staticClass:"setting-item"},[s("h2",[t._v(t._s(t.$t("settings.fun")))]),t._v(" "),s("ul",{staticClass:"setting-list"},[s("li",[s("Checkbox",{model:{value:t.greentext,callback:function(e){t.greentext=e},expression:"greentext"}},[t._v("\n "+t._s(t.$t("settings.greentext"))+" "+t._s(t.$t("settings.instance_default",{value:t.greentextLocalizedValue}))+"\n ")])],1)])])])},[],!1,null,null,null).exports,ne={data:function(){var t=this.$store.state.instance;return{backendVersion:t.backendVersion,frontendVersion:t.frontendVersion}},computed:{frontendVersionLink:function(){return"https://git.pleroma.social/pleroma/pleroma-fe/commit/"+this.frontendVersion},backendVersionLink:function(){return"https://git.pleroma.social/pleroma/pleroma/commit/"+(t=this.backendVersion,(e=t.match(/-g(\w+)/i))?e[1]:"");var t,e}}},oe=Object(o.a)(ne,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{attrs:{label:t.$t("settings.version.title")}},[s("div",{staticClass:"setting-item"},[s("ul",{staticClass:"setting-list"},[s("li",[s("p",[t._v(t._s(t.$t("settings.version.backend_version")))]),t._v(" "),s("ul",{staticClass:"option-list"},[s("li",[s("a",{attrs:{href:t.backendVersionLink,target:"_blank"}},[t._v(t._s(t.backendVersion))])])])]),t._v(" "),s("li",[s("p",[t._v(t._s(t.$t("settings.version.frontend_version")))]),t._v(" "),s("ul",{staticClass:"option-list"},[s("li",[s("a",{attrs:{href:t.frontendVersionLink,target:"_blank"}},[t._v(t._s(t.frontendVersion))])])])])])])])},[],!1,null,null,null).exports,ie=s(9),re=s(32),le=s(29),ce=s(39),ue={components:{Checkbox:d.a},props:{name:{required:!0,type:String},label:{required:!0,type:String},value:{required:!1,type:String,default:void 0},fallback:{required:!1,type:String,default:void 0},disabled:{required:!1,type:Boolean,default:!1},showOptionalTickbox:{required:!1,type:Boolean,default:!0}},computed:{present:function(){return void 0!==this.value},validColor:function(){return Object(ie.f)(this.value||this.fallback)},transparentColor:function(){return"transparent"===this.value},computedColor:function(){return this.value&&this.value.startsWith("--")}}};var de=function(t){s(626),s(628)},pe=Object(o.a)(ue,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"color-input style-control",class:{disabled:!t.present||t.disabled}},[s("label",{staticClass:"label",attrs:{for:t.name}},[t._v("\n "+t._s(t.label)+"\n ")]),t._v(" "),void 0!==t.fallback&&t.showOptionalTickbox?s("Checkbox",{staticClass:"opt",attrs:{checked:t.present,disabled:t.disabled},on:{change:function(e){return t.$emit("input",void 0===t.value?t.fallback:void 0)}}}):t._e(),t._v(" "),s("div",{staticClass:"input color-input-field"},[s("input",{staticClass:"textColor unstyled",attrs:{id:t.name+"-t",type:"text",disabled:!t.present||t.disabled},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}}),t._v(" "),t.validColor?s("input",{staticClass:"nativeColor unstyled",attrs:{id:t.name,type:"color",disabled:!t.present||t.disabled},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}}):t._e(),t._v(" "),t.transparentColor?s("div",{staticClass:"transparentIndicator"}):t._e(),t._v(" "),t.computedColor?s("div",{staticClass:"computedIndicator",style:{backgroundColor:t.fallback}}):t._e()])],1)},[],!1,de,null,null).exports,me=Object(o.a)({props:["name","value","fallback","disabled","label","max","min","step","hardMin","hardMax"],computed:{present:function(){return void 0!==this.value}}},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"range-control style-control",class:{disabled:!t.present||t.disabled}},[s("label",{staticClass:"label",attrs:{for:t.name}},[t._v("\n "+t._s(t.label)+"\n ")]),t._v(" "),void 0!==t.fallback?s("input",{staticClass:"opt",attrs:{id:t.name+"-o",type:"checkbox"},domProps:{checked:t.present},on:{input:function(e){return t.$emit("input",t.present?void 0:t.fallback)}}}):t._e(),t._v(" "),void 0!==t.fallback?s("label",{staticClass:"opt-l",attrs:{for:t.name+"-o"}}):t._e(),t._v(" "),s("input",{staticClass:"input-number",attrs:{id:t.name,type:"range",disabled:!t.present||t.disabled,max:t.max||t.hardMax||100,min:t.min||t.hardMin||0,step:t.step||1},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}}),t._v(" "),s("input",{staticClass:"input-number",attrs:{id:t.name,type:"number",disabled:!t.present||t.disabled,max:t.hardMax,min:t.hardMin,step:t.step||1},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}})])},[],!1,null,null,null).exports,ve={components:{Checkbox:d.a},props:["name","value","fallback","disabled"],computed:{present:function(){return void 0!==this.value}}},he=Object(o.a)(ve,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"opacity-control style-control",class:{disabled:!t.present||t.disabled}},[s("label",{staticClass:"label",attrs:{for:t.name}},[t._v("\n "+t._s(t.$t("settings.style.common.opacity"))+"\n ")]),t._v(" "),void 0!==t.fallback?s("Checkbox",{staticClass:"opt",attrs:{checked:t.present,disabled:t.disabled},on:{change:function(e){return t.$emit("input",t.present?void 0:t.fallback)}}}):t._e(),t._v(" "),s("input",{staticClass:"input-number",attrs:{id:t.name,type:"number",disabled:!t.present||t.disabled,max:"1",min:"0",step:".05"},domProps:{value:t.value||t.fallback},on:{input:function(e){return t.$emit("input",e.target.value)}}})],1)},[],!1,null,null,null).exports;function be(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}var fe=function(){return function(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:{})},ge={props:["value","fallback","ready"],data:function(){return{selectedId:0,cValue:(this.value||this.fallback||[]).map(fe)}},components:{ColorInput:pe,OpacityInput:he},methods:{add:function(){this.cValue.push(fe(this.selected)),this.selectedId=this.cValue.length-1},del:function(){this.cValue.splice(this.selectedId,1),this.selectedId=0===this.cValue.length?void 0:Math.max(this.selectedId-1,0)},moveUp:function(){var t=this.cValue.splice(this.selectedId,1)[0];this.cValue.splice(this.selectedId-1,0,t),this.selectedId-=1},moveDn:function(){var t=this.cValue.splice(this.selectedId,1)[0];this.cValue.splice(this.selectedId+1,0,t),this.selectedId+=1}},beforeUpdate:function(){this.cValue=this.value||this.fallback},computed:{anyShadows:function(){return this.cValue.length>0},anyShadowsFallback:function(){return this.fallback.length>0},selected:function(){return this.ready&&this.anyShadows?this.cValue[this.selectedId]:fe({})},currentFallback:function(){return this.ready&&this.anyShadowsFallback?this.fallback[this.selectedId]:fe({})},moveUpValid:function(){return this.ready&&this.selectedId>0},moveDnValid:function(){return this.ready&&this.selectedId-1:t.selected.inset},on:{change:function(e){var s=t.selected.inset,a=e.target,n=!!a.checked;if(Array.isArray(s)){var o=t._i(s,null);a.checked?o<0&&t.$set(t.selected,"inset",s.concat([null])):o>-1&&t.$set(t.selected,"inset",s.slice(0,o).concat(s.slice(o+1)))}else t.$set(t.selected,"inset",n)}}}),t._v(" "),s("label",{staticClass:"checkbox-label",attrs:{for:"inset"}})]),t._v(" "),s("div",{staticClass:"blur-control style-control",attrs:{disabled:!t.present}},[s("label",{staticClass:"label",attrs:{for:"spread"}},[t._v("\n "+t._s(t.$t("settings.style.shadows.blur"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.blur,expression:"selected.blur"}],staticClass:"input-range",attrs:{id:"blur",disabled:!t.present,name:"blur",type:"range",max:"20",min:"0"},domProps:{value:t.selected.blur},on:{__r:function(e){return t.$set(t.selected,"blur",e.target.value)}}}),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.blur,expression:"selected.blur"}],staticClass:"input-number",attrs:{disabled:!t.present,type:"number",min:"0"},domProps:{value:t.selected.blur},on:{input:function(e){e.target.composing||t.$set(t.selected,"blur",e.target.value)}}})]),t._v(" "),s("div",{staticClass:"spread-control style-control",attrs:{disabled:!t.present}},[s("label",{staticClass:"label",attrs:{for:"spread"}},[t._v("\n "+t._s(t.$t("settings.style.shadows.spread"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.spread,expression:"selected.spread"}],staticClass:"input-range",attrs:{id:"spread",disabled:!t.present,name:"spread",type:"range",max:"20",min:"-20"},domProps:{value:t.selected.spread},on:{__r:function(e){return t.$set(t.selected,"spread",e.target.value)}}}),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.selected.spread,expression:"selected.spread"}],staticClass:"input-number",attrs:{disabled:!t.present,type:"number"},domProps:{value:t.selected.spread},on:{input:function(e){e.target.composing||t.$set(t.selected,"spread",e.target.value)}}})]),t._v(" "),s("ColorInput",{attrs:{disabled:!t.present,label:t.$t("settings.style.common.color"),fallback:t.currentFallback.color,"show-optional-tickbox":!1,name:"shadow"},model:{value:t.selected.color,callback:function(e){t.$set(t.selected,"color",e)},expression:"selected.color"}}),t._v(" "),s("OpacityInput",{attrs:{disabled:!t.present},model:{value:t.selected.alpha,callback:function(e){t.$set(t.selected,"alpha",e)},expression:"selected.alpha"}}),t._v(" "),s("i18n",{attrs:{path:"settings.style.shadows.hintV3",tag:"p"}},[s("code",[t._v("--variable,mod")])])],1)])},[],!1,_e,null,null).exports,Ce={props:["name","label","value","fallback","options","no-inherit"],data:function(){return{lValue:this.value,availableOptions:[this.noInherit?"":"inherit","custom"].concat(z()(this.options||[]),["serif","monospace","sans-serif"]).filter(function(t){return t})}},beforeUpdate:function(){this.lValue=this.value},computed:{present:function(){return void 0!==this.lValue},dValue:function(){return this.lValue||this.fallback||{}},family:{get:function(){return this.dValue.family},set:function(t){Object(q.set)(this.lValue,"family",t),this.$emit("input",this.lValue)}},isCustom:function(){return"custom"===this.preset},preset:{get:function(){return"serif"===this.family||"sans-serif"===this.family||"monospace"===this.family||"inherit"===this.family?this.family:"custom"},set:function(t){this.family="custom"===t?"":t}}}};var xe=function(t){s(632)},ke=Object(o.a)(Ce,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"font-control style-control",class:{custom:t.isCustom}},[s("label",{staticClass:"label",attrs:{for:"custom"===t.preset?t.name:t.name+"-font-switcher"}},[t._v("\n "+t._s(t.label)+"\n ")]),t._v(" "),void 0!==t.fallback?s("input",{staticClass:"opt exlcude-disabled",attrs:{id:t.name+"-o",type:"checkbox"},domProps:{checked:t.present},on:{input:function(e){return t.$emit("input",void 0===t.value?t.fallback:void 0)}}}):t._e(),t._v(" "),void 0!==t.fallback?s("label",{staticClass:"opt-l",attrs:{for:t.name+"-o"}}):t._e(),t._v(" "),s("label",{staticClass:"select",attrs:{for:t.name+"-font-switcher",disabled:!t.present}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.preset,expression:"preset"}],staticClass:"font-switcher",attrs:{id:t.name+"-font-switcher",disabled:!t.present},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.preset=e.target.multiple?s:s[0]}}},t._l(t.availableOptions,function(e){return s("option",{key:e,domProps:{value:e}},[t._v("\n "+t._s("custom"===e?t.$t("settings.style.fonts.custom"):e)+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})]),t._v(" "),t.isCustom?s("input",{directives:[{name:"model",rawName:"v-model",value:t.family,expression:"family"}],staticClass:"custom-font",attrs:{id:t.name,type:"text"},domProps:{value:t.family},on:{input:function(e){e.target.composing||(t.family=e.target.value)}}}):t._e()])},[],!1,xe,null,null).exports,ye={props:{large:{required:!1,type:Boolean,default:!1},contrast:{required:!1,type:Object,default:function(){return{}}}},computed:{hint:function(){var t=this.contrast.aaa?"aaa":this.contrast.aa?"aa":"bad",e=this.$t("settings.style.common.contrast.level.".concat(t)),s=this.$t("settings.style.common.contrast.context.text"),a=this.contrast.text;return this.$t("settings.style.common.contrast.hint",{level:e,context:s,ratio:a})},hint_18pt:function(){var t=this.contrast.laaa?"aaa":this.contrast.laa?"aa":"bad",e=this.$t("settings.style.common.contrast.level.".concat(t)),s=this.$t("settings.style.common.contrast.context.18pt"),a=this.contrast.text;return this.$t("settings.style.common.contrast.hint",{level:e,context:s,ratio:a})}}};var $e=function(t){s(634)},Le=Object(o.a)(ye,function(){var t=this,e=t.$createElement,s=t._self._c||e;return t.contrast?s("span",{staticClass:"contrast-ratio"},[s("span",{staticClass:"rating",attrs:{title:t.hint}},[t.contrast.aaa?s("span",[s("i",{staticClass:"icon-thumbs-up-alt"})]):t._e(),t._v(" "),!t.contrast.aaa&&t.contrast.aa?s("span",[s("i",{staticClass:"icon-adjust"})]):t._e(),t._v(" "),t.contrast.aaa||t.contrast.aa?t._e():s("span",[s("i",{staticClass:"icon-attention"})])]),t._v(" "),t.contrast&&t.large?s("span",{staticClass:"rating",attrs:{title:t.hint_18pt}},[t.contrast.laaa?s("span",[s("i",{staticClass:"icon-thumbs-up-alt"})]):t._e(),t._v(" "),!t.contrast.laaa&&t.contrast.laa?s("span",[s("i",{staticClass:"icon-adjust"})]):t._e(),t._v(" "),t.contrast.laaa||t.contrast.laa?t._e():s("span",[s("i",{staticClass:"icon-attention"})])]):t._e()]):t._e()},[],!1,$e,null,null).exports,Te={props:["exportObject","importLabel","exportLabel","importFailedText","validator","onImport","onImportFailure"],data:function(){return{importFailed:!1}},methods:{exportData:function(){var t=JSON.stringify(this.exportObject,null,2),e=document.createElement("a");e.setAttribute("download","pleroma_theme.json"),e.setAttribute("href","data:application/json;base64,"+window.btoa(t)),e.style.display="none",document.body.appendChild(e),e.click(),document.body.removeChild(e)},importData:function(){var t=this;this.importFailed=!1;var e=document.createElement("input");e.setAttribute("type","file"),e.setAttribute("accept",".json"),e.addEventListener("change",function(e){if(e.target.files[0]){var s=new FileReader;s.onload=function(e){var s=e.target;try{var a=JSON.parse(s.result);t.validator(a)?t.onImport(a):t.importFailed=!0}catch(e){t.importFailed=!0}},s.readAsText(e.target.files[0])}}),document.body.appendChild(e),e.click(),document.body.removeChild(e)}}};var Oe=function(t){s(636)},Pe=Object(o.a)(Te,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"import-export-container"},[t._t("before"),t._v(" "),s("button",{staticClass:"btn",on:{click:t.exportData}},[t._v("\n "+t._s(t.exportLabel)+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.importData}},[t._v("\n "+t._s(t.importLabel)+"\n ")]),t._v(" "),t._t("afterButtons"),t._v(" "),t.importFailed?s("p",{staticClass:"alert error"},[t._v("\n "+t._s(t.importFailedText)+"\n ")]):t._e(),t._v(" "),t._t("afterError")],2)},[],!1,Oe,null,null).exports;var Se=function(t){s(638)},Ie=Object(o.a)(null,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"preview-container"},[s("div",{staticClass:"underlay underlay-preview"}),t._v(" "),s("div",{staticClass:"panel dummy"},[s("div",{staticClass:"panel-heading"},[s("div",{staticClass:"title"},[t._v("\n "+t._s(t.$t("settings.style.preview.header"))+"\n "),s("span",{staticClass:"badge badge-notification"},[t._v("\n 99\n ")])]),t._v(" "),s("span",{staticClass:"faint"},[t._v("\n "+t._s(t.$t("settings.style.preview.header_faint"))+"\n ")]),t._v(" "),s("span",{staticClass:"alert error"},[t._v("\n "+t._s(t.$t("settings.style.preview.error"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn"},[t._v("\n "+t._s(t.$t("settings.style.preview.button"))+"\n ")])]),t._v(" "),s("div",{staticClass:"panel-body theme-preview-content"},[s("div",{staticClass:"post"},[s("div",{staticClass:"avatar still-image"},[t._v("\n ( ͡° ͜ʖ ͡°)\n ")]),t._v(" "),s("div",{staticClass:"content"},[s("h4",[t._v("\n "+t._s(t.$t("settings.style.preview.content"))+"\n ")]),t._v(" "),s("i18n",{attrs:{path:"settings.style.preview.text"}},[s("code",{staticStyle:{"font-family":"var(--postCodeFont)"}},[t._v("\n "+t._s(t.$t("settings.style.preview.mono"))+"\n ")]),t._v(" "),s("a",{staticStyle:{color:"var(--link)"}},[t._v("\n "+t._s(t.$t("settings.style.preview.link"))+"\n ")])]),t._v(" "),t._m(0)],1)]),t._v(" "),s("div",{staticClass:"after-post"},[s("div",{staticClass:"avatar-alt"},[t._v("\n :^)\n ")]),t._v(" "),s("div",{staticClass:"content"},[s("i18n",{staticClass:"faint",attrs:{path:"settings.style.preview.fine_print",tag:"span"}},[s("a",{staticStyle:{color:"var(--faintLink)"}},[t._v("\n "+t._s(t.$t("settings.style.preview.faint_link"))+"\n ")])])],1)]),t._v(" "),s("div",{staticClass:"separator"}),t._v(" "),s("span",{staticClass:"alert error"},[t._v("\n "+t._s(t.$t("settings.style.preview.error"))+"\n ")]),t._v(" "),s("input",{attrs:{type:"text"},domProps:{value:t.$t("settings.style.preview.input")}}),t._v(" "),s("div",{staticClass:"actions"},[s("span",{staticClass:"checkbox"},[s("input",{attrs:{id:"preview_checkbox",checked:"very yes",type:"checkbox"}}),t._v(" "),s("label",{attrs:{for:"preview_checkbox"}},[t._v(t._s(t.$t("settings.style.preview.checkbox")))])]),t._v(" "),s("button",{staticClass:"btn"},[t._v("\n "+t._s(t.$t("settings.style.preview.button"))+"\n ")])])])])])},[function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"icons"},[e("i",{staticClass:"button-icon icon-reply",staticStyle:{color:"var(--cBlue)"}}),this._v(" "),e("i",{staticClass:"button-icon icon-retweet",staticStyle:{color:"var(--cGreen)"}}),this._v(" "),e("i",{staticClass:"button-icon icon-star",staticStyle:{color:"var(--cOrange)"}}),this._v(" "),e("i",{staticClass:"button-icon icon-cancel",staticStyle:{color:"var(--cRed)"}})])}],!1,Se,null,null).exports;function je(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);e&&(a=a.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),s.push.apply(s,a)}return s}function Ee(t){for(var e=1;ece.a)return t(e+"future_version_imported")+" "+t(i?e+"snapshot_missing":e+"snapshot_present");if(nce.a)return t(e+"fe_downgraded")+" "+t(i?e+"migration_snapshot_ok":e+"migration_snapshot_gone");if(n=4.5,aaa:s>=7,laa:s>=3,laaa:s>=4.5},t},{})}catch(t){console.warn("Failure computing contrasts",t)}},previewRules:function(){return this.preview.rules?[].concat(z()(Object.values(this.preview.rules)),["color: var(--text)","font-family: var(--interfaceFont, sans-serif)"]).join(";"):""},shadowsAvailable:function(){return Object.keys(re.a).sort()},currentShadowOverriden:{get:function(){return!!this.currentShadow},set:function(t){t?Object(q.set)(this.shadowsLocal,this.shadowSelected,this.currentShadowFallback.map(function(t){return Object.assign({},t)})):Object(q.delete)(this.shadowsLocal,this.shadowSelected)}},currentShadowFallback:function(){return(this.previewTheme.shadows||{})[this.shadowSelected]},currentShadow:{get:function(){return this.shadowsLocal[this.shadowSelected]},set:function(t){Object(q.set)(this.shadowsLocal,this.shadowSelected,t)}},themeValid:function(){return!this.shadowsInvalid&&!this.colorsInvalid&&!this.radiiInvalid},exportedTheme:function(){var t=!(this.keepFonts||this.keepShadows||this.keepOpacity||this.keepRoundness||this.keepColor),e={themeEngineVersion:ce.a};return(this.keepFonts||t)&&(e.fonts=this.fontsLocal),(this.keepShadows||t)&&(e.shadows=this.shadowsLocal),(this.keepOpacity||t)&&(e.opacity=this.currentOpacity),(this.keepColor||t)&&(e.colors=this.currentColors),(this.keepRoundness||t)&&(e.radii=this.currentRadii),{_pleroma_theme_version:2,theme:Ee({themeEngineVersion:ce.a},this.previewTheme),source:e}}},components:{ColorInput:pe,OpacityInput:he,RangeInput:me,ContrastRatio:Le,ShadowControl:we,FontControl:ke,TabSwitcher:a.a,Preview:Ie,ExportImport:Pe,Checkbox:d.a},methods:{loadTheme:function(t,e){var s=t.theme,a=t.source,n=t._pleroma_theme_version,o=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(this.dismissWarning(),!a&&!s)throw new Error("Can't load theme: empty");var i="localStorage"!==e||s.colors?n:"l1",r=(s||{}).themeEngineVersion,l=(a||{}).themeEngineVersion||2,c=l===ce.a,u=void 0!==s&&void 0!==a&&l!==r,d=a&&o||!s;c&&!u||d||"l1"===i||"defaults"===e||(u&&"localStorage"===e?this.themeWarning={origin:e,themeEngineVersion:l,type:"snapshot_source_mismatch"}:s?c||(this.themeWarning={origin:e,noActionsPossible:!a,themeEngineVersion:l,type:"wrong_version"}):this.themeWarning={origin:e,noActionsPossible:!0,themeEngineVersion:l,type:"no_snapshot_old_version"}),this.normalizeLocalState(s,i,a,d)},forceLoadLocalStorage:function(){this.loadThemeFromLocalStorage(!0)},dismissWarning:function(){this.themeWarning=void 0,this.tempImportFile=void 0},forceLoad:function(){switch(this.themeWarning.origin){case"localStorage":this.loadThemeFromLocalStorage(!0);break;case"file":this.onImport(this.tempImportFile,!0)}this.dismissWarning()},forceSnapshot:function(){switch(this.themeWarning.origin){case"localStorage":this.loadThemeFromLocalStorage(!1,!0);break;case"file":console.err("Forcing snapshout from file is not supported yet")}this.dismissWarning()},loadThemeFromLocalStorage:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],s=this.$store.getters.mergedConfig,a=s.customTheme,n=s.customThemeSource;a||n?this.loadTheme({theme:a,source:e?a:n},"localStorage",t):this.loadTheme(this.$store.state.instance.themeData,"defaults",t)},setCustomTheme:function(){this.$store.dispatch("setOption",{name:"customTheme",value:Ee({themeEngineVersion:ce.a},this.previewTheme)}),this.$store.dispatch("setOption",{name:"customThemeSource",value:{themeEngineVersion:ce.a,shadows:this.shadowsLocal,fonts:this.fontsLocal,opacity:this.currentOpacity,colors:this.currentColors,radii:this.currentRadii}})},updatePreviewColorsAndShadows:function(){this.previewColors=Object(re.e)({opacity:this.currentOpacity,colors:this.currentColors}),this.previewShadows=Object(re.h)({shadows:this.shadowsLocal,opacity:this.previewTheme.opacity,themeEngineVersion:this.engineVersion},this.previewColors.theme.colors,this.previewColors.mod)},onImport:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.tempImportFile=t,this.loadTheme(t,"file",e)},importValidator:function(t){var e=t._pleroma_theme_version;return e>=1||e<=2},clearAll:function(){this.loadThemeFromLocalStorage()},clearV1:function(){var t=this;Object.keys(this.$data).filter(function(t){return t.endsWith("ColorLocal")||t.endsWith("OpacityLocal")}).filter(function(t){return!Re.includes(t)}).forEach(function(e){Object(q.set)(t.$data,e,void 0)})},clearRoundness:function(){var t=this;Object.keys(this.$data).filter(function(t){return t.endsWith("RadiusLocal")}).forEach(function(e){Object(q.set)(t.$data,e,void 0)})},clearOpacity:function(){var t=this;Object.keys(this.$data).filter(function(t){return t.endsWith("OpacityLocal")}).forEach(function(e){Object(q.set)(t.$data,e,void 0)})},clearShadows:function(){this.shadowsLocal={}},clearFonts:function(){this.fontsLocal={}},normalizeLocalState:function(t){var e,s=this,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2?arguments[2]:void 0,o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];void 0!==n&&(o||n.themeEngineVersion===ce.a)?(e=n,a=n.themeEngineVersion):e=t;var i=e.radii||e,r=e.opacity,l=e.shadows||{},c=e.fonts||{},u=e.themeEngineVersion?e.colors||e:Object(re.c)(e.colors||e);if(0===a&&(e.version&&(a=e.version),void 0===u.text&&void 0!==u.fg&&(a=1),void 0!==u.text&&void 0!==u.fg&&(a=2)),this.engineVersion=a,1===a&&(this.fgColorLocal=Object(ie.i)(u.btn),this.textColorLocal=Object(ie.i)(u.fg)),!this.keepColor){this.clearV1();var d=new Set(1!==a?Object.keys(le.c):[]);1!==a&&"l1"!==a||d.add("bg").add("link").add("cRed").add("cBlue").add("cGreen").add("cOrange"),d.forEach(function(t){var e=u[t],a=Object(ie.i)(u[t]);s[t+"ColorLocal"]="#aN"===a?e:a})}r&&!this.keepOpacity&&(this.clearOpacity(),Object.entries(r).forEach(function(t){var e=A()(t,2),a=e[0],n=e[1];null==n||Number.isNaN(n)||(s[a+"OpacityLocal"]=n)})),this.keepRoundness||(this.clearRoundness(),Object.entries(i).forEach(function(t){var e=A()(t,2),a=e[0],n=e[1],o=a.endsWith("Radius")?a.split("Radius")[0]:a;s[o+"RadiusLocal"]=n})),this.keepShadows||(this.clearShadows(),this.shadowsLocal=2===a?Object(re.m)(l,this.previewTheme.opacity):l,this.shadowSelected=this.shadowsAvailable[0]),this.keepFonts||(this.clearFonts(),this.fontsLocal=c)}},watch:{currentRadii:function(){try{this.previewRadii=Object(re.g)({radii:this.currentRadii}),this.radiiInvalid=!1}catch(t){this.radiiInvalid=!0,console.warn(t)}},shadowsLocal:{handler:function(){if(1!==Object.getOwnPropertyNames(this.previewColors).length)try{this.updatePreviewColorsAndShadows(),this.shadowsInvalid=!1}catch(t){this.shadowsInvalid=!0,console.warn(t)}},deep:!0},fontsLocal:{handler:function(){try{this.previewFonts=Object(re.f)({fonts:this.fontsLocal}),this.fontsInvalid=!1}catch(t){this.fontsInvalid=!0,console.warn(t)}},deep:!0},currentColors:function(){try{this.updatePreviewColorsAndShadows(),this.colorsInvalid=!1,this.shadowsInvalid=!1}catch(t){this.colorsInvalid=!0,this.shadowsInvalid=!0,console.warn(t)}},currentOpacity:function(){try{this.updatePreviewColorsAndShadows()}catch(t){console.warn(t)}},selected:function(){this.dismissWarning(),1===this.selectedVersion?(this.keepRoundness||this.clearRoundness(),this.keepShadows||this.clearShadows(),this.keepOpacity||this.clearOpacity(),this.keepColor||(this.clearV1(),this.bgColorLocal=this.selected[1],this.fgColorLocal=this.selected[2],this.textColorLocal=this.selected[3],this.linkColorLocal=this.selected[4],this.cRedColorLocal=this.selected[5],this.cGreenColorLocal=this.selected[6],this.cBlueColorLocal=this.selected[7],this.cOrangeColorLocal=this.selected[8])):this.selectedVersion>=2&&this.normalizeLocalState(this.selected.theme,2,this.selected.source)}}};var Fe=function(t){s(624)},Me=Object(o.a)(Be,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"theme-tab"},[s("div",{staticClass:"presets-container"},[s("div",{staticClass:"save-load"},[t.themeWarning?s("div",{staticClass:"theme-warning"},[s("div",{staticClass:"alert warning"},[t._v("\n "+t._s(t.themeWarningHelp)+"\n ")]),t._v(" "),s("div",{staticClass:"buttons"},["snapshot_source_mismatch"===t.themeWarning.type?[s("button",{staticClass:"btn",on:{click:t.forceLoad}},[t._v("\n "+t._s(t.$t("settings.style.switcher.use_source"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.forceSnapshot}},[t._v("\n "+t._s(t.$t("settings.style.switcher.use_snapshot"))+"\n ")])]:t.themeWarning.noActionsPossible?[s("button",{staticClass:"btn",on:{click:t.dismissWarning}},[t._v("\n "+t._s(t.$t("general.dismiss"))+"\n ")])]:[s("button",{staticClass:"btn",on:{click:t.forceLoad}},[t._v("\n "+t._s(t.$t("settings.style.switcher.load_theme"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.dismissWarning}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_as_is"))+"\n ")])]],2)]):t._e(),t._v(" "),s("ExportImport",{attrs:{"export-object":t.exportedTheme,"export-label":t.$t("settings.export_theme"),"import-label":t.$t("settings.import_theme"),"import-failed-text":t.$t("settings.invalid_theme_imported"),"on-import":t.onImport,validator:t.importValidator}},[s("template",{slot:"before"},[s("div",{staticClass:"presets"},[t._v("\n "+t._s(t.$t("settings.presets"))+"\n "),s("label",{staticClass:"select",attrs:{for:"preset-switcher"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.selected,expression:"selected"}],staticClass:"preset-switcher",attrs:{id:"preset-switcher"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.selected=e.target.multiple?s:s[0]}}},t._l(t.availableStyles,function(e){return s("option",{key:e.name,style:{backgroundColor:e[1]||(e.theme||e.source).colors.bg,color:e[3]||(e.theme||e.source).colors.text},domProps:{value:e}},[t._v("\n "+t._s(e[0]||e.name)+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})])])])],2)],1),t._v(" "),s("div",{staticClass:"save-load-options"},[s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepColor,callback:function(e){t.keepColor=e},expression:"keepColor"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_color"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepShadows,callback:function(e){t.keepShadows=e},expression:"keepShadows"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_shadows"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepOpacity,callback:function(e){t.keepOpacity=e},expression:"keepOpacity"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_opacity"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepRoundness,callback:function(e){t.keepRoundness=e},expression:"keepRoundness"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_roundness"))+"\n ")])],1),t._v(" "),s("span",{staticClass:"keep-option"},[s("Checkbox",{model:{value:t.keepFonts,callback:function(e){t.keepFonts=e},expression:"keepFonts"}},[t._v("\n "+t._s(t.$t("settings.style.switcher.keep_fonts"))+"\n ")])],1),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.switcher.save_load_hint")))])])]),t._v(" "),s("preview",{style:t.previewRules}),t._v(" "),s("keep-alive",[s("tab-switcher",{key:"style-tweak"},[s("div",{staticClass:"color-container",attrs:{label:t.$t("settings.style.common_colors._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.theme_help")))]),t._v(" "),s("div",{staticClass:"tab-header-buttons"},[s("button",{staticClass:"btn",on:{click:t.clearOpacity}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_opacity"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearV1}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])])]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.theme_help_v2_1")))]),t._v(" "),s("h4",[t._v(t._s(t.$t("settings.style.common_colors.main")))]),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"bgColor",label:t.$t("settings.background")},model:{value:t.bgColorLocal,callback:function(e){t.bgColorLocal=e},expression:"bgColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"bgOpacity",fallback:t.previewTheme.opacity.bg},model:{value:t.bgOpacityLocal,callback:function(e){t.bgOpacityLocal=e},expression:"bgOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"textColor",label:t.$t("settings.text")},model:{value:t.textColorLocal,callback:function(e){t.textColorLocal=e},expression:"textColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgText}}),t._v(" "),s("ColorInput",{attrs:{name:"accentColor",fallback:t.previewTheme.colors.link,label:t.$t("settings.accent"),"show-optional-tickbox":void 0!==t.linkColorLocal},model:{value:t.accentColorLocal,callback:function(e){t.accentColorLocal=e},expression:"accentColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"linkColor",fallback:t.previewTheme.colors.accent,label:t.$t("settings.links"),"show-optional-tickbox":void 0!==t.accentColorLocal},model:{value:t.linkColorLocal,callback:function(e){t.linkColorLocal=e},expression:"linkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"fgColor",label:t.$t("settings.foreground")},model:{value:t.fgColorLocal,callback:function(e){t.fgColorLocal=e},expression:"fgColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"fgTextColor",label:t.$t("settings.text"),fallback:t.previewTheme.colors.fgText},model:{value:t.fgTextColorLocal,callback:function(e){t.fgTextColorLocal=e},expression:"fgTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"fgLinkColor",label:t.$t("settings.links"),fallback:t.previewTheme.colors.fgLink},model:{value:t.fgLinkColorLocal,callback:function(e){t.fgLinkColorLocal=e},expression:"fgLinkColorLocal"}}),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.common_colors.foreground_hint")))])],1),t._v(" "),s("h4",[t._v(t._s(t.$t("settings.style.common_colors.rgbo")))]),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"cRedColor",label:t.$t("settings.cRed")},model:{value:t.cRedColorLocal,callback:function(e){t.cRedColorLocal=e},expression:"cRedColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCRed}}),t._v(" "),s("ColorInput",{attrs:{name:"cBlueColor",label:t.$t("settings.cBlue")},model:{value:t.cBlueColorLocal,callback:function(e){t.cBlueColorLocal=e},expression:"cBlueColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCBlue}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("ColorInput",{attrs:{name:"cGreenColor",label:t.$t("settings.cGreen")},model:{value:t.cGreenColorLocal,callback:function(e){t.cGreenColorLocal=e},expression:"cGreenColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCGreen}}),t._v(" "),s("ColorInput",{attrs:{name:"cOrangeColor",label:t.$t("settings.cOrange")},model:{value:t.cOrangeColorLocal,callback:function(e){t.cOrangeColorLocal=e},expression:"cOrangeColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.bgCOrange}})],1),t._v(" "),s("p",[t._v(t._s(t.$t("settings.theme_help_v2_2")))])]),t._v(" "),s("div",{staticClass:"color-container",attrs:{label:t.$t("settings.style.advanced_colors._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.theme_help")))]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearOpacity}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_opacity"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearV1}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.post")))]),t._v(" "),s("ColorInput",{attrs:{name:"postLinkColor",fallback:t.previewTheme.colors.accent,label:t.$t("settings.links")},model:{value:t.postLinkColorLocal,callback:function(e){t.postLinkColorLocal=e},expression:"postLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.postLink}}),t._v(" "),s("ColorInput",{attrs:{name:"postGreentextColor",fallback:t.previewTheme.colors.cGreen,label:t.$t("settings.greentext")},model:{value:t.postGreentextColorLocal,callback:function(e){t.postGreentextColorLocal=e},expression:"postGreentextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.postGreentext}}),t._v(" "),s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.alert")))]),t._v(" "),s("ColorInput",{attrs:{name:"alertError",label:t.$t("settings.style.advanced_colors.alert_error"),fallback:t.previewTheme.colors.alertError},model:{value:t.alertErrorColorLocal,callback:function(e){t.alertErrorColorLocal=e},expression:"alertErrorColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertErrorText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.alertErrorText},model:{value:t.alertErrorTextColorLocal,callback:function(e){t.alertErrorTextColorLocal=e},expression:"alertErrorTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.alertErrorText,large:""}}),t._v(" "),s("ColorInput",{attrs:{name:"alertWarning",label:t.$t("settings.style.advanced_colors.alert_warning"),fallback:t.previewTheme.colors.alertWarning},model:{value:t.alertWarningColorLocal,callback:function(e){t.alertWarningColorLocal=e},expression:"alertWarningColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertWarningText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.alertWarningText},model:{value:t.alertWarningTextColorLocal,callback:function(e){t.alertWarningTextColorLocal=e},expression:"alertWarningTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.alertWarningText,large:""}}),t._v(" "),s("ColorInput",{attrs:{name:"alertNeutral",label:t.$t("settings.style.advanced_colors.alert_neutral"),fallback:t.previewTheme.colors.alertNeutral},model:{value:t.alertNeutralColorLocal,callback:function(e){t.alertNeutralColorLocal=e},expression:"alertNeutralColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"alertNeutralText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.alertNeutralText},model:{value:t.alertNeutralTextColorLocal,callback:function(e){t.alertNeutralTextColorLocal=e},expression:"alertNeutralTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.alertNeutralText,large:""}}),t._v(" "),s("OpacityInput",{attrs:{name:"alertOpacity",fallback:t.previewTheme.opacity.alert},model:{value:t.alertOpacityLocal,callback:function(e){t.alertOpacityLocal=e},expression:"alertOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.badge")))]),t._v(" "),s("ColorInput",{attrs:{name:"badgeNotification",label:t.$t("settings.style.advanced_colors.badge_notification"),fallback:t.previewTheme.colors.badgeNotification},model:{value:t.badgeNotificationColorLocal,callback:function(e){t.badgeNotificationColorLocal=e},expression:"badgeNotificationColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"badgeNotificationText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.badgeNotificationText},model:{value:t.badgeNotificationTextColorLocal,callback:function(e){t.badgeNotificationTextColorLocal=e},expression:"badgeNotificationTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.badgeNotificationText,large:""}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.panel_header")))]),t._v(" "),s("ColorInput",{attrs:{name:"panelColor",fallback:t.previewTheme.colors.panel,label:t.$t("settings.background")},model:{value:t.panelColorLocal,callback:function(e){t.panelColorLocal=e},expression:"panelColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"panelOpacity",fallback:t.previewTheme.opacity.panel,disabled:"transparent"===t.panelColorLocal},model:{value:t.panelOpacityLocal,callback:function(e){t.panelOpacityLocal=e},expression:"panelOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"panelTextColor",fallback:t.previewTheme.colors.panelText,label:t.$t("settings.text")},model:{value:t.panelTextColorLocal,callback:function(e){t.panelTextColorLocal=e},expression:"panelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.panelText,large:""}}),t._v(" "),s("ColorInput",{attrs:{name:"panelLinkColor",fallback:t.previewTheme.colors.panelLink,label:t.$t("settings.links")},model:{value:t.panelLinkColorLocal,callback:function(e){t.panelLinkColorLocal=e},expression:"panelLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.panelLink,large:""}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.top_bar")))]),t._v(" "),s("ColorInput",{attrs:{name:"topBarColor",fallback:t.previewTheme.colors.topBar,label:t.$t("settings.background")},model:{value:t.topBarColorLocal,callback:function(e){t.topBarColorLocal=e},expression:"topBarColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"topBarTextColor",fallback:t.previewTheme.colors.topBarText,label:t.$t("settings.text")},model:{value:t.topBarTextColorLocal,callback:function(e){t.topBarTextColorLocal=e},expression:"topBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.topBarText}}),t._v(" "),s("ColorInput",{attrs:{name:"topBarLinkColor",fallback:t.previewTheme.colors.topBarLink,label:t.$t("settings.links")},model:{value:t.topBarLinkColorLocal,callback:function(e){t.topBarLinkColorLocal=e},expression:"topBarLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.topBarLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.inputs")))]),t._v(" "),s("ColorInput",{attrs:{name:"inputColor",fallback:t.previewTheme.colors.input,label:t.$t("settings.background")},model:{value:t.inputColorLocal,callback:function(e){t.inputColorLocal=e},expression:"inputColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"inputOpacity",fallback:t.previewTheme.opacity.input,disabled:"transparent"===t.inputColorLocal},model:{value:t.inputOpacityLocal,callback:function(e){t.inputOpacityLocal=e},expression:"inputOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"inputTextColor",fallback:t.previewTheme.colors.inputText,label:t.$t("settings.text")},model:{value:t.inputTextColorLocal,callback:function(e){t.inputTextColorLocal=e},expression:"inputTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.inputText}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.buttons")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnColor",fallback:t.previewTheme.colors.btn,label:t.$t("settings.background")},model:{value:t.btnColorLocal,callback:function(e){t.btnColorLocal=e},expression:"btnColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"btnOpacity",fallback:t.previewTheme.opacity.btn,disabled:"transparent"===t.btnColorLocal},model:{value:t.btnOpacityLocal,callback:function(e){t.btnOpacityLocal=e},expression:"btnOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnTextColor",fallback:t.previewTheme.colors.btnText,label:t.$t("settings.text")},model:{value:t.btnTextColorLocal,callback:function(e){t.btnTextColorLocal=e},expression:"btnTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPanelTextColor",fallback:t.previewTheme.colors.btnPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnPanelTextColorLocal,callback:function(e){t.btnPanelTextColorLocal=e},expression:"btnPanelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPanelText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnTopBarTextColor",fallback:t.previewTheme.colors.btnTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnTopBarTextColorLocal,callback:function(e){t.btnTopBarTextColorLocal=e},expression:"btnTopBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnTopBarText}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.pressed")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedColor",fallback:t.previewTheme.colors.btnPressed,label:t.$t("settings.background")},model:{value:t.btnPressedColorLocal,callback:function(e){t.btnPressedColorLocal=e},expression:"btnPressedColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedTextColor",fallback:t.previewTheme.colors.btnPressedText,label:t.$t("settings.text")},model:{value:t.btnPressedTextColorLocal,callback:function(e){t.btnPressedTextColorLocal=e},expression:"btnPressedTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPressedText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedPanelTextColor",fallback:t.previewTheme.colors.btnPressedPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnPressedPanelTextColorLocal,callback:function(e){t.btnPressedPanelTextColorLocal=e},expression:"btnPressedPanelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPressedPanelText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnPressedTopBarTextColor",fallback:t.previewTheme.colors.btnPressedTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnPressedTopBarTextColorLocal,callback:function(e){t.btnPressedTopBarTextColorLocal=e},expression:"btnPressedTopBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnPressedTopBarText}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.disabled")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledColor",fallback:t.previewTheme.colors.btnDisabled,label:t.$t("settings.background")},model:{value:t.btnDisabledColorLocal,callback:function(e){t.btnDisabledColorLocal=e},expression:"btnDisabledColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledTextColor",fallback:t.previewTheme.colors.btnDisabledText,label:t.$t("settings.text")},model:{value:t.btnDisabledTextColorLocal,callback:function(e){t.btnDisabledTextColorLocal=e},expression:"btnDisabledTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledPanelTextColor",fallback:t.previewTheme.colors.btnDisabledPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnDisabledPanelTextColorLocal,callback:function(e){t.btnDisabledPanelTextColorLocal=e},expression:"btnDisabledPanelTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnDisabledTopBarTextColor",fallback:t.previewTheme.colors.btnDisabledTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnDisabledTopBarTextColorLocal,callback:function(e){t.btnDisabledTopBarTextColorLocal=e},expression:"btnDisabledTopBarTextColorLocal"}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.toggled")))]),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledColor",fallback:t.previewTheme.colors.btnToggled,label:t.$t("settings.background")},model:{value:t.btnToggledColorLocal,callback:function(e){t.btnToggledColorLocal=e},expression:"btnToggledColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledTextColor",fallback:t.previewTheme.colors.btnToggledText,label:t.$t("settings.text")},model:{value:t.btnToggledTextColorLocal,callback:function(e){t.btnToggledTextColorLocal=e},expression:"btnToggledTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnToggledText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledPanelTextColor",fallback:t.previewTheme.colors.btnToggledPanelText,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.btnToggledPanelTextColorLocal,callback:function(e){t.btnToggledPanelTextColorLocal=e},expression:"btnToggledPanelTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnToggledPanelText}}),t._v(" "),s("ColorInput",{attrs:{name:"btnToggledTopBarTextColor",fallback:t.previewTheme.colors.btnToggledTopBarText,label:t.$t("settings.style.advanced_colors.top_bar")},model:{value:t.btnToggledTopBarTextColorLocal,callback:function(e){t.btnToggledTopBarTextColorLocal=e},expression:"btnToggledTopBarTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.btnToggledTopBarText}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.tabs")))]),t._v(" "),s("ColorInput",{attrs:{name:"tabColor",fallback:t.previewTheme.colors.tab,label:t.$t("settings.background")},model:{value:t.tabColorLocal,callback:function(e){t.tabColorLocal=e},expression:"tabColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"tabTextColor",fallback:t.previewTheme.colors.tabText,label:t.$t("settings.text")},model:{value:t.tabTextColorLocal,callback:function(e){t.tabTextColorLocal=e},expression:"tabTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.tabText}}),t._v(" "),s("ColorInput",{attrs:{name:"tabActiveTextColor",fallback:t.previewTheme.colors.tabActiveText,label:t.$t("settings.text")},model:{value:t.tabActiveTextColorLocal,callback:function(e){t.tabActiveTextColorLocal=e},expression:"tabActiveTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.tabActiveText}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.borders")))]),t._v(" "),s("ColorInput",{attrs:{name:"borderColor",fallback:t.previewTheme.colors.border,label:t.$t("settings.style.common.color")},model:{value:t.borderColorLocal,callback:function(e){t.borderColorLocal=e},expression:"borderColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"borderOpacity",fallback:t.previewTheme.opacity.border,disabled:"transparent"===t.borderColorLocal},model:{value:t.borderOpacityLocal,callback:function(e){t.borderOpacityLocal=e},expression:"borderOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.faint_text")))]),t._v(" "),s("ColorInput",{attrs:{name:"faintColor",fallback:t.previewTheme.colors.faint,label:t.$t("settings.text")},model:{value:t.faintColorLocal,callback:function(e){t.faintColorLocal=e},expression:"faintColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"faintLinkColor",fallback:t.previewTheme.colors.faintLink,label:t.$t("settings.links")},model:{value:t.faintLinkColorLocal,callback:function(e){t.faintLinkColorLocal=e},expression:"faintLinkColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"panelFaintColor",fallback:t.previewTheme.colors.panelFaint,label:t.$t("settings.style.advanced_colors.panel_header")},model:{value:t.panelFaintColorLocal,callback:function(e){t.panelFaintColorLocal=e},expression:"panelFaintColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"faintOpacity",fallback:t.previewTheme.opacity.faint},model:{value:t.faintOpacityLocal,callback:function(e){t.faintOpacityLocal=e},expression:"faintOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.underlay")))]),t._v(" "),s("ColorInput",{attrs:{name:"underlay",label:t.$t("settings.style.advanced_colors.underlay"),fallback:t.previewTheme.colors.underlay},model:{value:t.underlayColorLocal,callback:function(e){t.underlayColorLocal=e},expression:"underlayColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"underlayOpacity",fallback:t.previewTheme.opacity.underlay,disabled:"transparent"===t.underlayOpacityLocal},model:{value:t.underlayOpacityLocal,callback:function(e){t.underlayOpacityLocal=e},expression:"underlayOpacityLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.poll")))]),t._v(" "),s("ColorInput",{attrs:{name:"poll",label:t.$t("settings.background"),fallback:t.previewTheme.colors.poll},model:{value:t.pollColorLocal,callback:function(e){t.pollColorLocal=e},expression:"pollColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"pollText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.pollText},model:{value:t.pollTextColorLocal,callback:function(e){t.pollTextColorLocal=e},expression:"pollTextColorLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.icons")))]),t._v(" "),s("ColorInput",{attrs:{name:"icon",label:t.$t("settings.style.advanced_colors.icons"),fallback:t.previewTheme.colors.icon},model:{value:t.iconColorLocal,callback:function(e){t.iconColorLocal=e},expression:"iconColorLocal"}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.highlight")))]),t._v(" "),s("ColorInput",{attrs:{name:"highlight",label:t.$t("settings.background"),fallback:t.previewTheme.colors.highlight},model:{value:t.highlightColorLocal,callback:function(e){t.highlightColorLocal=e},expression:"highlightColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"highlightText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.highlightText},model:{value:t.highlightTextColorLocal,callback:function(e){t.highlightTextColorLocal=e},expression:"highlightTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.highlightText}}),t._v(" "),s("ColorInput",{attrs:{name:"highlightLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.highlightLink},model:{value:t.highlightLinkColorLocal,callback:function(e){t.highlightLinkColorLocal=e},expression:"highlightLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.highlightLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.popover")))]),t._v(" "),s("ColorInput",{attrs:{name:"popover",label:t.$t("settings.background"),fallback:t.previewTheme.colors.popover},model:{value:t.popoverColorLocal,callback:function(e){t.popoverColorLocal=e},expression:"popoverColorLocal"}}),t._v(" "),s("OpacityInput",{attrs:{name:"popoverOpacity",fallback:t.previewTheme.opacity.popover,disabled:"transparent"===t.popoverOpacityLocal},model:{value:t.popoverOpacityLocal,callback:function(e){t.popoverOpacityLocal=e},expression:"popoverOpacityLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"popoverText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.popoverText},model:{value:t.popoverTextColorLocal,callback:function(e){t.popoverTextColorLocal=e},expression:"popoverTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.popoverText}}),t._v(" "),s("ColorInput",{attrs:{name:"popoverLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.popoverLink},model:{value:t.popoverLinkColorLocal,callback:function(e){t.popoverLinkColorLocal=e},expression:"popoverLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.popoverLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.selectedPost")))]),t._v(" "),s("ColorInput",{attrs:{name:"selectedPost",label:t.$t("settings.background"),fallback:t.previewTheme.colors.selectedPost},model:{value:t.selectedPostColorLocal,callback:function(e){t.selectedPostColorLocal=e},expression:"selectedPostColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedPostText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.selectedPostText},model:{value:t.selectedPostTextColorLocal,callback:function(e){t.selectedPostTextColorLocal=e},expression:"selectedPostTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedPostText}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedPostLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.selectedPostLink},model:{value:t.selectedPostLinkColorLocal,callback:function(e){t.selectedPostLinkColorLocal=e},expression:"selectedPostLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedPostLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("settings.style.advanced_colors.selectedMenu")))]),t._v(" "),s("ColorInput",{attrs:{name:"selectedMenu",label:t.$t("settings.background"),fallback:t.previewTheme.colors.selectedMenu},model:{value:t.selectedMenuColorLocal,callback:function(e){t.selectedMenuColorLocal=e},expression:"selectedMenuColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedMenuText",label:t.$t("settings.text"),fallback:t.previewTheme.colors.selectedMenuText},model:{value:t.selectedMenuTextColorLocal,callback:function(e){t.selectedMenuTextColorLocal=e},expression:"selectedMenuTextColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedMenuText}}),t._v(" "),s("ColorInput",{attrs:{name:"selectedMenuLink",label:t.$t("settings.links"),fallback:t.previewTheme.colors.selectedMenuLink},model:{value:t.selectedMenuLinkColorLocal,callback:function(e){t.selectedMenuLinkColorLocal=e},expression:"selectedMenuLinkColorLocal"}}),t._v(" "),s("ContrastRatio",{attrs:{contrast:t.previewContrast.selectedMenuLink}})],1),t._v(" "),s("div",{staticClass:"color-item"},[s("h4",[t._v(t._s(t.$t("chats.chats")))]),t._v(" "),s("ColorInput",{attrs:{name:"chatBgColor",fallback:t.previewTheme.colors.bg,label:t.$t("settings.background")},model:{value:t.chatBgColorLocal,callback:function(e){t.chatBgColorLocal=e},expression:"chatBgColorLocal"}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.chat.incoming")))]),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingBgColor",fallback:t.previewTheme.colors.bg,label:t.$t("settings.background")},model:{value:t.chatMessageIncomingBgColorLocal,callback:function(e){t.chatMessageIncomingBgColorLocal=e},expression:"chatMessageIncomingBgColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingTextColor",fallback:t.previewTheme.colors.text,label:t.$t("settings.text")},model:{value:t.chatMessageIncomingTextColorLocal,callback:function(e){t.chatMessageIncomingTextColorLocal=e},expression:"chatMessageIncomingTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingLinkColor",fallback:t.previewTheme.colors.link,label:t.$t("settings.links")},model:{value:t.chatMessageIncomingLinkColorLocal,callback:function(e){t.chatMessageIncomingLinkColorLocal=e},expression:"chatMessageIncomingLinkColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageIncomingBorderLinkColor",fallback:t.previewTheme.colors.fg,label:t.$t("settings.style.advanced_colors.chat.border")},model:{value:t.chatMessageIncomingBorderColorLocal,callback:function(e){t.chatMessageIncomingBorderColorLocal=e},expression:"chatMessageIncomingBorderColorLocal"}}),t._v(" "),s("h5",[t._v(t._s(t.$t("settings.style.advanced_colors.chat.outgoing")))]),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingBgColor",fallback:t.previewTheme.colors.bg,label:t.$t("settings.background")},model:{value:t.chatMessageOutgoingBgColorLocal,callback:function(e){t.chatMessageOutgoingBgColorLocal=e},expression:"chatMessageOutgoingBgColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingTextColor",fallback:t.previewTheme.colors.text,label:t.$t("settings.text")},model:{value:t.chatMessageOutgoingTextColorLocal,callback:function(e){t.chatMessageOutgoingTextColorLocal=e},expression:"chatMessageOutgoingTextColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingLinkColor",fallback:t.previewTheme.colors.link,label:t.$t("settings.links")},model:{value:t.chatMessageOutgoingLinkColorLocal,callback:function(e){t.chatMessageOutgoingLinkColorLocal=e},expression:"chatMessageOutgoingLinkColorLocal"}}),t._v(" "),s("ColorInput",{attrs:{name:"chatMessageOutgoingBorderLinkColor",fallback:t.previewTheme.colors.bg,label:t.$t("settings.style.advanced_colors.chat.border")},model:{value:t.chatMessageOutgoingBorderColorLocal,callback:function(e){t.chatMessageOutgoingBorderColorLocal=e},expression:"chatMessageOutgoingBorderColorLocal"}})],1)]),t._v(" "),s("div",{staticClass:"radius-container",attrs:{label:t.$t("settings.style.radii._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.radii_help")))]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearRoundness}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("RangeInput",{attrs:{name:"btnRadius",label:t.$t("settings.btnRadius"),fallback:t.previewTheme.radii.btn,max:"16","hard-min":"0"},model:{value:t.btnRadiusLocal,callback:function(e){t.btnRadiusLocal=e},expression:"btnRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"inputRadius",label:t.$t("settings.inputRadius"),fallback:t.previewTheme.radii.input,max:"9","hard-min":"0"},model:{value:t.inputRadiusLocal,callback:function(e){t.inputRadiusLocal=e},expression:"inputRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"checkboxRadius",label:t.$t("settings.checkboxRadius"),fallback:t.previewTheme.radii.checkbox,max:"16","hard-min":"0"},model:{value:t.checkboxRadiusLocal,callback:function(e){t.checkboxRadiusLocal=e},expression:"checkboxRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"panelRadius",label:t.$t("settings.panelRadius"),fallback:t.previewTheme.radii.panel,max:"50","hard-min":"0"},model:{value:t.panelRadiusLocal,callback:function(e){t.panelRadiusLocal=e},expression:"panelRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"avatarRadius",label:t.$t("settings.avatarRadius"),fallback:t.previewTheme.radii.avatar,max:"28","hard-min":"0"},model:{value:t.avatarRadiusLocal,callback:function(e){t.avatarRadiusLocal=e},expression:"avatarRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"avatarAltRadius",label:t.$t("settings.avatarAltRadius"),fallback:t.previewTheme.radii.avatarAlt,max:"28","hard-min":"0"},model:{value:t.avatarAltRadiusLocal,callback:function(e){t.avatarAltRadiusLocal=e},expression:"avatarAltRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"attachmentRadius",label:t.$t("settings.attachmentRadius"),fallback:t.previewTheme.radii.attachment,max:"50","hard-min":"0"},model:{value:t.attachmentRadiusLocal,callback:function(e){t.attachmentRadiusLocal=e},expression:"attachmentRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"tooltipRadius",label:t.$t("settings.tooltipRadius"),fallback:t.previewTheme.radii.tooltip,max:"50","hard-min":"0"},model:{value:t.tooltipRadiusLocal,callback:function(e){t.tooltipRadiusLocal=e},expression:"tooltipRadiusLocal"}}),t._v(" "),s("RangeInput",{attrs:{name:"chatMessageRadius",label:t.$t("settings.chatMessageRadius"),fallback:t.previewTheme.radii.chatMessage||2,max:"50","hard-min":"0"},model:{value:t.chatMessageRadiusLocal,callback:function(e){t.chatMessageRadiusLocal=e},expression:"chatMessageRadiusLocal"}})],1),t._v(" "),s("div",{staticClass:"shadow-container",attrs:{label:t.$t("settings.style.shadows._tab_label")}},[s("div",{staticClass:"tab-header shadow-selector"},[s("div",{staticClass:"select-container"},[t._v("\n "+t._s(t.$t("settings.style.shadows.component"))+"\n "),s("label",{staticClass:"select",attrs:{for:"shadow-switcher"}},[s("select",{directives:[{name:"model",rawName:"v-model",value:t.shadowSelected,expression:"shadowSelected"}],staticClass:"shadow-switcher",attrs:{id:"shadow-switcher"},on:{change:function(e){var s=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.shadowSelected=e.target.multiple?s:s[0]}}},t._l(t.shadowsAvailable,function(e){return s("option",{key:e,domProps:{value:e}},[t._v("\n "+t._s(t.$t("settings.style.shadows.components."+e))+"\n ")])}),0),t._v(" "),s("i",{staticClass:"icon-down-open"})])]),t._v(" "),s("div",{staticClass:"override"},[s("label",{staticClass:"label",attrs:{for:"override"}},[t._v("\n "+t._s(t.$t("settings.style.shadows.override"))+"\n ")]),t._v(" "),s("input",{directives:[{name:"model",rawName:"v-model",value:t.currentShadowOverriden,expression:"currentShadowOverriden"}],staticClass:"input-override",attrs:{id:"override",name:"override",type:"checkbox"},domProps:{checked:Array.isArray(t.currentShadowOverriden)?t._i(t.currentShadowOverriden,null)>-1:t.currentShadowOverriden},on:{change:function(e){var s=t.currentShadowOverriden,a=e.target,n=!!a.checked;if(Array.isArray(s)){var o=t._i(s,null);a.checked?o<0&&(t.currentShadowOverriden=s.concat([null])):o>-1&&(t.currentShadowOverriden=s.slice(0,o).concat(s.slice(o+1)))}else t.currentShadowOverriden=n}}}),t._v(" "),s("label",{staticClass:"checkbox-label",attrs:{for:"override"}})]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearShadows}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("ShadowControl",{attrs:{ready:!!t.currentShadowFallback,fallback:t.currentShadowFallback},model:{value:t.currentShadow,callback:function(e){t.currentShadow=e},expression:"currentShadow"}}),t._v(" "),"avatar"===t.shadowSelected||"avatarStatus"===t.shadowSelected?s("div",[s("i18n",{attrs:{path:"settings.style.shadows.filter_hint.always_drop_shadow",tag:"p"}},[s("code",[t._v("filter: drop-shadow()")])]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.shadows.filter_hint.avatar_inset")))]),t._v(" "),s("i18n",{attrs:{path:"settings.style.shadows.filter_hint.drop_shadow_syntax",tag:"p"}},[s("code",[t._v("drop-shadow")]),t._v(" "),s("code",[t._v("spread-radius")]),t._v(" "),s("code",[t._v("inset")])]),t._v(" "),s("i18n",{attrs:{path:"settings.style.shadows.filter_hint.inset_classic",tag:"p"}},[s("code",[t._v("box-shadow")])]),t._v(" "),s("p",[t._v(t._s(t.$t("settings.style.shadows.filter_hint.spread_zero")))])],1):t._e()],1),t._v(" "),s("div",{staticClass:"fonts-container",attrs:{label:t.$t("settings.style.fonts._tab_label")}},[s("div",{staticClass:"tab-header"},[s("p",[t._v(t._s(t.$t("settings.style.fonts.help")))]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearFonts}},[t._v("\n "+t._s(t.$t("settings.style.switcher.clear_all"))+"\n ")])]),t._v(" "),s("FontControl",{attrs:{name:"ui",label:t.$t("settings.style.fonts.components.interface"),fallback:t.previewTheme.fonts.interface,"no-inherit":"1"},model:{value:t.fontsLocal.interface,callback:function(e){t.$set(t.fontsLocal,"interface",e)},expression:"fontsLocal.interface"}}),t._v(" "),s("FontControl",{attrs:{name:"input",label:t.$t("settings.style.fonts.components.input"),fallback:t.previewTheme.fonts.input},model:{value:t.fontsLocal.input,callback:function(e){t.$set(t.fontsLocal,"input",e)},expression:"fontsLocal.input"}}),t._v(" "),s("FontControl",{attrs:{name:"post",label:t.$t("settings.style.fonts.components.post"),fallback:t.previewTheme.fonts.post},model:{value:t.fontsLocal.post,callback:function(e){t.$set(t.fontsLocal,"post",e)},expression:"fontsLocal.post"}}),t._v(" "),s("FontControl",{attrs:{name:"postCode",label:t.$t("settings.style.fonts.components.postCode"),fallback:t.previewTheme.fonts.postCode},model:{value:t.fontsLocal.postCode,callback:function(e){t.$set(t.fontsLocal,"postCode",e)},expression:"fontsLocal.postCode"}})],1)])],1),t._v(" "),s("div",{staticClass:"apply-container"},[s("button",{staticClass:"btn submit",attrs:{disabled:!t.themeValid},on:{click:t.setCustomTheme}},[t._v("\n "+t._s(t.$t("general.apply"))+"\n ")]),t._v(" "),s("button",{staticClass:"btn",on:{click:t.clearAll}},[t._v("\n "+t._s(t.$t("settings.style.switcher.reset"))+"\n ")])])],1)},[],!1,Fe,null,null).exports,Ue={components:{TabSwitcher:a.a,DataImportExportTab:m,MutesAndBlocksTab:nt,NotificationsTab:it,FilteringTab:ft,SecurityTab:Et,ProfileTab:Qt,GeneralTab:ae,VersionTab:oe,ThemeTab:Me},computed:{isLoggedIn:function(){return!!this.$store.state.users.currentUser},open:function(){return"hidden"!==this.$store.state.interface.settingsModalState}},methods:{onOpen:function(){var t=this.$store.state.interface.settingsModalTargetTab;if(t){var e=this.$refs.tabSwitcher.$slots.default.findIndex(function(e){return e.data&&e.data.attrs["data-tab-name"]===t});e>=0&&this.$refs.tabSwitcher.setTab(e)}this.$store.dispatch("clearSettingsModalTargetTab")}},mounted:function(){this.onOpen()},watch:{open:function(t){t&&this.onOpen()}}};var Ve=function(t){s(591)},Ae=Object(o.a)(Ue,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tab-switcher",{ref:"tabSwitcher",staticClass:"settings_tab-switcher",attrs:{"side-tab-bar":!0,"scrollable-tabs":!0}},[s("div",{attrs:{label:t.$t("settings.general"),icon:"wrench","data-tab-name":"general"}},[s("GeneralTab")],1),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.profile_tab"),icon:"user","data-tab-name":"profile"}},[s("ProfileTab")],1):t._e(),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.security_tab"),icon:"lock","data-tab-name":"security"}},[s("SecurityTab")],1):t._e(),t._v(" "),s("div",{attrs:{label:t.$t("settings.filtering"),icon:"filter","data-tab-name":"filtering"}},[s("FilteringTab")],1),t._v(" "),s("div",{attrs:{label:t.$t("settings.theme"),icon:"brush","data-tab-name":"theme"}},[s("ThemeTab")],1),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.notifications"),icon:"bell-ringing-o","data-tab-name":"notifications"}},[s("NotificationsTab")],1):t._e(),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.data_import_export_tab"),icon:"download","data-tab-name":"dataImportExport"}},[s("DataImportExportTab")],1):t._e(),t._v(" "),t.isLoggedIn?s("div",{attrs:{label:t.$t("settings.mutes_and_blocks"),fullHeight:!0,icon:"eye-off","data-tab-name":"mutesAndBlocks"}},[s("MutesAndBlocksTab")],1):t._e(),t._v(" "),s("div",{attrs:{label:t.$t("settings.version.title"),icon:"info-circled","data-tab-name":"version"}},[s("VersionTab")],1)])},[],!1,Ve,null,null);e.default=Ae.exports}}]); +//# sourceMappingURL=2.e852a6b4b3bba752b838.js.map \ No newline at end of file diff --git a/priv/static/static/js/2.e852a6b4b3bba752b838.js.map b/priv/static/static/js/2.e852a6b4b3bba752b838.js.map new file mode 100644 index 000000000..d698f09e1 --- /dev/null +++ b/priv/static/static/js/2.e852a6b4b3bba752b838.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/settings_modal/settings_modal_content.scss?d424","webpack:///./src/components/settings_modal/settings_modal_content.scss","webpack:///./src/components/importer/importer.vue?7798","webpack:///./src/components/importer/importer.vue?6af6","webpack:///./src/components/exporter/exporter.vue?dea3","webpack:///./src/components/exporter/exporter.vue?cc2b","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.scss?4d0c","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.scss","webpack:///./src/components/autosuggest/autosuggest.vue?9908","webpack:///./src/components/autosuggest/autosuggest.vue?9383","webpack:///./src/components/block_card/block_card.vue?7ad7","webpack:///./src/components/block_card/block_card.vue?ddc8","webpack:///./src/components/mute_card/mute_card.vue?c72f","webpack:///./src/components/mute_card/mute_card.vue?1268","webpack:///./src/components/domain_mute_card/domain_mute_card.vue?a613","webpack:///./src/components/domain_mute_card/domain_mute_card.vue?c85e","webpack:///./src/components/selectable_list/selectable_list.vue?a6e3","webpack:///./src/components/selectable_list/selectable_list.vue?c2f8","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.vue?540b","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.vue?cd9f","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.vue?da3d","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.vue?57b8","webpack:///./src/components/settings_modal/tabs/profile_tab.scss?588b","webpack:///./src/components/settings_modal/tabs/profile_tab.scss","webpack:///./src/components/image_cropper/image_cropper.vue?f169","webpack:///./src/components/image_cropper/image_cropper.vue?6235","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.scss?080d","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.scss","webpack:///./src/components/color_input/color_input.scss?c457","webpack:///./src/components/color_input/color_input.scss","webpack:///./src/components/color_input/color_input.vue?6a4c","webpack:///./src/components/color_input/color_input.vue?bb22","webpack:///./src/components/shadow_control/shadow_control.vue?bfd4","webpack:///./src/components/shadow_control/shadow_control.vue?78ef","webpack:///./src/components/font_control/font_control.vue?5f33","webpack:///./src/components/font_control/font_control.vue?bef4","webpack:///./src/components/contrast_ratio/contrast_ratio.vue?a340","webpack:///./src/components/contrast_ratio/contrast_ratio.vue?32fa","webpack:///./src/components/export_import/export_import.vue?5952","webpack:///./src/components/export_import/export_import.vue?aed6","webpack:///./src/components/settings_modal/tabs/theme_tab/preview.vue?1ae8","webpack:///./src/components/settings_modal/tabs/theme_tab/preview.vue?ab81","webpack:///./src/components/importer/importer.js","webpack:///./src/components/importer/importer.vue","webpack:///./src/components/importer/importer.vue?320c","webpack:///./src/components/exporter/exporter.js","webpack:///./src/components/exporter/exporter.vue","webpack:///./src/components/exporter/exporter.vue?7e42","webpack:///./src/components/settings_modal/tabs/data_import_export_tab.js","webpack:///./src/components/settings_modal/tabs/data_import_export_tab.vue","webpack:///./src/components/settings_modal/tabs/data_import_export_tab.vue?40b4","webpack:///./src/components/autosuggest/autosuggest.js","webpack:///./src/components/autosuggest/autosuggest.vue","webpack:///./src/components/autosuggest/autosuggest.vue?b400","webpack:///./src/components/block_card/block_card.js","webpack:///./src/components/block_card/block_card.vue","webpack:///./src/components/block_card/block_card.vue?7b44","webpack:///./src/components/mute_card/mute_card.js","webpack:///./src/components/mute_card/mute_card.vue","webpack:///./src/components/mute_card/mute_card.vue?6bc9","webpack:///./src/components/domain_mute_card/domain_mute_card.js","webpack:///./src/components/domain_mute_card/domain_mute_card.vue","webpack:///./src/components/domain_mute_card/domain_mute_card.vue?7cf0","webpack:///./src/components/selectable_list/selectable_list.js","webpack:///./src/components/selectable_list/selectable_list.vue","webpack:///./src/components/selectable_list/selectable_list.vue?5686","webpack:///./src/hocs/with_subscription/with_subscription.js","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.js","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.vue","webpack:///./src/components/settings_modal/tabs/mutes_and_blocks_tab.vue?0687","webpack:///./src/components/settings_modal/tabs/notifications_tab.js","webpack:///./src/components/settings_modal/tabs/notifications_tab.vue","webpack:///./src/components/settings_modal/tabs/notifications_tab.vue?6dcc","webpack:///./src/components/settings_modal/helpers/shared_computed_object.js","webpack:///./src/components/settings_modal/tabs/filtering_tab.js","webpack:///./src/components/settings_modal/tabs/filtering_tab.vue","webpack:///./src/components/settings_modal/tabs/filtering_tab.vue?3af7","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.js","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.vue","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_backup_codes.vue?198f","webpack:///./src/components/settings_modal/tabs/security_tab/confirm.js","webpack:///./src/components/settings_modal/tabs/security_tab/confirm.vue","webpack:///./src/components/settings_modal/tabs/security_tab/confirm.vue?da03","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_totp.js","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.js","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_totp.vue","webpack:///./src/components/settings_modal/tabs/security_tab/mfa_totp.vue?cdbe","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.vue","webpack:///./src/components/settings_modal/tabs/security_tab/mfa.vue?8795","webpack:///./src/components/settings_modal/tabs/security_tab/security_tab.js","webpack:///./src/components/settings_modal/tabs/security_tab/security_tab.vue","webpack:///./src/components/settings_modal/tabs/security_tab/security_tab.vue?0d38","webpack:///./src/components/image_cropper/image_cropper.js","webpack:///./src/components/image_cropper/image_cropper.vue","webpack:///./src/components/image_cropper/image_cropper.vue?017e","webpack:///./src/components/settings_modal/tabs/profile_tab.js","webpack:///./src/components/settings_modal/tabs/profile_tab.vue","webpack:///./src/components/settings_modal/tabs/profile_tab.vue?4eea","webpack:///src/components/interface_language_switcher/interface_language_switcher.vue","webpack:///./src/components/interface_language_switcher/interface_language_switcher.vue","webpack:///./src/components/interface_language_switcher/interface_language_switcher.vue?d9d4","webpack:///./src/components/settings_modal/tabs/general_tab.js","webpack:///./src/components/settings_modal/tabs/general_tab.vue","webpack:///./src/components/settings_modal/tabs/general_tab.vue?2e10","webpack:///./src/components/settings_modal/tabs/version_tab.js","webpack:///./src/services/version/version.service.js","webpack:///./src/components/settings_modal/tabs/version_tab.vue","webpack:///./src/components/settings_modal/tabs/version_tab.vue?7cbe","webpack:///src/components/color_input/color_input.vue","webpack:///./src/components/color_input/color_input.vue","webpack:///./src/components/color_input/color_input.vue?3d5b","webpack:///./src/components/range_input/range_input.vue","webpack:///src/components/range_input/range_input.vue","webpack:///./src/components/range_input/range_input.vue?202a","webpack:///src/components/opacity_input/opacity_input.vue","webpack:///./src/components/opacity_input/opacity_input.vue","webpack:///./src/components/opacity_input/opacity_input.vue?0078","webpack:///./src/components/shadow_control/shadow_control.js","webpack:///./src/components/shadow_control/shadow_control.vue","webpack:///./src/components/shadow_control/shadow_control.vue?c9d6","webpack:///./src/components/font_control/font_control.js","webpack:///./src/components/font_control/font_control.vue","webpack:///./src/components/font_control/font_control.vue?184b","webpack:///src/components/contrast_ratio/contrast_ratio.vue","webpack:///./src/components/contrast_ratio/contrast_ratio.vue","webpack:///./src/components/contrast_ratio/contrast_ratio.vue?efc3","webpack:///src/components/export_import/export_import.vue","webpack:///./src/components/export_import/export_import.vue","webpack:///./src/components/export_import/export_import.vue?9130","webpack:///./src/components/settings_modal/tabs/theme_tab/preview.vue","webpack:///./src/components/settings_modal/tabs/theme_tab/preview.vue?4c36","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.js","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.vue","webpack:///./src/components/settings_modal/tabs/theme_tab/theme_tab.vue?1515","webpack:///./src/components/settings_modal/settings_modal_content.js","webpack:///./src/components/settings_modal/settings_modal_content.vue","webpack:///./src/components/settings_modal/settings_modal_content.vue?458b"],"names":["content","__webpack_require__","module","i","locals","exports","add","default","push","Importer","props","submitHandler","type","Function","required","submitButtonLabel","String","this","$t","successMessage","errorMessage","data","file","error","success","submitting","methods","change","$refs","input","files","submit","_this","dismiss","then","__vue_styles__","context","importer_importer","Object","component_normalizer","importer","_vm","_h","$createElement","_c","_self","staticClass","ref","attrs","on","_v","click","_s","_e","Exporter","getContent","filename","exportButtonLabel","processingMessage","processing","process","fileToDownload","document","createElement","setAttribute","encodeURIComponent","style","display","body","appendChild","removeChild","setTimeout","exporter_vue_styles_","exporter_exporter","exporter","DataImportExportTab","activeTab","newDomainToMute","created","$store","dispatch","components","Checkbox","computed","user","state","users","currentUser","getFollowsContent","api","backendInteractor","exportFriends","id","generateExportableUsersContent","getBlocksContent","fetchBlocks","importFollows","status","Error","importBlocks","map","is_local","screen_name","location","hostname","join","tabs_data_import_export_tab","data_import_export_tab","label","submit-handler","success-message","error-message","get-content","export-button-label","autosuggest","query","filter","placeholder","term","timeout","results","resultsVisible","filtered","watch","val","fetchResults","clearTimeout","onInputClick","onClickOutside","autosuggest_vue_styles_","autosuggest_autosuggest","directives","name","rawName","value","expression","domProps","$event","target","composing","length","_l","item","_t","BlockCard","progress","getters","findUser","userId","relationship","blocked","blocking","BasicUserCard","unblockUser","blockUser","_this2","block_card_vue_styles_","block_card_block_card","block_card","disabled","MuteCard","muted","muting","unmuteUser","muteUser","mute_card_vue_styles_","mute_card_mute_card","mute_card","DomainMuteCard","ProgressButton","domainMutes","includes","domain","unmuteDomain","muteDomain","domain_mute_card_vue_styles_","domain_mute_card_domain_mute_card","domain_mute_card","slot","SelectableList","List","items","Array","getKey","selected","allKeys","filteredSelected","key","indexOf","allSelected","noneSelected","someSelected","isSelected","toggle","checked","splice","toggleAll","slice","selectable_list_vue_styles_","selectable_list_selectable_list","selectable_list","indeterminate","get-key","scopedSlots","_u","fn","class","selectable-list-item-selected-inner","withSubscription","_ref","fetch","select","_ref$childPropName","childPropName","_ref$additionalPropNa","additionalPropNames","WrappedComponent","keys","getComponentProps","v","concat","Vue","component","toConsumableArray_default","loading","fetchedData","$props","refresh","isEmpty","fetchData","render","h","_objectSpread","defineProperty_default","$listeners","$scopedSlots","children","entries","$slots","_ref2","_ref3","slicedToArray_default","helper_default","BlockList","get","MuteList","DomainMuteList","MutesAndBlocks","TabSwitcher","Autosuggest","knownDomains","instance","activateTab","tabName","filterUnblockedUsers","userIds","reject","filterUnMutedUsers","queryUserIds","blockUsers","ids","unblockUsers","muteUsers","unmuteUsers","filterUnMutedDomains","urls","_this3","url","queryKnownDomains","_this4","Promise","resolve","toLowerCase","unmuteDomains","domains","mutes_and_blocks_tab_vue_styles_","tabs_mutes_and_blocks_tab","mutes_and_blocks_tab","scrollable-tabs","row","user-id","NotificationsTab","notificationSettings","notification_settings","updateNotificationSettings","settings","tabs_notifications_tab","notifications_tab","model","callback","$$v","$set","SharedComputedObject","shared_computed_object_objectSpread","instanceDefaultProperties","multiChoiceProperties","instanceDefaultConfig","reduce","acc","_ref4","configDefaultState","mergedConfig","set","_ref5","_ref6","useStreamingApi","e","console","FilteringTab","muteWordsStringLocal","muteWords","filtering_tab_objectSpread","muteWordsString","filter_default","split","word","trim_default","notificationVisibility","handler","deep","replyVisibility","tabs_filtering_tab","filtering_tab","for","$$selectedVal","prototype","call","options","o","_value","multiple","hidePostStats","hidePostStatsLocalizedValue","hideUserStats","hideUserStatsLocalizedValue","hideFilteredStatuses","hideFilteredStatusesLocalizedValue","mfa_backup_codes","backupCodes","inProgress","codes","ready","displayTitle","mfa_backup_codes_vue_styles_","security_tab_mfa_backup_codes","code","Confirm","confirm","$emit","cancel","tabs_security_tab_confirm","security_tab_confirm","mfa_totp","currentPassword","deactivate","mfa_totp_objectSpread","isActivated","totp","mapState","doActivate","cancelDeactivate","doDeactivate","confirmDeactivate","mfaDisableOTP","password","res","Mfa","available","enabled","setupState","setupOTPState","getNewCodes","otpSettings","provisioning_uri","otpConfirmToken","readyInit","recovery-codes","RecoveryCodes","totp-item","qrcode","VueQrcode","mfa_objectSpread","canSetupOTP","setupInProgress","backupCodesPrepared","setupOTPInProgress","completedOTP","prepareOTP","confirmOTP","confirmNewBackupCodes","activateOTP","fetchBackupCodes","generateMfaBackupCodes","getBackupCodes","confirmBackupCodes","cancelBackupCodes","setupOTP","mfaSetupOTP","doConfirmOTP","mfaConfirmOTP","token","completeSetup","fetchSettings","cancelSetup","result","regenerator_default","a","async","_context","prev","next","awrap","settingsMFA","sent","abrupt","stop","mounted","_this5","mfa_vue_styles_","security_tab_mfa","mfa","activate","backup-codes","width","SecurityTab","newEmail","changeEmailError","changeEmailPassword","changedEmail","deletingAccount","deleteAccountConfirmPasswordInput","deleteAccountError","changePasswordInputs","changedPassword","changePasswordError","pleromaBackend","oauthTokens","tokens","oauthToken","appName","app_name","validUntil","Date","valid_until","toLocaleDateString","confirmDelete","deleteAccount","$router","changePassword","params","newPassword","newPasswordConfirmation","logout","changeEmail","email","replace","revokeToken","window","$i18n","t","security_tab_security_tab","security_tab","autocomplete","ImageCropper","trigger","Element","cropperOptions","aspectRatio","autoCropArea","viewMode","movable","zoomable","guides","mimes","saveButtonLabel","saveWithoutCroppingButtonlabel","cancelButtonLabel","cropper","undefined","dataUrl","submitError","saveText","saveWithoutCroppingText","cancelText","submitErrorMsg","toString","destroy","cropping","arguments","avatarUploadError","err","pickImage","createCropper","Cropper","img","getTriggerDOM","typeof_default","querySelector","readFile","fileInput","reader","FileReader","onload","readAsDataURL","clearError","addEventListener","beforeDestroy","removeEventListener","image_cropper_vue_styles_","image_cropper_image_cropper","image_cropper","src","alt","load","stopPropagation","textContent","accept","ProfileTab","newName","newBio","unescape","description","newLocked","locked","newNoRichText","no_rich_text","newDefaultScope","default_scope","newFields","fields","field","hideFollows","hide_follows","hideFollowers","hide_followers","hideFollowsCount","hide_follows_count","hideFollowersCount","hide_followers_count","showRole","show_role","role","discoverable","bot","allowFollowingMove","allow_following_move","pickAvatarBtnVisible","bannerUploading","backgroundUploading","banner","bannerPreview","background","backgroundPreview","bannerUploadError","backgroundUploadError","ScopeSelector","EmojiInput","emojiUserSuggestor","suggestor","emoji","customEmoji","updateUsersList","emojiSuggestor","userSuggestor","fieldsLimits","maxFields","defaultAvatar","server","defaultBanner","isDefaultAvatar","baseAvatar","profile_image_url","isDefaultBanner","baseBanner","cover_photo","isDefaultBackground","background_image","avatarImgSrc","profile_image_url_original","bannerImgSrc","updateProfile","note","display_name","fields_attributes","el","merge","commit","changeVis","visibility","addField","deleteField","index","event","$delete","uploadFile","size","filesize","fileSizeFormatService","fileSizeFormat","allowedsize","num","filesizeunit","unit","allowedsizeunit","resetAvatar","submitAvatar","resetBanner","submitBanner","resetBackground","submitBackground","that","updateAvatar","avatar","updateProfileImages","message","getCroppedCanvas","toBlob","_this6","profile_tab_vue_styles_","tabs_profile_tab","profile_tab","enable-emoji-picker","suggest","classname","show-all","user-default","initial-scope","on-scope-change","_","hide-emoji-button","title","open","close","clearUploadError","interface_language_switcher","languageCodes","messages","languages","languageNames","map_default","getLanguageName","language","interfaceLanguage","ja","ja_easy","zh","getName","interface_language_switcher_interface_language_switcher","langCode","GeneralTab","loopSilentAvailable","getOwnPropertyDescriptor","HTMLVideoElement","HTMLMediaElement","InterfaceLanguageSwitcher","general_tab_objectSpread","postFormats","instanceSpecificPanelPresent","showInstanceSpecificPanel","tabs_general_tab","general_tab","hideISP","hideMutedPosts","hideMutedPostsLocalizedValue","collapseMessageWithSubject","collapseMessageWithSubjectLocalizedValue","streaming","pauseOnUnfocused","emojiReactionsOnTimeline","scopeCopy","scopeCopyLocalizedValue","alwaysShowSubjectInput","alwaysShowSubjectInputLocalizedValue","subjectLineBehavior","subjectLineBehaviorDefaultValue","postContentType","postFormat","postContentTypeDefaultValue","minimalScopesMode","minimalScopesModeLocalizedValue","autohideFloatingPostButton","padEmoji","hideAttachments","hideAttachmentsInConv","modifiers","number","min","step","maxThumbnails","_n","blur","$forceUpdate","hideNsfw","preloadImage","useOneClickNsfw","stopGifs","loopVideo","loopVideoSilentOnly","playVideosInModal","useContainFit","webPushNotifications","greentext","greentextLocalizedValue","VersionTab","backendVersion","frontendVersion","frontendVersionLink","backendVersionLink","versionString","matches","match","tabs_version_tab","version_tab","href","color_input","checkbox_checkbox","fallback","Boolean","showOptionalTickbox","present","validColor","color_convert","transparentColor","computedColor","startsWith","color_input_vue_styles_","color_input_color_input","backgroundColor","range_input_range_input","max","hardMax","hardMin","opacity_input","opacity_input_opacity_input","toModel","shadow_control_objectSpread","x","y","spread","inset","color","alpha","shadow_control","selectedId","cValue","ColorInput","OpacityInput","del","Math","moveUp","moveDn","beforeUpdate","anyShadows","anyShadowsFallback","currentFallback","moveUpValid","moveDnValid","usingFallback","rgb","hex2rgb","boxShadow","getCssShadow","shadow_control_vue_styles_","shadow_control_shadow_control","__r","shadow","isArray","_i","$$a","$$el","$$c","$$i","show-optional-tickbox","path","tag","font_control","lValue","availableOptions","noInherit","dValue","family","isCustom","preset","font_control_vue_styles_","font_control_font_control","custom","option","contrast_ratio","large","contrast","hint","levelVal","aaa","aa","level","ratio","text","hint_18pt","laaa","laa","contrast_ratio_vue_styles_","contrast_ratio_contrast_ratio","export_import","importFailed","exportData","stringified","JSON","stringify","exportObject","btoa","importData","filePicker","parsed","parse","validator","onImport","readAsText","export_import_vue_styles_","export_import_export_import","exportLabel","importLabel","importFailedText","preview_vue_styles_","theme_tab_preview","staticStyle","font-family","_m","v1OnlyNames","theme_tab","theme_tab_objectSpread","availableStyles","theme","themeWarning","tempImportFile","engineVersion","previewShadows","previewColors","previewRadii","previewFonts","shadowsInvalid","colorsInvalid","radiiInvalid","keepColor","keepShadows","keepOpacity","keepRoundness","keepFonts","SLOT_INHERITANCE","OPACITIES","shadowSelected","shadowsLocal","fontsLocal","btnRadiusLocal","inputRadiusLocal","checkboxRadiusLocal","panelRadiusLocal","avatarRadiusLocal","avatarAltRadiusLocal","attachmentRadiusLocal","tooltipRadiusLocal","chatMessageRadiusLocal","self","getThemes","promises","all","k","themes","_ref7","_ref8","themesComplete","loadThemeFromLocalStorage","shadowsAvailable","themeWarningHelp","pre","_this$themeWarning","origin","themeEngineVersion","noActionsPossible","CURRENT_VERSION","selectedVersion","currentColors","_ref9","_ref10","currentOpacity","_ref11","_ref12","currentRadii","btn","checkbox","panel","avatarAlt","tooltip","attachment","chatMessage","preview","composePreset","previewTheme","colors","opacity","radii","shadows","fonts","previewContrast","bg","colorsConverted","_ref13","_ref14","ratios","_ref15","_ref16","slotIsBaseText","textColor","_ref17","layer","variant","opacitySlot","getOpacitySlot","textColors","layers","getLayers","textColorKey","newKey","toUpperCase","getContrastRatioLayers","_ref18","_ref19","toPrecision","warn","previewRules","rules","values","DEFAULT_SHADOWS","sort","currentShadowOverriden","currentShadow","currentShadowFallback","assign","themeValid","exportedTheme","saveEverything","source","_pleroma_theme_version","RangeInput","ContrastRatio","ShadowControl","FontControl","Preview","ExportImport","loadTheme","_ref20","fileVersion","forceUseSource","dismissWarning","version","snapshotEngineVersion","versionsMatch","sourceSnapshotMismatch","forcedSourceLoad","normalizeLocalState","forceLoadLocalStorage","forceLoad","forceSnapshot","confirmLoadSource","_this$$store$getters$","customTheme","customThemeSource","themeData","setCustomTheme","updatePreviewColorsAndShadows","generateColors","generateShadows","mod","forceSource","importValidator","clearAll","clearV1","$data","endsWith","forEach","clearRoundness","clearOpacity","clearShadows","clearFonts","colors2to3","fg","fgColorLocal","rgb2hex","textColorLocal","Set","hex","_ref21","_ref22","Number","isNaN","_ref23","_ref24","shadows2to3","generateRadii","getOwnPropertyNames","generateFonts","fontsInvalid","bgColorLocal","linkColorLocal","cRedColorLocal","cGreenColorLocal","cBlueColorLocal","cOrangeColorLocal","theme_tab_vue_styles_","theme_tab_theme_tab","export-object","export-label","import-label","import-failed-text","on-import","bgOpacityLocal","bgText","link","accentColorLocal","accent","bgLink","fgText","fgTextColorLocal","fgLink","fgLinkColorLocal","bgCRed","bgCBlue","bgCGreen","bgCOrange","postLinkColorLocal","postLink","cGreen","postGreentextColorLocal","postGreentext","alertError","alertErrorColorLocal","alertErrorText","alertErrorTextColorLocal","alertWarning","alertWarningColorLocal","alertWarningText","alertWarningTextColorLocal","alertNeutral","alertNeutralColorLocal","alertNeutralText","alertNeutralTextColorLocal","alert","alertOpacityLocal","badgeNotification","badgeNotificationColorLocal","badgeNotificationText","badgeNotificationTextColorLocal","panelColorLocal","panelOpacityLocal","panelText","panelTextColorLocal","panelLink","panelLinkColorLocal","topBar","topBarColorLocal","topBarText","topBarTextColorLocal","topBarLink","topBarLinkColorLocal","inputColorLocal","inputOpacityLocal","inputText","inputTextColorLocal","btnColorLocal","btnOpacityLocal","btnText","btnTextColorLocal","btnPanelText","btnPanelTextColorLocal","btnTopBarText","btnTopBarTextColorLocal","btnPressed","btnPressedColorLocal","btnPressedText","btnPressedTextColorLocal","btnPressedPanelText","btnPressedPanelTextColorLocal","btnPressedTopBarText","btnPressedTopBarTextColorLocal","btnDisabled","btnDisabledColorLocal","btnDisabledText","btnDisabledTextColorLocal","btnDisabledPanelText","btnDisabledPanelTextColorLocal","btnDisabledTopBarText","btnDisabledTopBarTextColorLocal","btnToggled","btnToggledColorLocal","btnToggledText","btnToggledTextColorLocal","btnToggledPanelText","btnToggledPanelTextColorLocal","btnToggledTopBarText","btnToggledTopBarTextColorLocal","tab","tabColorLocal","tabText","tabTextColorLocal","tabActiveText","tabActiveTextColorLocal","border","borderColorLocal","borderOpacityLocal","faint","faintColorLocal","faintLink","faintLinkColorLocal","panelFaint","panelFaintColorLocal","faintOpacityLocal","underlay","underlayColorLocal","underlayOpacityLocal","poll","pollColorLocal","pollText","pollTextColorLocal","icon","iconColorLocal","highlight","highlightColorLocal","highlightText","highlightTextColorLocal","highlightLink","highlightLinkColorLocal","popover","popoverColorLocal","popoverOpacityLocal","popoverText","popoverTextColorLocal","popoverLink","popoverLinkColorLocal","selectedPost","selectedPostColorLocal","selectedPostText","selectedPostTextColorLocal","selectedPostLink","selectedPostLinkColorLocal","selectedMenu","selectedMenuColorLocal","selectedMenuText","selectedMenuTextColorLocal","selectedMenuLink","selectedMenuLinkColorLocal","chatBgColorLocal","chatMessageIncomingBgColorLocal","chatMessageIncomingTextColorLocal","chatMessageIncomingLinkColorLocal","chatMessageIncomingBorderColorLocal","chatMessageOutgoingBgColorLocal","chatMessageOutgoingTextColorLocal","chatMessageOutgoingLinkColorLocal","chatMessageOutgoingBorderColorLocal","hard-min","interface","no-inherit","post","postCode","SettingsModalContent","MutesAndBlocksTab","ThemeTab","isLoggedIn","settingsModalState","onOpen","targetTab","settingsModalTargetTab","tabIndex","tabSwitcher","findIndex","elm","setTab","settings_modal_content_vue_styles_","settings_modal_content_Component","settings_modal_content","side-tab-bar","data-tab-name","fullHeight","__webpack_exports__"],"mappings":"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","file":"static/js/2.e852a6b4b3bba752b838.js","sourcesContent":["// style-loader: Adds some css to the DOM by adding a \n\n\n\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./color_input.scss\")\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=1!./color_input.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./color_input.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./color_input.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-77e407b6\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./color_input.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"color-input style-control\",class:{ disabled: !_vm.present || _vm.disabled }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.name}},[_vm._v(\"\\n \"+_vm._s(_vm.label)+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined' && _vm.showOptionalTickbox)?_c('Checkbox',{staticClass:\"opt\",attrs:{\"checked\":_vm.present,\"disabled\":_vm.disabled},on:{\"change\":function($event){return _vm.$emit('input', typeof _vm.value === 'undefined' ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"input color-input-field\"},[_c('input',{staticClass:\"textColor unstyled\",attrs:{\"id\":_vm.name + '-t',\"type\":\"text\",\"disabled\":!_vm.present || _vm.disabled},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}}),_vm._v(\" \"),(_vm.validColor)?_c('input',{staticClass:\"nativeColor unstyled\",attrs:{\"id\":_vm.name,\"type\":\"color\",\"disabled\":!_vm.present || _vm.disabled},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}}):_vm._e(),_vm._v(\" \"),(_vm.transparentColor)?_c('div',{staticClass:\"transparentIndicator\"}):_vm._e(),_vm._v(\" \"),(_vm.computedColor)?_c('div',{staticClass:\"computedIndicator\",style:({backgroundColor: _vm.fallback})}):_vm._e()])],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./range_input.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./range_input.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-6a3c1a26\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./range_input.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","\n\n\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"range-control style-control\",class:{ disabled: !_vm.present || _vm.disabled }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.name}},[_vm._v(\"\\n \"+_vm._s(_vm.label)+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('input',{staticClass:\"opt\",attrs:{\"id\":_vm.name + '-o',\"type\":\"checkbox\"},domProps:{\"checked\":_vm.present},on:{\"input\":function($event){return _vm.$emit('input', !_vm.present ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('label',{staticClass:\"opt-l\",attrs:{\"for\":_vm.name + '-o'}}):_vm._e(),_vm._v(\" \"),_c('input',{staticClass:\"input-number\",attrs:{\"id\":_vm.name,\"type\":\"range\",\"disabled\":!_vm.present || _vm.disabled,\"max\":_vm.max || _vm.hardMax || 100,\"min\":_vm.min || _vm.hardMin || 0,\"step\":_vm.step || 1},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}}),_vm._v(\" \"),_c('input',{staticClass:\"input-number\",attrs:{\"id\":_vm.name,\"type\":\"number\",\"disabled\":!_vm.present || _vm.disabled,\"max\":_vm.hardMax,\"min\":_vm.hardMin,\"step\":_vm.step || 1},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}})])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n","/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./opacity_input.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./opacity_input.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3b48fa39\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./opacity_input.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"opacity-control style-control\",class:{ disabled: !_vm.present || _vm.disabled }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.name}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.common.opacity'))+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('Checkbox',{staticClass:\"opt\",attrs:{\"checked\":_vm.present,\"disabled\":_vm.disabled},on:{\"change\":function($event){return _vm.$emit('input', !_vm.present ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),_c('input',{staticClass:\"input-number\",attrs:{\"id\":_vm.name,\"type\":\"number\",\"disabled\":!_vm.present || _vm.disabled,\"max\":\"1\",\"min\":\"0\",\"step\":\".05\"},domProps:{\"value\":_vm.value || _vm.fallback},on:{\"input\":function($event){return _vm.$emit('input', $event.target.value)}}})],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import ColorInput from '../color_input/color_input.vue'\nimport OpacityInput from '../opacity_input/opacity_input.vue'\nimport { getCssShadow } from '../../services/style_setter/style_setter.js'\nimport { hex2rgb } from '../../services/color_convert/color_convert.js'\n\nconst toModel = (object = {}) => ({\n x: 0,\n y: 0,\n blur: 0,\n spread: 0,\n inset: false,\n color: '#000000',\n alpha: 1,\n ...object\n})\n\nexport default {\n // 'Value' and 'Fallback' can be undefined, but if they are\n // initially vue won't detect it when they become something else\n // therefore i'm using \"ready\" which should be passed as true when\n // data becomes available\n props: [\n 'value', 'fallback', 'ready'\n ],\n data () {\n return {\n selectedId: 0,\n // TODO there are some bugs regarding display of array (it's not getting updated when deleting for some reason)\n cValue: (this.value || this.fallback || []).map(toModel)\n }\n },\n components: {\n ColorInput,\n OpacityInput\n },\n methods: {\n add () {\n this.cValue.push(toModel(this.selected))\n this.selectedId = this.cValue.length - 1\n },\n del () {\n this.cValue.splice(this.selectedId, 1)\n this.selectedId = this.cValue.length === 0 ? undefined : Math.max(this.selectedId - 1, 0)\n },\n moveUp () {\n const movable = this.cValue.splice(this.selectedId, 1)[0]\n this.cValue.splice(this.selectedId - 1, 0, movable)\n this.selectedId -= 1\n },\n moveDn () {\n const movable = this.cValue.splice(this.selectedId, 1)[0]\n this.cValue.splice(this.selectedId + 1, 0, movable)\n this.selectedId += 1\n }\n },\n beforeUpdate () {\n this.cValue = this.value || this.fallback\n },\n computed: {\n anyShadows () {\n return this.cValue.length > 0\n },\n anyShadowsFallback () {\n return this.fallback.length > 0\n },\n selected () {\n if (this.ready && this.anyShadows) {\n return this.cValue[this.selectedId]\n } else {\n return toModel({})\n }\n },\n currentFallback () {\n if (this.ready && this.anyShadowsFallback) {\n return this.fallback[this.selectedId]\n } else {\n return toModel({})\n }\n },\n moveUpValid () {\n return this.ready && this.selectedId > 0\n },\n moveDnValid () {\n return this.ready && this.selectedId < this.cValue.length - 1\n },\n present () {\n return this.ready &&\n typeof this.cValue[this.selectedId] !== 'undefined' &&\n !this.usingFallback\n },\n usingFallback () {\n return typeof this.value === 'undefined'\n },\n rgb () {\n return hex2rgb(this.selected.color)\n },\n style () {\n return this.ready ? {\n boxShadow: getCssShadow(this.fallback)\n } : {}\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./shadow_control.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./shadow_control.js\"\nimport __vue_script__ from \"!!babel-loader!./shadow_control.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5c532734\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./shadow_control.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"shadow-control\",class:{ disabled: !_vm.present }},[_c('div',{staticClass:\"shadow-preview-container\"},[_c('div',{staticClass:\"y-shift-control\",attrs:{\"disabled\":!_vm.present}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.y),expression:\"selected.y\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\"},domProps:{\"value\":(_vm.selected.y)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"y\", $event.target.value)}}}),_vm._v(\" \"),_c('div',{staticClass:\"wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.y),expression:\"selected.y\"}],staticClass:\"input-range\",attrs:{\"disabled\":!_vm.present,\"type\":\"range\",\"max\":\"20\",\"min\":\"-20\"},domProps:{\"value\":(_vm.selected.y)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"y\", $event.target.value)}}})])]),_vm._v(\" \"),_c('div',{staticClass:\"preview-window\"},[_c('div',{staticClass:\"preview-block\",style:(_vm.style)})]),_vm._v(\" \"),_c('div',{staticClass:\"x-shift-control\",attrs:{\"disabled\":!_vm.present}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.x),expression:\"selected.x\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\"},domProps:{\"value\":(_vm.selected.x)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"x\", $event.target.value)}}}),_vm._v(\" \"),_c('div',{staticClass:\"wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.x),expression:\"selected.x\"}],staticClass:\"input-range\",attrs:{\"disabled\":!_vm.present,\"type\":\"range\",\"max\":\"20\",\"min\":\"-20\"},domProps:{\"value\":(_vm.selected.x)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"x\", $event.target.value)}}})])])]),_vm._v(\" \"),_c('div',{staticClass:\"shadow-tweak\"},[_c('div',{staticClass:\"id-control style-control\",attrs:{\"disabled\":_vm.usingFallback}},[_c('label',{staticClass:\"select\",attrs:{\"for\":\"shadow-switcher\",\"disabled\":!_vm.ready || _vm.usingFallback}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedId),expression:\"selectedId\"}],staticClass:\"shadow-switcher\",attrs:{\"id\":\"shadow-switcher\",\"disabled\":!_vm.ready || _vm.usingFallback},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.selectedId=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.cValue),function(shadow,index){return _c('option',{key:index,domProps:{\"value\":index}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.shadow_id', { value: index }))+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":!_vm.ready || !_vm.present},on:{\"click\":_vm.del}},[_c('i',{staticClass:\"icon-cancel\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":!_vm.moveUpValid},on:{\"click\":_vm.moveUp}},[_c('i',{staticClass:\"icon-up-open\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":!_vm.moveDnValid},on:{\"click\":_vm.moveDn}},[_c('i',{staticClass:\"icon-down-open\"})]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-default\",attrs:{\"disabled\":_vm.usingFallback},on:{\"click\":_vm.add}},[_c('i',{staticClass:\"icon-plus\"})])]),_vm._v(\" \"),_c('div',{staticClass:\"inset-control style-control\",attrs:{\"disabled\":!_vm.present}},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"inset\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.inset'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.inset),expression:\"selected.inset\"}],staticClass:\"input-inset\",attrs:{\"id\":\"inset\",\"disabled\":!_vm.present,\"name\":\"inset\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.selected.inset)?_vm._i(_vm.selected.inset,null)>-1:(_vm.selected.inset)},on:{\"change\":function($event){var $$a=_vm.selected.inset,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.selected, \"inset\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.selected, \"inset\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.selected, \"inset\", $$c)}}}}),_vm._v(\" \"),_c('label',{staticClass:\"checkbox-label\",attrs:{\"for\":\"inset\"}})]),_vm._v(\" \"),_c('div',{staticClass:\"blur-control style-control\",attrs:{\"disabled\":!_vm.present}},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"spread\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.blur'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.blur),expression:\"selected.blur\"}],staticClass:\"input-range\",attrs:{\"id\":\"blur\",\"disabled\":!_vm.present,\"name\":\"blur\",\"type\":\"range\",\"max\":\"20\",\"min\":\"0\"},domProps:{\"value\":(_vm.selected.blur)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"blur\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.blur),expression:\"selected.blur\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\",\"min\":\"0\"},domProps:{\"value\":(_vm.selected.blur)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"blur\", $event.target.value)}}})]),_vm._v(\" \"),_c('div',{staticClass:\"spread-control style-control\",attrs:{\"disabled\":!_vm.present}},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"spread\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.spread'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.spread),expression:\"selected.spread\"}],staticClass:\"input-range\",attrs:{\"id\":\"spread\",\"disabled\":!_vm.present,\"name\":\"spread\",\"type\":\"range\",\"max\":\"20\",\"min\":\"-20\"},domProps:{\"value\":(_vm.selected.spread)},on:{\"__r\":function($event){return _vm.$set(_vm.selected, \"spread\", $event.target.value)}}}),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected.spread),expression:\"selected.spread\"}],staticClass:\"input-number\",attrs:{\"disabled\":!_vm.present,\"type\":\"number\"},domProps:{\"value\":(_vm.selected.spread)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.selected, \"spread\", $event.target.value)}}})]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"disabled\":!_vm.present,\"label\":_vm.$t('settings.style.common.color'),\"fallback\":_vm.currentFallback.color,\"show-optional-tickbox\":false,\"name\":\"shadow\"},model:{value:(_vm.selected.color),callback:function ($$v) {_vm.$set(_vm.selected, \"color\", $$v)},expression:\"selected.color\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"disabled\":!_vm.present},model:{value:(_vm.selected.alpha),callback:function ($$v) {_vm.$set(_vm.selected, \"alpha\", $$v)},expression:\"selected.alpha\"}}),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.shadows.hintV3\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"--variable,mod\")])])],1)])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import { set } from 'vue'\n\nexport default {\n props: [\n 'name', 'label', 'value', 'fallback', 'options', 'no-inherit'\n ],\n data () {\n return {\n lValue: this.value,\n availableOptions: [\n this.noInherit ? '' : 'inherit',\n 'custom',\n ...(this.options || []),\n 'serif',\n 'monospace',\n 'sans-serif'\n ].filter(_ => _)\n }\n },\n beforeUpdate () {\n this.lValue = this.value\n },\n computed: {\n present () {\n return typeof this.lValue !== 'undefined'\n },\n dValue () {\n return this.lValue || this.fallback || {}\n },\n family: {\n get () {\n return this.dValue.family\n },\n set (v) {\n set(this.lValue, 'family', v)\n this.$emit('input', this.lValue)\n }\n },\n isCustom () {\n return this.preset === 'custom'\n },\n preset: {\n get () {\n if (this.family === 'serif' ||\n this.family === 'sans-serif' ||\n this.family === 'monospace' ||\n this.family === 'inherit') {\n return this.family\n } else {\n return 'custom'\n }\n },\n set (v) {\n this.family = v === 'custom' ? '' : v\n }\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./font_control.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!./font_control.js\"\nimport __vue_script__ from \"!!babel-loader!./font_control.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-0edf8dfc\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./font_control.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"font-control style-control\",class:{ custom: _vm.isCustom }},[_c('label',{staticClass:\"label\",attrs:{\"for\":_vm.preset === 'custom' ? _vm.name : _vm.name + '-font-switcher'}},[_vm._v(\"\\n \"+_vm._s(_vm.label)+\"\\n \")]),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('input',{staticClass:\"opt exlcude-disabled\",attrs:{\"id\":_vm.name + '-o',\"type\":\"checkbox\"},domProps:{\"checked\":_vm.present},on:{\"input\":function($event){return _vm.$emit('input', typeof _vm.value === 'undefined' ? _vm.fallback : undefined)}}}):_vm._e(),_vm._v(\" \"),(typeof _vm.fallback !== 'undefined')?_c('label',{staticClass:\"opt-l\",attrs:{\"for\":_vm.name + '-o'}}):_vm._e(),_vm._v(\" \"),_c('label',{staticClass:\"select\",attrs:{\"for\":_vm.name + '-font-switcher',\"disabled\":!_vm.present}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.preset),expression:\"preset\"}],staticClass:\"font-switcher\",attrs:{\"id\":_vm.name + '-font-switcher',\"disabled\":!_vm.present},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.preset=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.availableOptions),function(option){return _c('option',{key:option,domProps:{\"value\":option}},[_vm._v(\"\\n \"+_vm._s(option === 'custom' ? _vm.$t('settings.style.fonts.custom') : option)+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})]),_vm._v(\" \"),(_vm.isCustom)?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.family),expression:\"family\"}],staticClass:\"custom-font\",attrs:{\"id\":_vm.name,\"type\":\"text\"},domProps:{\"value\":(_vm.family)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.family=$event.target.value}}}):_vm._e()])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n\n\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./contrast_ratio.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./contrast_ratio.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./contrast_ratio.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7974f5b3\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./contrast_ratio.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.contrast)?_c('span',{staticClass:\"contrast-ratio\"},[_c('span',{staticClass:\"rating\",attrs:{\"title\":_vm.hint}},[(_vm.contrast.aaa)?_c('span',[_c('i',{staticClass:\"icon-thumbs-up-alt\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.aaa && _vm.contrast.aa)?_c('span',[_c('i',{staticClass:\"icon-adjust\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.aaa && !_vm.contrast.aa)?_c('span',[_c('i',{staticClass:\"icon-attention\"})]):_vm._e()]),_vm._v(\" \"),(_vm.contrast && _vm.large)?_c('span',{staticClass:\"rating\",attrs:{\"title\":_vm.hint_18pt}},[(_vm.contrast.laaa)?_c('span',[_c('i',{staticClass:\"icon-thumbs-up-alt\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.laaa && _vm.contrast.laa)?_c('span',[_c('i',{staticClass:\"icon-adjust\"})]):_vm._e(),_vm._v(\" \"),(!_vm.contrast.laaa && !_vm.contrast.laa)?_c('span',[_c('i',{staticClass:\"icon-attention\"})]):_vm._e()]):_vm._e()]):_vm._e()}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","\n\n\n\n\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./export_import.vue\")\n}\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./export_import.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./export_import.vue\"\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-3d9b5a74\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./export_import.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"import-export-container\"},[_vm._t(\"before\"),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.exportData}},[_vm._v(\"\\n \"+_vm._s(_vm.exportLabel)+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.importData}},[_vm._v(\"\\n \"+_vm._s(_vm.importLabel)+\"\\n \")]),_vm._v(\" \"),_vm._t(\"afterButtons\"),_vm._v(\" \"),(_vm.importFailed)?_c('p',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.importFailedText)+\"\\n \")]):_vm._e(),_vm._v(\" \"),_vm._t(\"afterError\")],2)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!../../../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./preview.vue\")\n}\n/* script */\nvar __vue_script__ = null\n/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1a88be74\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./preview.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"preview-container\"},[_c('div',{staticClass:\"underlay underlay-preview\"}),_vm._v(\" \"),_c('div',{staticClass:\"panel dummy\"},[_c('div',{staticClass:\"panel-heading\"},[_c('div',{staticClass:\"title\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.header'))+\"\\n \"),_c('span',{staticClass:\"badge badge-notification\"},[_vm._v(\"\\n 99\\n \")])]),_vm._v(\" \"),_c('span',{staticClass:\"faint\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.header_faint'))+\"\\n \")]),_vm._v(\" \"),_c('span',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.error'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.button'))+\"\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"panel-body theme-preview-content\"},[_c('div',{staticClass:\"post\"},[_c('div',{staticClass:\"avatar still-image\"},[_vm._v(\"\\n ( ͡° ͜ʖ ͡°)\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"content\"},[_c('h4',[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.content'))+\"\\n \")]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.preview.text\"}},[_c('code',{staticStyle:{\"font-family\":\"var(--postCodeFont)\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.mono'))+\"\\n \")]),_vm._v(\" \"),_c('a',{staticStyle:{\"color\":\"var(--link)\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.link'))+\"\\n \")])]),_vm._v(\" \"),_vm._m(0)],1)]),_vm._v(\" \"),_c('div',{staticClass:\"after-post\"},[_c('div',{staticClass:\"avatar-alt\"},[_vm._v(\"\\n :^)\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"content\"},[_c('i18n',{staticClass:\"faint\",attrs:{\"path\":\"settings.style.preview.fine_print\",\"tag\":\"span\"}},[_c('a',{staticStyle:{\"color\":\"var(--faintLink)\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.faint_link'))+\"\\n \")])])],1)]),_vm._v(\" \"),_c('div',{staticClass:\"separator\"}),_vm._v(\" \"),_c('span',{staticClass:\"alert error\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.error'))+\"\\n \")]),_vm._v(\" \"),_c('input',{attrs:{\"type\":\"text\"},domProps:{\"value\":_vm.$t('settings.style.preview.input')}}),_vm._v(\" \"),_c('div',{staticClass:\"actions\"},[_c('span',{staticClass:\"checkbox\"},[_c('input',{attrs:{\"id\":\"preview_checkbox\",\"checked\":\"very yes\",\"type\":\"checkbox\"}}),_vm._v(\" \"),_c('label',{attrs:{\"for\":\"preview_checkbox\"}},[_vm._v(_vm._s(_vm.$t('settings.style.preview.checkbox')))])]),_vm._v(\" \"),_c('button',{staticClass:\"btn\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.preview.button'))+\"\\n \")])])])])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"icons\"},[_c('i',{staticClass:\"button-icon icon-reply\",staticStyle:{\"color\":\"var(--cBlue)\"}}),_vm._v(\" \"),_c('i',{staticClass:\"button-icon icon-retweet\",staticStyle:{\"color\":\"var(--cGreen)\"}}),_vm._v(\" \"),_c('i',{staticClass:\"button-icon icon-star\",staticStyle:{\"color\":\"var(--cOrange)\"}}),_vm._v(\" \"),_c('i',{staticClass:\"button-icon icon-cancel\",staticStyle:{\"color\":\"var(--cRed)\"}})])}]\nexport { render, staticRenderFns }","import { set, delete as del } from 'vue'\nimport {\n rgb2hex,\n hex2rgb,\n getContrastRatioLayers\n} from 'src/services/color_convert/color_convert.js'\nimport {\n DEFAULT_SHADOWS,\n generateColors,\n generateShadows,\n generateRadii,\n generateFonts,\n composePreset,\n getThemes,\n shadows2to3,\n colors2to3\n} from 'src/services/style_setter/style_setter.js'\nimport {\n SLOT_INHERITANCE\n} from 'src/services/theme_data/pleromafe.js'\nimport {\n CURRENT_VERSION,\n OPACITIES,\n getLayers,\n getOpacitySlot\n} from 'src/services/theme_data/theme_data.service.js'\nimport ColorInput from 'src/components/color_input/color_input.vue'\nimport RangeInput from 'src/components/range_input/range_input.vue'\nimport OpacityInput from 'src/components/opacity_input/opacity_input.vue'\nimport ShadowControl from 'src/components/shadow_control/shadow_control.vue'\nimport FontControl from 'src/components/font_control/font_control.vue'\nimport ContrastRatio from 'src/components/contrast_ratio/contrast_ratio.vue'\nimport TabSwitcher from 'src/components/tab_switcher/tab_switcher.js'\nimport ExportImport from 'src/components/export_import/export_import.vue'\nimport Checkbox from 'src/components/checkbox/checkbox.vue'\n\nimport Preview from './preview.vue'\n\n// List of color values used in v1\nconst v1OnlyNames = [\n 'bg',\n 'fg',\n 'text',\n 'link',\n 'cRed',\n 'cGreen',\n 'cBlue',\n 'cOrange'\n].map(_ => _ + 'ColorLocal')\n\nconst colorConvert = (color) => {\n if (color.startsWith('--') || color === 'transparent') {\n return color\n } else {\n return hex2rgb(color)\n }\n}\n\nexport default {\n data () {\n return {\n availableStyles: [],\n selected: this.$store.getters.mergedConfig.theme,\n themeWarning: undefined,\n tempImportFile: undefined,\n engineVersion: 0,\n\n previewShadows: {},\n previewColors: {},\n previewRadii: {},\n previewFonts: {},\n\n shadowsInvalid: true,\n colorsInvalid: true,\n radiiInvalid: true,\n\n keepColor: false,\n keepShadows: false,\n keepOpacity: false,\n keepRoundness: false,\n keepFonts: false,\n\n ...Object.keys(SLOT_INHERITANCE)\n .map(key => [key, ''])\n .reduce((acc, [key, val]) => ({ ...acc, [ key + 'ColorLocal' ]: val }), {}),\n\n ...Object.keys(OPACITIES)\n .map(key => [key, ''])\n .reduce((acc, [key, val]) => ({ ...acc, [ key + 'OpacityLocal' ]: val }), {}),\n\n shadowSelected: undefined,\n shadowsLocal: {},\n fontsLocal: {},\n\n btnRadiusLocal: '',\n inputRadiusLocal: '',\n checkboxRadiusLocal: '',\n panelRadiusLocal: '',\n avatarRadiusLocal: '',\n avatarAltRadiusLocal: '',\n attachmentRadiusLocal: '',\n tooltipRadiusLocal: '',\n chatMessageRadiusLocal: ''\n }\n },\n created () {\n const self = this\n\n getThemes()\n .then((promises) => {\n return Promise.all(\n Object.entries(promises)\n .map(([k, v]) => v.then(res => [k, res]))\n )\n })\n .then(themes => themes.reduce((acc, [k, v]) => {\n if (v) {\n return {\n ...acc,\n [k]: v\n }\n } else {\n return acc\n }\n }, {}))\n .then((themesComplete) => {\n self.availableStyles = themesComplete\n })\n },\n mounted () {\n this.loadThemeFromLocalStorage()\n if (typeof this.shadowSelected === 'undefined') {\n this.shadowSelected = this.shadowsAvailable[0]\n }\n },\n computed: {\n themeWarningHelp () {\n if (!this.themeWarning) return\n const t = this.$t\n const pre = 'settings.style.switcher.help.'\n const {\n origin,\n themeEngineVersion,\n type,\n noActionsPossible\n } = this.themeWarning\n if (origin === 'file') {\n // Loaded v2 theme from file\n if (themeEngineVersion === 2 && type === 'wrong_version') {\n return t(pre + 'v2_imported')\n }\n if (themeEngineVersion > CURRENT_VERSION) {\n return t(pre + 'future_version_imported') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'snapshot_missing')\n : t(pre + 'snapshot_present')\n )\n }\n if (themeEngineVersion < CURRENT_VERSION) {\n return t(pre + 'future_version_imported') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'snapshot_missing')\n : t(pre + 'snapshot_present')\n )\n }\n } else if (origin === 'localStorage') {\n if (type === 'snapshot_source_mismatch') {\n return t(pre + 'snapshot_source_mismatch')\n }\n // FE upgraded from v2\n if (themeEngineVersion === 2) {\n return t(pre + 'upgraded_from_v2')\n }\n // Admin downgraded FE\n if (themeEngineVersion > CURRENT_VERSION) {\n return t(pre + 'fe_downgraded') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'migration_snapshot_ok')\n : t(pre + 'migration_snapshot_gone')\n )\n }\n // Admin upgraded FE\n if (themeEngineVersion < CURRENT_VERSION) {\n return t(pre + 'fe_upgraded') + ' ' +\n (\n noActionsPossible\n ? t(pre + 'migration_snapshot_ok')\n : t(pre + 'migration_snapshot_gone')\n )\n }\n }\n },\n selectedVersion () {\n return Array.isArray(this.selected) ? 1 : 2\n },\n currentColors () {\n return Object.keys(SLOT_INHERITANCE)\n .map(key => [key, this[key + 'ColorLocal']])\n .reduce((acc, [key, val]) => ({ ...acc, [ key ]: val }), {})\n },\n currentOpacity () {\n return Object.keys(OPACITIES)\n .map(key => [key, this[key + 'OpacityLocal']])\n .reduce((acc, [key, val]) => ({ ...acc, [ key ]: val }), {})\n },\n currentRadii () {\n return {\n btn: this.btnRadiusLocal,\n input: this.inputRadiusLocal,\n checkbox: this.checkboxRadiusLocal,\n panel: this.panelRadiusLocal,\n avatar: this.avatarRadiusLocal,\n avatarAlt: this.avatarAltRadiusLocal,\n tooltip: this.tooltipRadiusLocal,\n attachment: this.attachmentRadiusLocal,\n chatMessage: this.chatMessageRadiusLocal\n }\n },\n preview () {\n return composePreset(this.previewColors, this.previewRadii, this.previewShadows, this.previewFonts)\n },\n previewTheme () {\n if (!this.preview.theme.colors) return { colors: {}, opacity: {}, radii: {}, shadows: {}, fonts: {} }\n return this.preview.theme\n },\n // This needs optimization maybe\n previewContrast () {\n try {\n if (!this.previewTheme.colors.bg) return {}\n const colors = this.previewTheme.colors\n const opacity = this.previewTheme.opacity\n if (!colors.bg) return {}\n const hints = (ratio) => ({\n text: ratio.toPrecision(3) + ':1',\n // AA level, AAA level\n aa: ratio >= 4.5,\n aaa: ratio >= 7,\n // same but for 18pt+ texts\n laa: ratio >= 3,\n laaa: ratio >= 4.5\n })\n const colorsConverted = Object.entries(colors).reduce((acc, [key, value]) => ({ ...acc, [key]: colorConvert(value) }), {})\n\n const ratios = Object.entries(SLOT_INHERITANCE).reduce((acc, [key, value]) => {\n const slotIsBaseText = key === 'text' || key === 'link'\n const slotIsText = slotIsBaseText || (\n typeof value === 'object' && value !== null && value.textColor\n )\n if (!slotIsText) return acc\n const { layer, variant } = slotIsBaseText ? { layer: 'bg' } : value\n const background = variant || layer\n const opacitySlot = getOpacitySlot(background)\n const textColors = [\n key,\n ...(background === 'bg' ? ['cRed', 'cGreen', 'cBlue', 'cOrange'] : [])\n ]\n\n const layers = getLayers(\n layer,\n variant || layer,\n opacitySlot,\n colorsConverted,\n opacity\n )\n\n return {\n ...acc,\n ...textColors.reduce((acc, textColorKey) => {\n const newKey = slotIsBaseText\n ? 'bg' + textColorKey[0].toUpperCase() + textColorKey.slice(1)\n : textColorKey\n return {\n ...acc,\n [newKey]: getContrastRatioLayers(\n colorsConverted[textColorKey],\n layers,\n colorsConverted[textColorKey]\n )\n }\n }, {})\n }\n }, {})\n\n return Object.entries(ratios).reduce((acc, [k, v]) => { acc[k] = hints(v); return acc }, {})\n } catch (e) {\n console.warn('Failure computing contrasts', e)\n }\n },\n previewRules () {\n if (!this.preview.rules) return ''\n return [\n ...Object.values(this.preview.rules),\n 'color: var(--text)',\n 'font-family: var(--interfaceFont, sans-serif)'\n ].join(';')\n },\n shadowsAvailable () {\n return Object.keys(DEFAULT_SHADOWS).sort()\n },\n currentShadowOverriden: {\n get () {\n return !!this.currentShadow\n },\n set (val) {\n if (val) {\n set(this.shadowsLocal, this.shadowSelected, this.currentShadowFallback.map(_ => Object.assign({}, _)))\n } else {\n del(this.shadowsLocal, this.shadowSelected)\n }\n }\n },\n currentShadowFallback () {\n return (this.previewTheme.shadows || {})[this.shadowSelected]\n },\n currentShadow: {\n get () {\n return this.shadowsLocal[this.shadowSelected]\n },\n set (v) {\n set(this.shadowsLocal, this.shadowSelected, v)\n }\n },\n themeValid () {\n return !this.shadowsInvalid && !this.colorsInvalid && !this.radiiInvalid\n },\n exportedTheme () {\n const saveEverything = (\n !this.keepFonts &&\n !this.keepShadows &&\n !this.keepOpacity &&\n !this.keepRoundness &&\n !this.keepColor\n )\n\n const source = {\n themeEngineVersion: CURRENT_VERSION\n }\n\n if (this.keepFonts || saveEverything) {\n source.fonts = this.fontsLocal\n }\n if (this.keepShadows || saveEverything) {\n source.shadows = this.shadowsLocal\n }\n if (this.keepOpacity || saveEverything) {\n source.opacity = this.currentOpacity\n }\n if (this.keepColor || saveEverything) {\n source.colors = this.currentColors\n }\n if (this.keepRoundness || saveEverything) {\n source.radii = this.currentRadii\n }\n\n const theme = {\n themeEngineVersion: CURRENT_VERSION,\n ...this.previewTheme\n }\n\n return {\n // To separate from other random JSON files and possible future source formats\n _pleroma_theme_version: 2, theme, source\n }\n }\n },\n components: {\n ColorInput,\n OpacityInput,\n RangeInput,\n ContrastRatio,\n ShadowControl,\n FontControl,\n TabSwitcher,\n Preview,\n ExportImport,\n Checkbox\n },\n methods: {\n loadTheme (\n {\n theme,\n source,\n _pleroma_theme_version: fileVersion\n },\n origin,\n forceUseSource = false\n ) {\n this.dismissWarning()\n if (!source && !theme) {\n throw new Error('Can\\'t load theme: empty')\n }\n const version = (origin === 'localStorage' && !theme.colors)\n ? 'l1'\n : fileVersion\n const snapshotEngineVersion = (theme || {}).themeEngineVersion\n const themeEngineVersion = (source || {}).themeEngineVersion || 2\n const versionsMatch = themeEngineVersion === CURRENT_VERSION\n const sourceSnapshotMismatch = (\n theme !== undefined &&\n source !== undefined &&\n themeEngineVersion !== snapshotEngineVersion\n )\n // Force loading of source if user requested it or if snapshot\n // is unavailable\n const forcedSourceLoad = (source && forceUseSource) || !theme\n if (!(versionsMatch && !sourceSnapshotMismatch) &&\n !forcedSourceLoad &&\n version !== 'l1' &&\n origin !== 'defaults'\n ) {\n if (sourceSnapshotMismatch && origin === 'localStorage') {\n this.themeWarning = {\n origin,\n themeEngineVersion,\n type: 'snapshot_source_mismatch'\n }\n } else if (!theme) {\n this.themeWarning = {\n origin,\n noActionsPossible: true,\n themeEngineVersion,\n type: 'no_snapshot_old_version'\n }\n } else if (!versionsMatch) {\n this.themeWarning = {\n origin,\n noActionsPossible: !source,\n themeEngineVersion,\n type: 'wrong_version'\n }\n }\n }\n this.normalizeLocalState(theme, version, source, forcedSourceLoad)\n },\n forceLoadLocalStorage () {\n this.loadThemeFromLocalStorage(true)\n },\n dismissWarning () {\n this.themeWarning = undefined\n this.tempImportFile = undefined\n },\n forceLoad () {\n const { origin } = this.themeWarning\n switch (origin) {\n case 'localStorage':\n this.loadThemeFromLocalStorage(true)\n break\n case 'file':\n this.onImport(this.tempImportFile, true)\n break\n }\n this.dismissWarning()\n },\n forceSnapshot () {\n const { origin } = this.themeWarning\n switch (origin) {\n case 'localStorage':\n this.loadThemeFromLocalStorage(false, true)\n break\n case 'file':\n console.err('Forcing snapshout from file is not supported yet')\n break\n }\n this.dismissWarning()\n },\n loadThemeFromLocalStorage (confirmLoadSource = false, forceSnapshot = false) {\n const {\n customTheme: theme,\n customThemeSource: source\n } = this.$store.getters.mergedConfig\n if (!theme && !source) {\n // Anon user or never touched themes\n this.loadTheme(\n this.$store.state.instance.themeData,\n 'defaults',\n confirmLoadSource\n )\n } else {\n this.loadTheme(\n {\n theme,\n source: forceSnapshot ? theme : source\n },\n 'localStorage',\n confirmLoadSource\n )\n }\n },\n setCustomTheme () {\n this.$store.dispatch('setOption', {\n name: 'customTheme',\n value: {\n themeEngineVersion: CURRENT_VERSION,\n ...this.previewTheme\n }\n })\n this.$store.dispatch('setOption', {\n name: 'customThemeSource',\n value: {\n themeEngineVersion: CURRENT_VERSION,\n shadows: this.shadowsLocal,\n fonts: this.fontsLocal,\n opacity: this.currentOpacity,\n colors: this.currentColors,\n radii: this.currentRadii\n }\n })\n },\n updatePreviewColorsAndShadows () {\n this.previewColors = generateColors({\n opacity: this.currentOpacity,\n colors: this.currentColors\n })\n this.previewShadows = generateShadows(\n { shadows: this.shadowsLocal, opacity: this.previewTheme.opacity, themeEngineVersion: this.engineVersion },\n this.previewColors.theme.colors,\n this.previewColors.mod\n )\n },\n onImport (parsed, forceSource = false) {\n this.tempImportFile = parsed\n this.loadTheme(parsed, 'file', forceSource)\n },\n importValidator (parsed) {\n const version = parsed._pleroma_theme_version\n return version >= 1 || version <= 2\n },\n clearAll () {\n this.loadThemeFromLocalStorage()\n },\n\n // Clears all the extra stuff when loading V1 theme\n clearV1 () {\n Object.keys(this.$data)\n .filter(_ => _.endsWith('ColorLocal') || _.endsWith('OpacityLocal'))\n .filter(_ => !v1OnlyNames.includes(_))\n .forEach(key => {\n set(this.$data, key, undefined)\n })\n },\n\n clearRoundness () {\n Object.keys(this.$data)\n .filter(_ => _.endsWith('RadiusLocal'))\n .forEach(key => {\n set(this.$data, key, undefined)\n })\n },\n\n clearOpacity () {\n Object.keys(this.$data)\n .filter(_ => _.endsWith('OpacityLocal'))\n .forEach(key => {\n set(this.$data, key, undefined)\n })\n },\n\n clearShadows () {\n this.shadowsLocal = {}\n },\n\n clearFonts () {\n this.fontsLocal = {}\n },\n\n /**\n * This applies stored theme data onto form. Supports three versions of data:\n * v3 (version >= 3) - newest version of themes which supports snapshots for better compatiblity\n * v2 (version = 2) - newer version of themes.\n * v1 (version = 1) - older version of themes (import from file)\n * v1l (version = l1) - older version of theme (load from local storage)\n * v1 and v1l differ because of way themes were stored/exported.\n * @param {Object} theme - theme data (snapshot)\n * @param {Number} version - version of data. 0 means try to guess based on data. \"l1\" means v1, locastorage type\n * @param {Object} source - theme source - this will be used if compatible\n * @param {Boolean} source - by default source won't be used if version doesn't match since it might render differently\n * this allows importing source anyway\n */\n normalizeLocalState (theme, version = 0, source, forceSource = false) {\n let input\n if (typeof source !== 'undefined') {\n if (forceSource || source.themeEngineVersion === CURRENT_VERSION) {\n input = source\n version = source.themeEngineVersion\n } else {\n input = theme\n }\n } else {\n input = theme\n }\n\n const radii = input.radii || input\n const opacity = input.opacity\n const shadows = input.shadows || {}\n const fonts = input.fonts || {}\n const colors = !input.themeEngineVersion\n ? colors2to3(input.colors || input)\n : input.colors || input\n\n if (version === 0) {\n if (input.version) version = input.version\n // Old v1 naming: fg is text, btn is foreground\n if (typeof colors.text === 'undefined' && typeof colors.fg !== 'undefined') {\n version = 1\n }\n // New v2 naming: text is text, fg is foreground\n if (typeof colors.text !== 'undefined' && typeof colors.fg !== 'undefined') {\n version = 2\n }\n }\n\n this.engineVersion = version\n\n // Stuff that differs between V1 and V2\n if (version === 1) {\n this.fgColorLocal = rgb2hex(colors.btn)\n this.textColorLocal = rgb2hex(colors.fg)\n }\n\n if (!this.keepColor) {\n this.clearV1()\n const keys = new Set(version !== 1 ? Object.keys(SLOT_INHERITANCE) : [])\n if (version === 1 || version === 'l1') {\n keys\n .add('bg')\n .add('link')\n .add('cRed')\n .add('cBlue')\n .add('cGreen')\n .add('cOrange')\n }\n\n keys.forEach(key => {\n const color = colors[key]\n const hex = rgb2hex(colors[key])\n this[key + 'ColorLocal'] = hex === '#aN' ? color : hex\n })\n }\n\n if (opacity && !this.keepOpacity) {\n this.clearOpacity()\n Object.entries(opacity).forEach(([k, v]) => {\n if (typeof v === 'undefined' || v === null || Number.isNaN(v)) return\n this[k + 'OpacityLocal'] = v\n })\n }\n\n if (!this.keepRoundness) {\n this.clearRoundness()\n Object.entries(radii).forEach(([k, v]) => {\n // 'Radius' is kept mostly for v1->v2 localstorage transition\n const key = k.endsWith('Radius') ? k.split('Radius')[0] : k\n this[key + 'RadiusLocal'] = v\n })\n }\n\n if (!this.keepShadows) {\n this.clearShadows()\n if (version === 2) {\n this.shadowsLocal = shadows2to3(shadows, this.previewTheme.opacity)\n } else {\n this.shadowsLocal = shadows\n }\n this.shadowSelected = this.shadowsAvailable[0]\n }\n\n if (!this.keepFonts) {\n this.clearFonts()\n this.fontsLocal = fonts\n }\n }\n },\n watch: {\n currentRadii () {\n try {\n this.previewRadii = generateRadii({ radii: this.currentRadii })\n this.radiiInvalid = false\n } catch (e) {\n this.radiiInvalid = true\n console.warn(e)\n }\n },\n shadowsLocal: {\n handler () {\n if (Object.getOwnPropertyNames(this.previewColors).length === 1) return\n try {\n this.updatePreviewColorsAndShadows()\n this.shadowsInvalid = false\n } catch (e) {\n this.shadowsInvalid = true\n console.warn(e)\n }\n },\n deep: true\n },\n fontsLocal: {\n handler () {\n try {\n this.previewFonts = generateFonts({ fonts: this.fontsLocal })\n this.fontsInvalid = false\n } catch (e) {\n this.fontsInvalid = true\n console.warn(e)\n }\n },\n deep: true\n },\n currentColors () {\n try {\n this.updatePreviewColorsAndShadows()\n this.colorsInvalid = false\n this.shadowsInvalid = false\n } catch (e) {\n this.colorsInvalid = true\n this.shadowsInvalid = true\n console.warn(e)\n }\n },\n currentOpacity () {\n try {\n this.updatePreviewColorsAndShadows()\n } catch (e) {\n console.warn(e)\n }\n },\n selected () {\n this.dismissWarning()\n if (this.selectedVersion === 1) {\n if (!this.keepRoundness) {\n this.clearRoundness()\n }\n\n if (!this.keepShadows) {\n this.clearShadows()\n }\n\n if (!this.keepOpacity) {\n this.clearOpacity()\n }\n\n if (!this.keepColor) {\n this.clearV1()\n\n this.bgColorLocal = this.selected[1]\n this.fgColorLocal = this.selected[2]\n this.textColorLocal = this.selected[3]\n this.linkColorLocal = this.selected[4]\n this.cRedColorLocal = this.selected[5]\n this.cGreenColorLocal = this.selected[6]\n this.cBlueColorLocal = this.selected[7]\n this.cOrangeColorLocal = this.selected[8]\n }\n } else if (this.selectedVersion >= 2) {\n this.normalizeLocalState(this.selected.theme, 2, this.selected.source)\n }\n }\n }\n}\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./theme_tab.scss\")\n}\n/* script */\nexport * from \"!!babel-loader!./theme_tab.js\"\nimport __vue_script__ from \"!!babel-loader!./theme_tab.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-03c6cfba\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../../../node_modules/vue-loader/lib/selector?type=template&index=0!./theme_tab.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"theme-tab\"},[_c('div',{staticClass:\"presets-container\"},[_c('div',{staticClass:\"save-load\"},[(_vm.themeWarning)?_c('div',{staticClass:\"theme-warning\"},[_c('div',{staticClass:\"alert warning\"},[_vm._v(\"\\n \"+_vm._s(_vm.themeWarningHelp)+\"\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"buttons\"},[(_vm.themeWarning.type === 'snapshot_source_mismatch')?[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.forceLoad}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.use_source'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.forceSnapshot}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.use_snapshot'))+\"\\n \")])]:(_vm.themeWarning.noActionsPossible)?[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.dismissWarning}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.dismiss'))+\"\\n \")])]:[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.forceLoad}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.load_theme'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.dismissWarning}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_as_is'))+\"\\n \")])]],2)]):_vm._e(),_vm._v(\" \"),_c('ExportImport',{attrs:{\"export-object\":_vm.exportedTheme,\"export-label\":_vm.$t(\"settings.export_theme\"),\"import-label\":_vm.$t(\"settings.import_theme\"),\"import-failed-text\":_vm.$t(\"settings.invalid_theme_imported\"),\"on-import\":_vm.onImport,\"validator\":_vm.importValidator}},[_c('template',{slot:\"before\"},[_c('div',{staticClass:\"presets\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.presets'))+\"\\n \"),_c('label',{staticClass:\"select\",attrs:{\"for\":\"preset-switcher\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selected),expression:\"selected\"}],staticClass:\"preset-switcher\",attrs:{\"id\":\"preset-switcher\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.selected=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.availableStyles),function(style){return _c('option',{key:style.name,style:({\n backgroundColor: style[1] || (style.theme || style.source).colors.bg,\n color: style[3] || (style.theme || style.source).colors.text\n }),domProps:{\"value\":style}},[_vm._v(\"\\n \"+_vm._s(style[0] || style.name)+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])])])],2)],1),_vm._v(\" \"),_c('div',{staticClass:\"save-load-options\"},[_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepColor),callback:function ($$v) {_vm.keepColor=$$v},expression:\"keepColor\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_color'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepShadows),callback:function ($$v) {_vm.keepShadows=$$v},expression:\"keepShadows\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_shadows'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepOpacity),callback:function ($$v) {_vm.keepOpacity=$$v},expression:\"keepOpacity\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_opacity'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepRoundness),callback:function ($$v) {_vm.keepRoundness=$$v},expression:\"keepRoundness\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_roundness'))+\"\\n \")])],1),_vm._v(\" \"),_c('span',{staticClass:\"keep-option\"},[_c('Checkbox',{model:{value:(_vm.keepFonts),callback:function ($$v) {_vm.keepFonts=$$v},expression:\"keepFonts\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.keep_fonts'))+\"\\n \")])],1),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.switcher.save_load_hint')))])])]),_vm._v(\" \"),_c('preview',{style:(_vm.previewRules)}),_vm._v(\" \"),_c('keep-alive',[_c('tab-switcher',{key:\"style-tweak\"},[_c('div',{staticClass:\"color-container\",attrs:{\"label\":_vm.$t('settings.style.common_colors._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help')))]),_vm._v(\" \"),_c('div',{staticClass:\"tab-header-buttons\"},[_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearOpacity}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_opacity'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearV1}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])])]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help_v2_1')))]),_vm._v(\" \"),_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.common_colors.main')))]),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"bgColor\",\"label\":_vm.$t('settings.background')},model:{value:(_vm.bgColorLocal),callback:function ($$v) {_vm.bgColorLocal=$$v},expression:\"bgColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"bgOpacity\",\"fallback\":_vm.previewTheme.opacity.bg},model:{value:(_vm.bgOpacityLocal),callback:function ($$v) {_vm.bgOpacityLocal=$$v},expression:\"bgOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"textColor\",\"label\":_vm.$t('settings.text')},model:{value:(_vm.textColorLocal),callback:function ($$v) {_vm.textColorLocal=$$v},expression:\"textColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"accentColor\",\"fallback\":_vm.previewTheme.colors.link,\"label\":_vm.$t('settings.accent'),\"show-optional-tickbox\":typeof _vm.linkColorLocal !== 'undefined'},model:{value:(_vm.accentColorLocal),callback:function ($$v) {_vm.accentColorLocal=$$v},expression:\"accentColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"linkColor\",\"fallback\":_vm.previewTheme.colors.accent,\"label\":_vm.$t('settings.links'),\"show-optional-tickbox\":typeof _vm.accentColorLocal !== 'undefined'},model:{value:(_vm.linkColorLocal),callback:function ($$v) {_vm.linkColorLocal=$$v},expression:\"linkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"fgColor\",\"label\":_vm.$t('settings.foreground')},model:{value:(_vm.fgColorLocal),callback:function ($$v) {_vm.fgColorLocal=$$v},expression:\"fgColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"fgTextColor\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.fgText},model:{value:(_vm.fgTextColorLocal),callback:function ($$v) {_vm.fgTextColorLocal=$$v},expression:\"fgTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"fgLinkColor\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.fgLink},model:{value:(_vm.fgLinkColorLocal),callback:function ($$v) {_vm.fgLinkColorLocal=$$v},expression:\"fgLinkColorLocal\"}}),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.common_colors.foreground_hint')))])],1),_vm._v(\" \"),_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.common_colors.rgbo')))]),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"cRedColor\",\"label\":_vm.$t('settings.cRed')},model:{value:(_vm.cRedColorLocal),callback:function ($$v) {_vm.cRedColorLocal=$$v},expression:\"cRedColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCRed}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"cBlueColor\",\"label\":_vm.$t('settings.cBlue')},model:{value:(_vm.cBlueColorLocal),callback:function ($$v) {_vm.cBlueColorLocal=$$v},expression:\"cBlueColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCBlue}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('ColorInput',{attrs:{\"name\":\"cGreenColor\",\"label\":_vm.$t('settings.cGreen')},model:{value:(_vm.cGreenColorLocal),callback:function ($$v) {_vm.cGreenColorLocal=$$v},expression:\"cGreenColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCGreen}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"cOrangeColor\",\"label\":_vm.$t('settings.cOrange')},model:{value:(_vm.cOrangeColorLocal),callback:function ($$v) {_vm.cOrangeColorLocal=$$v},expression:\"cOrangeColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.bgCOrange}})],1),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help_v2_2')))])]),_vm._v(\" \"),_c('div',{staticClass:\"color-container\",attrs:{\"label\":_vm.$t('settings.style.advanced_colors._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.theme_help')))]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearOpacity}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_opacity'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearV1}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.post')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"postLinkColor\",\"fallback\":_vm.previewTheme.colors.accent,\"label\":_vm.$t('settings.links')},model:{value:(_vm.postLinkColorLocal),callback:function ($$v) {_vm.postLinkColorLocal=$$v},expression:\"postLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.postLink}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"postGreentextColor\",\"fallback\":_vm.previewTheme.colors.cGreen,\"label\":_vm.$t('settings.greentext')},model:{value:(_vm.postGreentextColorLocal),callback:function ($$v) {_vm.postGreentextColorLocal=$$v},expression:\"postGreentextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.postGreentext}}),_vm._v(\" \"),_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.alert')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertError\",\"label\":_vm.$t('settings.style.advanced_colors.alert_error'),\"fallback\":_vm.previewTheme.colors.alertError},model:{value:(_vm.alertErrorColorLocal),callback:function ($$v) {_vm.alertErrorColorLocal=$$v},expression:\"alertErrorColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertErrorText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.alertErrorText},model:{value:(_vm.alertErrorTextColorLocal),callback:function ($$v) {_vm.alertErrorTextColorLocal=$$v},expression:\"alertErrorTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.alertErrorText,\"large\":\"\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertWarning\",\"label\":_vm.$t('settings.style.advanced_colors.alert_warning'),\"fallback\":_vm.previewTheme.colors.alertWarning},model:{value:(_vm.alertWarningColorLocal),callback:function ($$v) {_vm.alertWarningColorLocal=$$v},expression:\"alertWarningColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertWarningText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.alertWarningText},model:{value:(_vm.alertWarningTextColorLocal),callback:function ($$v) {_vm.alertWarningTextColorLocal=$$v},expression:\"alertWarningTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.alertWarningText,\"large\":\"\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertNeutral\",\"label\":_vm.$t('settings.style.advanced_colors.alert_neutral'),\"fallback\":_vm.previewTheme.colors.alertNeutral},model:{value:(_vm.alertNeutralColorLocal),callback:function ($$v) {_vm.alertNeutralColorLocal=$$v},expression:\"alertNeutralColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"alertNeutralText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.alertNeutralText},model:{value:(_vm.alertNeutralTextColorLocal),callback:function ($$v) {_vm.alertNeutralTextColorLocal=$$v},expression:\"alertNeutralTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.alertNeutralText,\"large\":\"\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"alertOpacity\",\"fallback\":_vm.previewTheme.opacity.alert},model:{value:(_vm.alertOpacityLocal),callback:function ($$v) {_vm.alertOpacityLocal=$$v},expression:\"alertOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.badge')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"badgeNotification\",\"label\":_vm.$t('settings.style.advanced_colors.badge_notification'),\"fallback\":_vm.previewTheme.colors.badgeNotification},model:{value:(_vm.badgeNotificationColorLocal),callback:function ($$v) {_vm.badgeNotificationColorLocal=$$v},expression:\"badgeNotificationColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"badgeNotificationText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.badgeNotificationText},model:{value:(_vm.badgeNotificationTextColorLocal),callback:function ($$v) {_vm.badgeNotificationTextColorLocal=$$v},expression:\"badgeNotificationTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.badgeNotificationText,\"large\":\"\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.panel_header')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelColor\",\"fallback\":_vm.previewTheme.colors.panel,\"label\":_vm.$t('settings.background')},model:{value:(_vm.panelColorLocal),callback:function ($$v) {_vm.panelColorLocal=$$v},expression:\"panelColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"panelOpacity\",\"fallback\":_vm.previewTheme.opacity.panel,\"disabled\":_vm.panelColorLocal === 'transparent'},model:{value:(_vm.panelOpacityLocal),callback:function ($$v) {_vm.panelOpacityLocal=$$v},expression:\"panelOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelTextColor\",\"fallback\":_vm.previewTheme.colors.panelText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.panelTextColorLocal),callback:function ($$v) {_vm.panelTextColorLocal=$$v},expression:\"panelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.panelText,\"large\":\"\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelLinkColor\",\"fallback\":_vm.previewTheme.colors.panelLink,\"label\":_vm.$t('settings.links')},model:{value:(_vm.panelLinkColorLocal),callback:function ($$v) {_vm.panelLinkColorLocal=$$v},expression:\"panelLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.panelLink,\"large\":\"\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.top_bar')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"topBarColor\",\"fallback\":_vm.previewTheme.colors.topBar,\"label\":_vm.$t('settings.background')},model:{value:(_vm.topBarColorLocal),callback:function ($$v) {_vm.topBarColorLocal=$$v},expression:\"topBarColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"topBarTextColor\",\"fallback\":_vm.previewTheme.colors.topBarText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.topBarTextColorLocal),callback:function ($$v) {_vm.topBarTextColorLocal=$$v},expression:\"topBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.topBarText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"topBarLinkColor\",\"fallback\":_vm.previewTheme.colors.topBarLink,\"label\":_vm.$t('settings.links')},model:{value:(_vm.topBarLinkColorLocal),callback:function ($$v) {_vm.topBarLinkColorLocal=$$v},expression:\"topBarLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.topBarLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.inputs')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"inputColor\",\"fallback\":_vm.previewTheme.colors.input,\"label\":_vm.$t('settings.background')},model:{value:(_vm.inputColorLocal),callback:function ($$v) {_vm.inputColorLocal=$$v},expression:\"inputColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"inputOpacity\",\"fallback\":_vm.previewTheme.opacity.input,\"disabled\":_vm.inputColorLocal === 'transparent'},model:{value:(_vm.inputOpacityLocal),callback:function ($$v) {_vm.inputOpacityLocal=$$v},expression:\"inputOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"inputTextColor\",\"fallback\":_vm.previewTheme.colors.inputText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.inputTextColorLocal),callback:function ($$v) {_vm.inputTextColorLocal=$$v},expression:\"inputTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.inputText}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.buttons')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnColor\",\"fallback\":_vm.previewTheme.colors.btn,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnColorLocal),callback:function ($$v) {_vm.btnColorLocal=$$v},expression:\"btnColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"btnOpacity\",\"fallback\":_vm.previewTheme.opacity.btn,\"disabled\":_vm.btnColorLocal === 'transparent'},model:{value:(_vm.btnOpacityLocal),callback:function ($$v) {_vm.btnOpacityLocal=$$v},expression:\"btnOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnTextColor\",\"fallback\":_vm.previewTheme.colors.btnText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnTextColorLocal),callback:function ($$v) {_vm.btnTextColorLocal=$$v},expression:\"btnTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnPanelTextColorLocal),callback:function ($$v) {_vm.btnPanelTextColorLocal=$$v},expression:\"btnPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPanelText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnTopBarTextColorLocal),callback:function ($$v) {_vm.btnTopBarTextColorLocal=$$v},expression:\"btnTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnTopBarText}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.pressed')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedColor\",\"fallback\":_vm.previewTheme.colors.btnPressed,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnPressedColorLocal),callback:function ($$v) {_vm.btnPressedColorLocal=$$v},expression:\"btnPressedColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedTextColor\",\"fallback\":_vm.previewTheme.colors.btnPressedText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnPressedTextColorLocal),callback:function ($$v) {_vm.btnPressedTextColorLocal=$$v},expression:\"btnPressedTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPressedText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnPressedPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnPressedPanelTextColorLocal),callback:function ($$v) {_vm.btnPressedPanelTextColorLocal=$$v},expression:\"btnPressedPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPressedPanelText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnPressedTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnPressedTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnPressedTopBarTextColorLocal),callback:function ($$v) {_vm.btnPressedTopBarTextColorLocal=$$v},expression:\"btnPressedTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnPressedTopBarText}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.disabled')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledColor\",\"fallback\":_vm.previewTheme.colors.btnDisabled,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnDisabledColorLocal),callback:function ($$v) {_vm.btnDisabledColorLocal=$$v},expression:\"btnDisabledColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledTextColor\",\"fallback\":_vm.previewTheme.colors.btnDisabledText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnDisabledTextColorLocal),callback:function ($$v) {_vm.btnDisabledTextColorLocal=$$v},expression:\"btnDisabledTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnDisabledPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnDisabledPanelTextColorLocal),callback:function ($$v) {_vm.btnDisabledPanelTextColorLocal=$$v},expression:\"btnDisabledPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnDisabledTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnDisabledTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnDisabledTopBarTextColorLocal),callback:function ($$v) {_vm.btnDisabledTopBarTextColorLocal=$$v},expression:\"btnDisabledTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.toggled')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledColor\",\"fallback\":_vm.previewTheme.colors.btnToggled,\"label\":_vm.$t('settings.background')},model:{value:(_vm.btnToggledColorLocal),callback:function ($$v) {_vm.btnToggledColorLocal=$$v},expression:\"btnToggledColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledTextColor\",\"fallback\":_vm.previewTheme.colors.btnToggledText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.btnToggledTextColorLocal),callback:function ($$v) {_vm.btnToggledTextColorLocal=$$v},expression:\"btnToggledTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnToggledText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledPanelTextColor\",\"fallback\":_vm.previewTheme.colors.btnToggledPanelText,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.btnToggledPanelTextColorLocal),callback:function ($$v) {_vm.btnToggledPanelTextColorLocal=$$v},expression:\"btnToggledPanelTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnToggledPanelText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"btnToggledTopBarTextColor\",\"fallback\":_vm.previewTheme.colors.btnToggledTopBarText,\"label\":_vm.$t('settings.style.advanced_colors.top_bar')},model:{value:(_vm.btnToggledTopBarTextColorLocal),callback:function ($$v) {_vm.btnToggledTopBarTextColorLocal=$$v},expression:\"btnToggledTopBarTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.btnToggledTopBarText}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.tabs')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"tabColor\",\"fallback\":_vm.previewTheme.colors.tab,\"label\":_vm.$t('settings.background')},model:{value:(_vm.tabColorLocal),callback:function ($$v) {_vm.tabColorLocal=$$v},expression:\"tabColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"tabTextColor\",\"fallback\":_vm.previewTheme.colors.tabText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.tabTextColorLocal),callback:function ($$v) {_vm.tabTextColorLocal=$$v},expression:\"tabTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.tabText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"tabActiveTextColor\",\"fallback\":_vm.previewTheme.colors.tabActiveText,\"label\":_vm.$t('settings.text')},model:{value:(_vm.tabActiveTextColorLocal),callback:function ($$v) {_vm.tabActiveTextColorLocal=$$v},expression:\"tabActiveTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.tabActiveText}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.borders')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"borderColor\",\"fallback\":_vm.previewTheme.colors.border,\"label\":_vm.$t('settings.style.common.color')},model:{value:(_vm.borderColorLocal),callback:function ($$v) {_vm.borderColorLocal=$$v},expression:\"borderColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"borderOpacity\",\"fallback\":_vm.previewTheme.opacity.border,\"disabled\":_vm.borderColorLocal === 'transparent'},model:{value:(_vm.borderOpacityLocal),callback:function ($$v) {_vm.borderOpacityLocal=$$v},expression:\"borderOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.faint_text')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"faintColor\",\"fallback\":_vm.previewTheme.colors.faint,\"label\":_vm.$t('settings.text')},model:{value:(_vm.faintColorLocal),callback:function ($$v) {_vm.faintColorLocal=$$v},expression:\"faintColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"faintLinkColor\",\"fallback\":_vm.previewTheme.colors.faintLink,\"label\":_vm.$t('settings.links')},model:{value:(_vm.faintLinkColorLocal),callback:function ($$v) {_vm.faintLinkColorLocal=$$v},expression:\"faintLinkColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"panelFaintColor\",\"fallback\":_vm.previewTheme.colors.panelFaint,\"label\":_vm.$t('settings.style.advanced_colors.panel_header')},model:{value:(_vm.panelFaintColorLocal),callback:function ($$v) {_vm.panelFaintColorLocal=$$v},expression:\"panelFaintColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"faintOpacity\",\"fallback\":_vm.previewTheme.opacity.faint},model:{value:(_vm.faintOpacityLocal),callback:function ($$v) {_vm.faintOpacityLocal=$$v},expression:\"faintOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.underlay')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"underlay\",\"label\":_vm.$t('settings.style.advanced_colors.underlay'),\"fallback\":_vm.previewTheme.colors.underlay},model:{value:(_vm.underlayColorLocal),callback:function ($$v) {_vm.underlayColorLocal=$$v},expression:\"underlayColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"underlayOpacity\",\"fallback\":_vm.previewTheme.opacity.underlay,\"disabled\":_vm.underlayOpacityLocal === 'transparent'},model:{value:(_vm.underlayOpacityLocal),callback:function ($$v) {_vm.underlayOpacityLocal=$$v},expression:\"underlayOpacityLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.poll')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"poll\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.poll},model:{value:(_vm.pollColorLocal),callback:function ($$v) {_vm.pollColorLocal=$$v},expression:\"pollColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"pollText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.pollText},model:{value:(_vm.pollTextColorLocal),callback:function ($$v) {_vm.pollTextColorLocal=$$v},expression:\"pollTextColorLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.icons')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"icon\",\"label\":_vm.$t('settings.style.advanced_colors.icons'),\"fallback\":_vm.previewTheme.colors.icon},model:{value:(_vm.iconColorLocal),callback:function ($$v) {_vm.iconColorLocal=$$v},expression:\"iconColorLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.highlight')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"highlight\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.highlight},model:{value:(_vm.highlightColorLocal),callback:function ($$v) {_vm.highlightColorLocal=$$v},expression:\"highlightColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"highlightText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.highlightText},model:{value:(_vm.highlightTextColorLocal),callback:function ($$v) {_vm.highlightTextColorLocal=$$v},expression:\"highlightTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.highlightText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"highlightLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.highlightLink},model:{value:(_vm.highlightLinkColorLocal),callback:function ($$v) {_vm.highlightLinkColorLocal=$$v},expression:\"highlightLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.highlightLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.popover')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"popover\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.popover},model:{value:(_vm.popoverColorLocal),callback:function ($$v) {_vm.popoverColorLocal=$$v},expression:\"popoverColorLocal\"}}),_vm._v(\" \"),_c('OpacityInput',{attrs:{\"name\":\"popoverOpacity\",\"fallback\":_vm.previewTheme.opacity.popover,\"disabled\":_vm.popoverOpacityLocal === 'transparent'},model:{value:(_vm.popoverOpacityLocal),callback:function ($$v) {_vm.popoverOpacityLocal=$$v},expression:\"popoverOpacityLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"popoverText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.popoverText},model:{value:(_vm.popoverTextColorLocal),callback:function ($$v) {_vm.popoverTextColorLocal=$$v},expression:\"popoverTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.popoverText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"popoverLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.popoverLink},model:{value:(_vm.popoverLinkColorLocal),callback:function ($$v) {_vm.popoverLinkColorLocal=$$v},expression:\"popoverLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.popoverLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.selectedPost')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedPost\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.selectedPost},model:{value:(_vm.selectedPostColorLocal),callback:function ($$v) {_vm.selectedPostColorLocal=$$v},expression:\"selectedPostColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedPostText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.selectedPostText},model:{value:(_vm.selectedPostTextColorLocal),callback:function ($$v) {_vm.selectedPostTextColorLocal=$$v},expression:\"selectedPostTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedPostText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedPostLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.selectedPostLink},model:{value:(_vm.selectedPostLinkColorLocal),callback:function ($$v) {_vm.selectedPostLinkColorLocal=$$v},expression:\"selectedPostLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedPostLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.selectedMenu')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedMenu\",\"label\":_vm.$t('settings.background'),\"fallback\":_vm.previewTheme.colors.selectedMenu},model:{value:(_vm.selectedMenuColorLocal),callback:function ($$v) {_vm.selectedMenuColorLocal=$$v},expression:\"selectedMenuColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedMenuText\",\"label\":_vm.$t('settings.text'),\"fallback\":_vm.previewTheme.colors.selectedMenuText},model:{value:(_vm.selectedMenuTextColorLocal),callback:function ($$v) {_vm.selectedMenuTextColorLocal=$$v},expression:\"selectedMenuTextColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedMenuText}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"selectedMenuLink\",\"label\":_vm.$t('settings.links'),\"fallback\":_vm.previewTheme.colors.selectedMenuLink},model:{value:(_vm.selectedMenuLinkColorLocal),callback:function ($$v) {_vm.selectedMenuLinkColorLocal=$$v},expression:\"selectedMenuLinkColorLocal\"}}),_vm._v(\" \"),_c('ContrastRatio',{attrs:{\"contrast\":_vm.previewContrast.selectedMenuLink}})],1),_vm._v(\" \"),_c('div',{staticClass:\"color-item\"},[_c('h4',[_vm._v(_vm._s(_vm.$t('chats.chats')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatBgColor\",\"fallback\":_vm.previewTheme.colors.bg,\"label\":_vm.$t('settings.background')},model:{value:(_vm.chatBgColorLocal),callback:function ($$v) {_vm.chatBgColorLocal=$$v},expression:\"chatBgColorLocal\"}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.chat.incoming')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingBgColor\",\"fallback\":_vm.previewTheme.colors.bg,\"label\":_vm.$t('settings.background')},model:{value:(_vm.chatMessageIncomingBgColorLocal),callback:function ($$v) {_vm.chatMessageIncomingBgColorLocal=$$v},expression:\"chatMessageIncomingBgColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingTextColor\",\"fallback\":_vm.previewTheme.colors.text,\"label\":_vm.$t('settings.text')},model:{value:(_vm.chatMessageIncomingTextColorLocal),callback:function ($$v) {_vm.chatMessageIncomingTextColorLocal=$$v},expression:\"chatMessageIncomingTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingLinkColor\",\"fallback\":_vm.previewTheme.colors.link,\"label\":_vm.$t('settings.links')},model:{value:(_vm.chatMessageIncomingLinkColorLocal),callback:function ($$v) {_vm.chatMessageIncomingLinkColorLocal=$$v},expression:\"chatMessageIncomingLinkColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageIncomingBorderLinkColor\",\"fallback\":_vm.previewTheme.colors.fg,\"label\":_vm.$t('settings.style.advanced_colors.chat.border')},model:{value:(_vm.chatMessageIncomingBorderColorLocal),callback:function ($$v) {_vm.chatMessageIncomingBorderColorLocal=$$v},expression:\"chatMessageIncomingBorderColorLocal\"}}),_vm._v(\" \"),_c('h5',[_vm._v(_vm._s(_vm.$t('settings.style.advanced_colors.chat.outgoing')))]),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingBgColor\",\"fallback\":_vm.previewTheme.colors.bg,\"label\":_vm.$t('settings.background')},model:{value:(_vm.chatMessageOutgoingBgColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingBgColorLocal=$$v},expression:\"chatMessageOutgoingBgColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingTextColor\",\"fallback\":_vm.previewTheme.colors.text,\"label\":_vm.$t('settings.text')},model:{value:(_vm.chatMessageOutgoingTextColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingTextColorLocal=$$v},expression:\"chatMessageOutgoingTextColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingLinkColor\",\"fallback\":_vm.previewTheme.colors.link,\"label\":_vm.$t('settings.links')},model:{value:(_vm.chatMessageOutgoingLinkColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingLinkColorLocal=$$v},expression:\"chatMessageOutgoingLinkColorLocal\"}}),_vm._v(\" \"),_c('ColorInput',{attrs:{\"name\":\"chatMessageOutgoingBorderLinkColor\",\"fallback\":_vm.previewTheme.colors.bg,\"label\":_vm.$t('settings.style.advanced_colors.chat.border')},model:{value:(_vm.chatMessageOutgoingBorderColorLocal),callback:function ($$v) {_vm.chatMessageOutgoingBorderColorLocal=$$v},expression:\"chatMessageOutgoingBorderColorLocal\"}})],1)]),_vm._v(\" \"),_c('div',{staticClass:\"radius-container\",attrs:{\"label\":_vm.$t('settings.style.radii._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.radii_help')))]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearRoundness}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"btnRadius\",\"label\":_vm.$t('settings.btnRadius'),\"fallback\":_vm.previewTheme.radii.btn,\"max\":\"16\",\"hard-min\":\"0\"},model:{value:(_vm.btnRadiusLocal),callback:function ($$v) {_vm.btnRadiusLocal=$$v},expression:\"btnRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"inputRadius\",\"label\":_vm.$t('settings.inputRadius'),\"fallback\":_vm.previewTheme.radii.input,\"max\":\"9\",\"hard-min\":\"0\"},model:{value:(_vm.inputRadiusLocal),callback:function ($$v) {_vm.inputRadiusLocal=$$v},expression:\"inputRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"checkboxRadius\",\"label\":_vm.$t('settings.checkboxRadius'),\"fallback\":_vm.previewTheme.radii.checkbox,\"max\":\"16\",\"hard-min\":\"0\"},model:{value:(_vm.checkboxRadiusLocal),callback:function ($$v) {_vm.checkboxRadiusLocal=$$v},expression:\"checkboxRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"panelRadius\",\"label\":_vm.$t('settings.panelRadius'),\"fallback\":_vm.previewTheme.radii.panel,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.panelRadiusLocal),callback:function ($$v) {_vm.panelRadiusLocal=$$v},expression:\"panelRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"avatarRadius\",\"label\":_vm.$t('settings.avatarRadius'),\"fallback\":_vm.previewTheme.radii.avatar,\"max\":\"28\",\"hard-min\":\"0\"},model:{value:(_vm.avatarRadiusLocal),callback:function ($$v) {_vm.avatarRadiusLocal=$$v},expression:\"avatarRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"avatarAltRadius\",\"label\":_vm.$t('settings.avatarAltRadius'),\"fallback\":_vm.previewTheme.radii.avatarAlt,\"max\":\"28\",\"hard-min\":\"0\"},model:{value:(_vm.avatarAltRadiusLocal),callback:function ($$v) {_vm.avatarAltRadiusLocal=$$v},expression:\"avatarAltRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"attachmentRadius\",\"label\":_vm.$t('settings.attachmentRadius'),\"fallback\":_vm.previewTheme.radii.attachment,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.attachmentRadiusLocal),callback:function ($$v) {_vm.attachmentRadiusLocal=$$v},expression:\"attachmentRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"tooltipRadius\",\"label\":_vm.$t('settings.tooltipRadius'),\"fallback\":_vm.previewTheme.radii.tooltip,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.tooltipRadiusLocal),callback:function ($$v) {_vm.tooltipRadiusLocal=$$v},expression:\"tooltipRadiusLocal\"}}),_vm._v(\" \"),_c('RangeInput',{attrs:{\"name\":\"chatMessageRadius\",\"label\":_vm.$t('settings.chatMessageRadius'),\"fallback\":_vm.previewTheme.radii.chatMessage || 2,\"max\":\"50\",\"hard-min\":\"0\"},model:{value:(_vm.chatMessageRadiusLocal),callback:function ($$v) {_vm.chatMessageRadiusLocal=$$v},expression:\"chatMessageRadiusLocal\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"shadow-container\",attrs:{\"label\":_vm.$t('settings.style.shadows._tab_label')}},[_c('div',{staticClass:\"tab-header shadow-selector\"},[_c('div',{staticClass:\"select-container\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.component'))+\"\\n \"),_c('label',{staticClass:\"select\",attrs:{\"for\":\"shadow-switcher\"}},[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.shadowSelected),expression:\"shadowSelected\"}],staticClass:\"shadow-switcher\",attrs:{\"id\":\"shadow-switcher\"},on:{\"change\":function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.shadowSelected=$event.target.multiple ? $$selectedVal : $$selectedVal[0]}}},_vm._l((_vm.shadowsAvailable),function(shadow){return _c('option',{key:shadow,domProps:{\"value\":shadow}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.components.' + shadow))+\"\\n \")])}),0),_vm._v(\" \"),_c('i',{staticClass:\"icon-down-open\"})])]),_vm._v(\" \"),_c('div',{staticClass:\"override\"},[_c('label',{staticClass:\"label\",attrs:{\"for\":\"override\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.shadows.override'))+\"\\n \")]),_vm._v(\" \"),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.currentShadowOverriden),expression:\"currentShadowOverriden\"}],staticClass:\"input-override\",attrs:{\"id\":\"override\",\"name\":\"override\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.currentShadowOverriden)?_vm._i(_vm.currentShadowOverriden,null)>-1:(_vm.currentShadowOverriden)},on:{\"change\":function($event){var $$a=_vm.currentShadowOverriden,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.currentShadowOverriden=$$a.concat([$$v]))}else{$$i>-1&&(_vm.currentShadowOverriden=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.currentShadowOverriden=$$c}}}}),_vm._v(\" \"),_c('label',{staticClass:\"checkbox-label\",attrs:{\"for\":\"override\"}})]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearShadows}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('ShadowControl',{attrs:{\"ready\":!!_vm.currentShadowFallback,\"fallback\":_vm.currentShadowFallback},model:{value:(_vm.currentShadow),callback:function ($$v) {_vm.currentShadow=$$v},expression:\"currentShadow\"}}),_vm._v(\" \"),(_vm.shadowSelected === 'avatar' || _vm.shadowSelected === 'avatarStatus')?_c('div',[_c('i18n',{attrs:{\"path\":\"settings.style.shadows.filter_hint.always_drop_shadow\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"filter: drop-shadow()\")])]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.shadows.filter_hint.avatar_inset')))]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.shadows.filter_hint.drop_shadow_syntax\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"drop-shadow\")]),_vm._v(\" \"),_c('code',[_vm._v(\"spread-radius\")]),_vm._v(\" \"),_c('code',[_vm._v(\"inset\")])]),_vm._v(\" \"),_c('i18n',{attrs:{\"path\":\"settings.style.shadows.filter_hint.inset_classic\",\"tag\":\"p\"}},[_c('code',[_vm._v(\"box-shadow\")])]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.shadows.filter_hint.spread_zero')))])],1):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"fonts-container\",attrs:{\"label\":_vm.$t('settings.style.fonts._tab_label')}},[_c('div',{staticClass:\"tab-header\"},[_c('p',[_vm._v(_vm._s(_vm.$t('settings.style.fonts.help')))]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearFonts}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.clear_all'))+\"\\n \")])]),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"ui\",\"label\":_vm.$t('settings.style.fonts.components.interface'),\"fallback\":_vm.previewTheme.fonts.interface,\"no-inherit\":\"1\"},model:{value:(_vm.fontsLocal.interface),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"interface\", $$v)},expression:\"fontsLocal.interface\"}}),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"input\",\"label\":_vm.$t('settings.style.fonts.components.input'),\"fallback\":_vm.previewTheme.fonts.input},model:{value:(_vm.fontsLocal.input),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"input\", $$v)},expression:\"fontsLocal.input\"}}),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"post\",\"label\":_vm.$t('settings.style.fonts.components.post'),\"fallback\":_vm.previewTheme.fonts.post},model:{value:(_vm.fontsLocal.post),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"post\", $$v)},expression:\"fontsLocal.post\"}}),_vm._v(\" \"),_c('FontControl',{attrs:{\"name\":\"postCode\",\"label\":_vm.$t('settings.style.fonts.components.postCode'),\"fallback\":_vm.previewTheme.fonts.postCode},model:{value:(_vm.fontsLocal.postCode),callback:function ($$v) {_vm.$set(_vm.fontsLocal, \"postCode\", $$v)},expression:\"fontsLocal.postCode\"}})],1)])],1),_vm._v(\" \"),_c('div',{staticClass:\"apply-container\"},[_c('button',{staticClass:\"btn submit\",attrs:{\"disabled\":!_vm.themeValid},on:{\"click\":_vm.setCustomTheme}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('general.apply'))+\"\\n \")]),_vm._v(\" \"),_c('button',{staticClass:\"btn\",on:{\"click\":_vm.clearAll}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.style.switcher.reset'))+\"\\n \")])])],1)}\nvar staticRenderFns = []\nexport { render, staticRenderFns }","import TabSwitcher from 'src/components/tab_switcher/tab_switcher.js'\n\nimport DataImportExportTab from './tabs/data_import_export_tab.vue'\nimport MutesAndBlocksTab from './tabs/mutes_and_blocks_tab.vue'\nimport NotificationsTab from './tabs/notifications_tab.vue'\nimport FilteringTab from './tabs/filtering_tab.vue'\nimport SecurityTab from './tabs/security_tab/security_tab.vue'\nimport ProfileTab from './tabs/profile_tab.vue'\nimport GeneralTab from './tabs/general_tab.vue'\nimport VersionTab from './tabs/version_tab.vue'\nimport ThemeTab from './tabs/theme_tab/theme_tab.vue'\n\nconst SettingsModalContent = {\n components: {\n TabSwitcher,\n\n DataImportExportTab,\n MutesAndBlocksTab,\n NotificationsTab,\n FilteringTab,\n SecurityTab,\n ProfileTab,\n GeneralTab,\n VersionTab,\n ThemeTab\n },\n computed: {\n isLoggedIn () {\n return !!this.$store.state.users.currentUser\n },\n open () {\n return this.$store.state.interface.settingsModalState !== 'hidden'\n }\n },\n methods: {\n onOpen () {\n const targetTab = this.$store.state.interface.settingsModalTargetTab\n // We're being told to open in specific tab\n if (targetTab) {\n const tabIndex = this.$refs.tabSwitcher.$slots.default.findIndex(elm => {\n return elm.data && elm.data.attrs['data-tab-name'] === targetTab\n })\n if (tabIndex >= 0) {\n this.$refs.tabSwitcher.setTab(tabIndex)\n }\n }\n // Clear the state of target tab, so that next time settings is opened\n // it doesn't force it.\n this.$store.dispatch('clearSettingsModalTargetTab')\n }\n },\n mounted () {\n this.onOpen()\n },\n watch: {\n open: function (value) {\n if (value) this.onOpen()\n }\n }\n}\n\nexport default SettingsModalContent\n","function injectStyle (context) {\n require(\"!!vue-style-loader!css-loader?minimize!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"optionsId\\\":\\\"0\\\",\\\"vue\\\":true,\\\"scoped\\\":false,\\\"sourceMap\\\":false}!sass-loader!./settings_modal_content.scss\")\n}\n/* script */\nexport * from \"!!babel-loader!./settings_modal_content.js\"\nimport __vue_script__ from \"!!babel-loader!./settings_modal_content.js\"/* template */\nimport {render as __vue_render__, staticRenderFns as __vue_static_render_fns__} from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-da72a86e\\\",\\\"hasScoped\\\":false,\\\"optionsId\\\":\\\"0\\\",\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./settings_modal_content.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nimport normalizeComponent from \"!../../../node_modules/vue-loader/lib/runtime/component-normalizer\"\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_render__,\n __vue_static_render_fns__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('tab-switcher',{ref:\"tabSwitcher\",staticClass:\"settings_tab-switcher\",attrs:{\"side-tab-bar\":true,\"scrollable-tabs\":true}},[_c('div',{attrs:{\"label\":_vm.$t('settings.general'),\"icon\":\"wrench\",\"data-tab-name\":\"general\"}},[_c('GeneralTab')],1),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.profile_tab'),\"icon\":\"user\",\"data-tab-name\":\"profile\"}},[_c('ProfileTab')],1):_vm._e(),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.security_tab'),\"icon\":\"lock\",\"data-tab-name\":\"security\"}},[_c('SecurityTab')],1):_vm._e(),_vm._v(\" \"),_c('div',{attrs:{\"label\":_vm.$t('settings.filtering'),\"icon\":\"filter\",\"data-tab-name\":\"filtering\"}},[_c('FilteringTab')],1),_vm._v(\" \"),_c('div',{attrs:{\"label\":_vm.$t('settings.theme'),\"icon\":\"brush\",\"data-tab-name\":\"theme\"}},[_c('ThemeTab')],1),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.notifications'),\"icon\":\"bell-ringing-o\",\"data-tab-name\":\"notifications\"}},[_c('NotificationsTab')],1):_vm._e(),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.data_import_export_tab'),\"icon\":\"download\",\"data-tab-name\":\"dataImportExport\"}},[_c('DataImportExportTab')],1):_vm._e(),_vm._v(\" \"),(_vm.isLoggedIn)?_c('div',{attrs:{\"label\":_vm.$t('settings.mutes_and_blocks'),\"fullHeight\":true,\"icon\":\"eye-off\",\"data-tab-name\":\"mutesAndBlocks\"}},[_c('MutesAndBlocksTab')],1):_vm._e(),_vm._v(\" \"),_c('div',{attrs:{\"label\":_vm.$t('settings.version.title'),\"icon\":\"info-circled\",\"data-tab-name\":\"version\"}},[_c('VersionTab')],1)])}\nvar staticRenderFns = []\nexport { render, staticRenderFns }"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/js/app.55d173dc5e39519aa518.js b/priv/static/static/js/app.55d173dc5e39519aa518.js deleted file mode 100644 index d04ae3499..000000000 --- a/priv/static/static/js/app.55d173dc5e39519aa518.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t){function e(e){for(var i,o,a=e[0],c=e[1],l=e[2],u=0,p=[];u]*>/g,"")),value:unescape(t.value.replace(/<[^>]*>/g,""))}}),e.profile_image_url=t.avatar,e.profile_image_url_original=t.avatar,e.cover_photo=t.header,e.friends_count=t.following_count,e.bot=t.bot,t.pleroma){var o=t.pleroma.relationship;e.background_image=t.pleroma.background_image,e.favicon=t.pleroma.favicon,e.token=t.pleroma.chat_token,o&&(e.relationship=o),e.allow_following_move=t.pleroma.allow_following_move,e.hide_follows=t.pleroma.hide_follows,e.hide_followers=t.pleroma.hide_followers,e.hide_follows_count=t.pleroma.hide_follows_count,e.hide_followers_count=t.pleroma.hide_followers_count,e.rights={moderator:t.pleroma.is_moderator,admin:t.pleroma.is_admin},e.rights.admin?e.role="admin":e.rights.moderator?e.role="moderator":e.role="member"}t.source&&(e.description=t.source.note,e.default_scope=t.source.privacy,e.fields=t.source.fields,t.source.pleroma&&(e.no_rich_text=t.source.pleroma.no_rich_text,e.show_role=t.source.pleroma.show_role,e.discoverable=t.source.pleroma.discoverable)),e.is_local=!e.screen_name.includes("@")}else e.screen_name=t.screen_name,e.name=t.name,e.name_html=t.name_html,e.description=t.description,e.description_html=t.description_html,e.profile_image_url=t.profile_image_url,e.profile_image_url_original=t.profile_image_url_original,e.cover_photo=t.cover_photo,e.friends_count=t.friends_count,e.statusnet_profile_url=t.statusnet_profile_url,e.is_local=t.is_local,e.role=t.role,e.show_role=t.show_role,t.rights&&(e.rights={moderator:t.rights.delete_others_notice,admin:t.rights.admin}),e.no_rich_text=t.no_rich_text,e.default_scope=t.default_scope,e.hide_follows=t.hide_follows,e.hide_followers=t.hide_followers,e.hide_follows_count=t.hide_follows_count,e.hide_followers_count=t.hide_followers_count,e.background_image=t.background_image,e.token=t.token,e.relationship={muting:t.muted,blocking:t.statusnet_blocking,followed_by:t.follows_you,following:t.following};return e.created_at=new Date(t.created_at),e.locked=t.locked,e.followers_count=t.followers_count,e.statuses_count=t.statuses_count,e.friendIds=[],e.followerIds=[],e.pinnedStatusIds=[],t.pleroma&&(e.follow_request_count=t.pleroma.follow_request_count,e.tags=t.pleroma.tags,e.deactivated=t.pleroma.deactivated,e.notification_settings=t.pleroma.notification_settings,e.unread_chat_count=t.pleroma.unread_chat_count),e.tags=e.tags||[],e.rights=e.rights||{},e.notification_settings=e.notification_settings||{},e},p=function(t){var e={};return!t.hasOwnProperty("oembed")?(e.mimetype=t.pleroma?t.pleroma.mime_type:t.type,e.meta=t.meta,e.id=t.id):e.mimetype=t.mimetype,e.url=t.url,e.large_thumb_url=t.preview_url,e.description=t.description,e},f=function(t,e){var n=/[|\\{}()[\]^$+*?.-]/g;return e.reduce(function(t,e){var i=e.shortcode.replace(n,"\\$&");return t.replace(new RegExp(":".concat(i,":"),"g"),":").concat(e.shortcode,":"))},t)},h=function t(e){var n,i={},r=e.hasOwnProperty("account");if(r){if(i.favorited=e.favourited,i.fave_num=e.favourites_count,i.repeated=e.reblogged,i.repeat_num=e.reblogs_count,i.bookmarked=e.bookmarked,i.type=e.reblog?"retweet":"status",i.nsfw=e.sensitive,i.statusnet_html=f(e.content,e.emojis),i.tags=e.tags,e.pleroma){var a=e.pleroma;i.text=a.content?e.pleroma.content["text/plain"]:e.content,i.summary=a.spoiler_text?e.pleroma.spoiler_text["text/plain"]:e.spoiler_text,i.statusnet_conversation_id=e.pleroma.conversation_id,i.is_local=a.local,i.in_reply_to_screen_name=e.pleroma.in_reply_to_account_acct,i.thread_muted=a.thread_muted,i.emoji_reactions=a.emoji_reactions,i.parent_visible=void 0===a.parent_visible||a.parent_visible}else i.text=e.content,i.summary=e.spoiler_text;i.in_reply_to_status_id=e.in_reply_to_id,i.in_reply_to_user_id=e.in_reply_to_account_id,i.replies_count=e.replies_count,"retweet"===i.type&&(i.retweeted_status=t(e.reblog)),i.summary_html=f(s()(e.spoiler_text),e.emojis),i.external_url=e.url,i.poll=e.poll,i.poll&&(i.poll.options=(i.poll.options||[]).map(function(t){return function(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:{}).flakeId,n=c()(t);if(n){var i=n.next.max_id,o=n.prev.min_id;return{maxId:e?i:parseInt(i,10),minId:e?o:parseInt(o,10)}}},b=function(t){var e={};return e.id=t.id,e.account=d(t.account),e.unread=t.unread,e.lastMessage=w(t.last_message),e.updated_at=new Date(t.updated_at),e},w=function(t){if(t){if(t.isNormalized)return t;var e=t;return e.id=t.id,e.created_at=new Date(t.created_at),e.chat_id=t.chat_id,t.content?e.content=f(t.content,t.emojis):e.content="",t.attachment?e.attachments=[p(t.attachment)]:e.attachments=[],e.isNormalized=!0,e}}},function(t,e,n){"use strict";n.d(e,"i",function(){return d}),n.d(e,"h",function(){return f}),n.d(e,"c",function(){return m}),n.d(e,"a",function(){return g}),n.d(e,"b",function(){return v}),n.d(e,"f",function(){return b}),n.d(e,"g",function(){return w}),n.d(e,"j",function(){return _}),n.d(e,"e",function(){return x}),n.d(e,"d",function(){return y});var i=n(1),o=n.n(i),r=n(7),s=n.n(r),a=n(27),c=n.n(a),l=n(14);function u(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var d=function(t,e,n){if(null!=t){if("#"===t[0]||"transparent"===t)return t;if("object"===c()(t)){var i=t;t=i.r,e=i.g,n=i.b}var o=[t,e,n].map(function(t){return t=(t=(t=Math.ceil(t))<0?0:t)>255?255:t}),r=s()(o,3);return t=r[0],e=r[1],n=r[2],"#".concat(((1<<24)+(t<<16)+(e<<8)+n).toString(16).slice(1))}},p=function(t){return"rgb".split("").reduce(function(e,n){return e[n]=function(t){var e=t/255;return e<.03928?e/12.92:Math.pow((e+.055)/1.055,2.4)}(t[n]),e},{})},f=function(t){var e=p(t);return.2126*e.r+.7152*e.g+.0722*e.b},h=function(t,e){var n=f(t),i=f(e),o=n>i?[n,i]:[i,n],r=s()(o,2);return(r[0]+.05)/(r[1]+.05)},m=function(t,e,n){return h(v(n,e),t)},g=function(t,e,n){return 1===e||void 0===e?t:"rgb".split("").reduce(function(i,o){return i[o]=t[o]*e+n[o]*(1-e),i},{})},v=function(t,e){return e.reduce(function(t,e){var n=s()(e,2),i=n[0],o=n[1];return g(i,o,t)},t)},b=function(t){var e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return e?{r:parseInt(e[1],16),g:parseInt(e[2],16),b:parseInt(e[3],16)}:null},w=function(t,e){return"rgb".split("").reduce(function(n,i){return n[i]=(t[i]+e[i])/2,n},{})},_=function(t){return"rgba(".concat(Math.floor(t.r),", ").concat(Math.floor(t.g),", ").concat(Math.floor(t.b),", ").concat(t.a,")")},x=function(t,e,n){if(h(t,e)<4.5){var i=void 0!==e.a?{a:e.a}:{},o=Object.assign(i,Object(l.invertLightness)(e).rgb);return!n&&h(t,o)<4.5?Object(l.contrastRatio)(t,e).rgb:o}return e},y=function(t,e){var n={};if("object"===c()(t))n=t;else if("string"==typeof t){if(!t.startsWith("#"))return t;n=b(t)}return _(function(t){for(var e=1;e2&&void 0!==arguments[2]?arguments[2]:function(t){return t};t.addEventListener(e,function(t){s.dispatchEvent(new CustomEvent(e,{detail:n(t)}))})};return a.addEventListener("open",function(t){console.debug("[WS][".concat(r,"] Socket connected"),t)}),a.addEventListener("error",function(t){console.debug("[WS][".concat(r,"] Socket errored"),t)}),a.addEventListener("close",function(t){console.debug("[WS][".concat(r,"] Socket disconnected with code ").concat(t.code),t)}),c(a,"open"),c(a,"close"),c(a,"message",i),c(a,"error"),s.close=function(){a.close(1e3,"Shutting down socket")},s},St=function(t){var e=t.data;if(e){var n=JSON.parse(e),i=n.event,o=n.payload;if(!yt.has(i)&&!kt.has(i))return console.warn("Unknown event",t),null;if("delete"===i)return{event:i,id:o};var r=o?JSON.parse(o):null;return"update"===i?{event:i,status:Object(x.f)(r)}:"notification"===i?{event:i,notification:Object(x.e)(r)}:"pleroma:chat_update"===i?{event:i,chatUpdate:Object(x.b)(r)}:void 0}},jt=Object.freeze({JOINED:1,CLOSED:2,ERROR:3}),Ot={verifyCredentials:function(t){return vt("/api/v1/accounts/verify_credentials",{headers:wt(t)}).then(function(t){return t.ok?t.json():{error:t}}).then(function(t){return t.error?t:Object(x.g)(t)})},fetchTimeline:function(t){var e=t.timeline,n=t.credentials,i=t.since,o=void 0!==i&&i,r=t.until,s=void 0!==r&&r,a=t.userId,c=void 0!==a&&a,l=t.tag,u=void 0!==l&&l,d=t.withMuted,p=void 0!==d&&d,f=t.replyVisibility,h=void 0===f?"all":f,m="notifications"===e,g=[],v={public:"/api/v1/timelines/public",friends:"/api/v1/timelines/home",dms:"/api/v1/timelines/direct",notifications:"/api/v1/notifications",publicAndExternal:"/api/v1/timelines/public",user:J,media:J,favorites:"/api/v1/favourites",tag:X,bookmarks:"/api/v1/bookmarks"}[e];"user"!==e&&"media"!==e||(v=v(c)),o&&g.push(["since_id",o]),s&&g.push(["max_id",s]),u&&(v=v(u)),"media"===e&&g.push(["only_media",1]),"public"===e&&g.push(["local",!0]),"public"!==e&&"publicAndExternal"!==e||g.push(["only_media",!1]),"favorites"!==e&&"bookmarks"!==e&&g.push(["with_muted",p]),"all"!==h&&g.push(["reply_visibility",h]),g.push(["limit",20]);var w=b()(g,function(t){return"".concat(t[0],"=").concat(t[1])}).join("&");v+="?".concat(w);var _="",y="",k={};return vt(v,{headers:wt(n)}).then(function(t){return _=t.status,y=t.statusText,k=Object(x.d)(t.headers.get("Link"),{flakeId:"bookmarks"!==e&&"notifications"!==e}),t}).then(function(t){return t.json()}).then(function(t){return t.error?(t.status=_,t.statusText=y,t):{data:t.map(m?x.e:x.f),pagination:k}})},fetchPinnedStatuses:function(t){var e=t.id,n=t.credentials,i=J(e)+"?pinned=true";return bt({url:i,credentials:n}).then(function(t){return t.map(x.f)})},fetchConversation:function(t){var e=t.id,n=t.credentials,i=function(t){return"/api/v1/statuses/".concat(t,"/context")}(e);return vt(i,{headers:wt(n)}).then(function(t){if(t.ok)return t;throw new Error("Error fetching timeline",t)}).then(function(t){return t.json()}).then(function(t){var e=t.ancestors,n=t.descendants;return{ancestors:e.map(x.f),descendants:n.map(x.f)}})},fetchStatus:function(t){var e=t.id,n=t.credentials,i=function(t){return"/api/v1/statuses/".concat(t)}(e);return vt(i,{headers:wt(n)}).then(function(t){if(t.ok)return t;throw new Error("Error fetching timeline",t)}).then(function(t){return t.json()}).then(function(t){return Object(x.f)(t)})},fetchFriends:_t,exportFriends:function(t){var e=t.id,n=t.credentials;return new Promise(function(t,i){var r,s,a,c;return o.a.async(function(l){for(;;)switch(l.prev=l.next){case 0:l.prev=0,r=[],s=!0;case 3:if(!s){l.next=12;break}return a=r.length>0?h()(r).id:void 0,l.next=7,o.a.awrap(_t({id:e,maxId:a,credentials:n}));case 7:c=l.sent,r=g()(r,c),0===c.length&&(s=!1),l.next=3;break;case 12:t(r),l.next=18;break;case 15:l.prev=15,l.t0=l.catch(0),i(l.t0);case 18:case"end":return l.stop()}},null,null,[[0,15]])})},fetchFollowers:function(t){var e=t.id,n=t.maxId,i=t.sinceId,o=t.limit,r=void 0===o?20:o,s=t.credentials,a=function(t){return"/api/v1/accounts/".concat(t,"/followers")}(e),c=[n&&"max_id=".concat(n),i&&"since_id=".concat(i),r&&"limit=".concat(r),"with_relationships=true"].filter(function(t){return t}).join("&");return vt(a+=c?"?"+c:"",{headers:wt(s)}).then(function(t){return t.json()}).then(function(t){return t.map(x.g)})},followUser:function(t){var e=t.id,n=t.credentials,i=s()(t,["id","credentials"]),o=function(t){return"/api/v1/accounts/".concat(t,"/follow")}(e),r={};return void 0!==i.reblogs&&(r.reblogs=i.reblogs),vt(o,{body:JSON.stringify(r),headers:H({},wt(n),{"Content-Type":"application/json"}),method:"POST"}).then(function(t){return t.json()})},unfollowUser:function(t){var e=t.id,n=t.credentials,i=function(t){return"/api/v1/accounts/".concat(t,"/unfollow")}(e);return vt(i,{headers:wt(n),method:"POST"}).then(function(t){return t.json()})},pinOwnStatus:function(t){var e=t.id,n=t.credentials;return bt({url:st(e),credentials:n,method:"POST"}).then(function(t){return Object(x.f)(t)})},unpinOwnStatus:function(t){var e=t.id,n=t.credentials;return bt({url:at(e),credentials:n,method:"POST"}).then(function(t){return Object(x.f)(t)})},muteConversation:function(t){var e=t.id,n=t.credentials;return bt({url:ct(e),credentials:n,method:"POST"}).then(function(t){return Object(x.f)(t)})},unmuteConversation:function(t){var e=t.id,n=t.credentials;return bt({url:lt(e),credentials:n,method:"POST"}).then(function(t){return Object(x.f)(t)})},blockUser:function(t){var e=t.id,n=t.credentials;return vt(function(t){return"/api/v1/accounts/".concat(t,"/block")}(e),{headers:wt(n),method:"POST"}).then(function(t){return t.json()})},unblockUser:function(t){var e=t.id,n=t.credentials;return vt(function(t){return"/api/v1/accounts/".concat(t,"/unblock")}(e),{headers:wt(n),method:"POST"}).then(function(t){return t.json()})},fetchUser:function(t){var e=t.id,n=t.credentials,i="".concat("/api/v1/accounts","/").concat(e);return bt({url:i,credentials:n}).then(function(t){return Object(x.g)(t)})},fetchUserRelationship:function(t){var e=t.id,n=t.credentials,i="".concat("/api/v1/accounts/relationships","/?id=").concat(e);return vt(i,{headers:wt(n)}).then(function(t){return new Promise(function(e,n){return t.json().then(function(o){return t.ok?e(o):n(new A(t.status,o,{url:i},t))})})})},favorite:function(t){var e=t.id,n=t.credentials;return bt({url:V(e),method:"POST",credentials:n}).then(function(t){return Object(x.f)(t)})},unfavorite:function(t){var e=t.id,n=t.credentials;return bt({url:G(e),method:"POST",credentials:n}).then(function(t){return Object(x.f)(t)})},retweet:function(t){var e=t.id,n=t.credentials;return bt({url:K(e),method:"POST",credentials:n}).then(function(t){return Object(x.f)(t)})},unretweet:function(t){var e=t.id,n=t.credentials;return bt({url:Y(e),method:"POST",credentials:n}).then(function(t){return Object(x.f)(t)})},bookmarkStatus:function(t){var e=t.id,n=t.credentials;return bt({url:nt(e),headers:wt(n),method:"POST"})},unbookmarkStatus:function(t){var e=t.id,n=t.credentials;return bt({url:it(e),headers:wt(n),method:"POST"})},postStatus:function(t){var e=t.credentials,n=t.status,i=t.spoilerText,o=t.visibility,r=t.sensitive,s=t.poll,a=t.mediaIds,c=void 0===a?[]:a,l=t.inReplyToStatusId,u=t.contentType,d=t.preview,p=t.idempotencyKey,f=new FormData,h=s.options||[];if(f.append("status",n),f.append("source","Pleroma FE"),i&&f.append("spoiler_text",i),o&&f.append("visibility",o),r&&f.append("sensitive",r),u&&f.append("content_type",u),c.forEach(function(t){f.append("media_ids[]",t)}),h.some(function(t){return""!==t})){var m={expires_in:s.expiresIn,multiple:s.multiple};Object.keys(m).forEach(function(t){f.append("poll[".concat(t,"]"),m[t])}),h.forEach(function(t){f.append("poll[options][]",t)})}l&&f.append("in_reply_to_id",l),d&&f.append("preview","true");var g=wt(e);return p&&(g["idempotency-key"]=p),vt("/api/v1/statuses",{body:f,method:"POST",headers:g}).then(function(t){return t.json()}).then(function(t){return t.error?t:Object(x.f)(t)})},deleteStatus:function(t){var e=t.id,n=t.credentials;return vt(function(t){return"/api/v1/statuses/".concat(t)}(e),{headers:wt(n),method:"DELETE"})},uploadMedia:function(t){var e=t.formData,n=t.credentials;return vt("/api/v1/media",{body:e,method:"POST",headers:wt(n)}).then(function(t){return t.json()}).then(function(t){return Object(x.a)(t)})},setMediaDescription:function(t){var e=t.id,n=t.description,i=t.credentials;return bt({url:"".concat("/api/v1/media","/").concat(e),method:"PUT",headers:wt(i),payload:{description:n}}).then(function(t){return Object(x.a)(t)})},fetchMutes:function(t){var e=t.credentials;return bt({url:"/api/v1/mutes/",credentials:e}).then(function(t){return t.map(x.g)})},muteUser:function(t){var e=t.id,n=t.credentials;return bt({url:Q(e),credentials:n,method:"POST"})},unmuteUser:function(t){var e=t.id,n=t.credentials;return bt({url:Z(e),credentials:n,method:"POST"})},subscribeUser:function(t){var e=t.id,n=t.credentials;return bt({url:tt(e),credentials:n,method:"POST"})},unsubscribeUser:function(t){var e=t.id,n=t.credentials;return bt({url:et(e),credentials:n,method:"POST"})},fetchBlocks:function(t){var e=t.credentials;return bt({url:"/api/v1/blocks/",credentials:e}).then(function(t){return t.map(x.g)})},fetchOAuthTokens:function(t){var e=t.credentials;return vt("/api/oauth_tokens.json",{headers:wt(e)}).then(function(t){if(t.ok)return t.json();throw new Error("Error fetching auth tokens",t)})},revokeOAuthToken:function(t){var e=t.id,n=t.credentials,i="/api/oauth_tokens/".concat(e);return vt(i,{headers:wt(n),method:"DELETE"})},tagUser:function(t){var e=t.tag,n=t.credentials,i={nicknames:[t.user.screen_name],tags:[e]},o=wt(n);return o["Content-Type"]="application/json",vt("/api/pleroma/admin/users/tag",{method:"PUT",headers:o,body:JSON.stringify(i)})},untagUser:function(t){var e=t.tag,n=t.credentials,i={nicknames:[t.user.screen_name],tags:[e]},o=wt(n);return o["Content-Type"]="application/json",vt("/api/pleroma/admin/users/tag",{method:"DELETE",headers:o,body:JSON.stringify(i)})},deleteUser:function(t){var e=t.credentials,n=t.user.screen_name,i=wt(e);return vt("".concat("/api/pleroma/admin/users","?nickname=").concat(n),{method:"DELETE",headers:i})},addRight:function(t){var e=t.right,n=t.credentials,i=t.user.screen_name;return vt(q(i,e),{method:"POST",headers:wt(n),body:{}})},deleteRight:function(t){var e=t.right,n=t.credentials,i=t.user.screen_name;return vt(q(i,e),{method:"DELETE",headers:wt(n),body:{}})},activateUser:function(t){var e=t.credentials,n=t.user.screen_name;return bt({url:"/api/pleroma/admin/users/activate",method:"PATCH",credentials:e,payload:{nicknames:[n]}}).then(function(t){return p()(t,"users.0")})},deactivateUser:function(t){var e=t.credentials,n=t.user.screen_name;return bt({url:"/api/pleroma/admin/users/deactivate",method:"PATCH",credentials:e,payload:{nicknames:[n]}}).then(function(t){return p()(t,"users.0")})},register:function(t){var e=t.params,n=t.credentials,i=e.nickname,o=s()(e,["nickname"]);return vt("/api/v1/accounts",{method:"POST",headers:H({},wt(n),{"Content-Type":"application/json"}),body:JSON.stringify(H({nickname:i,locale:"en_US",agreement:!0},o))}).then(function(t){return t.ok?t.json():t.json().then(function(t){throw new B(t)})})},getCaptcha:function(){return vt("/api/pleroma/captcha").then(function(t){return t.json()})},updateProfileImages:function(t){var e=t.credentials,n=t.avatar,i=void 0===n?null:n,o=t.banner,r=void 0===o?null:o,s=t.background,a=void 0===s?null:s,c=new FormData;return null!==i&&c.append("avatar",i),null!==r&&c.append("header",r),null!==a&&c.append("pleroma_background_image",a),vt("/api/v1/accounts/update_credentials",{headers:wt(e),method:"PATCH",body:c}).then(function(t){return t.json()}).then(function(t){return Object(x.g)(t)})},updateProfile:function(t){var e=t.credentials,n=t.params;return bt({url:"/api/v1/accounts/update_credentials",method:"PATCH",payload:n,credentials:e}).then(function(t){return Object(x.g)(t)})},importBlocks:function(t){var e=t.file,n=t.credentials,i=new FormData;return i.append("list",e),vt("/api/pleroma/blocks_import",{body:i,method:"POST",headers:wt(n)}).then(function(t){return t.ok})},importFollows:function(t){var e=t.file,n=t.credentials,i=new FormData;return i.append("list",e),vt("/api/pleroma/follow_import",{body:i,method:"POST",headers:wt(n)}).then(function(t){return t.ok})},deleteAccount:function(t){var e=t.credentials,n=t.password,i=new FormData;return i.append("password",n),vt("/api/pleroma/delete_account",{body:i,method:"POST",headers:wt(e)}).then(function(t){return t.json()})},changeEmail:function(t){var e=t.credentials,n=t.email,i=t.password,o=new FormData;return o.append("email",n),o.append("password",i),vt("/api/pleroma/change_email",{body:o,method:"POST",headers:wt(e)}).then(function(t){return t.json()})},changePassword:function(t){var e=t.credentials,n=t.password,i=t.newPassword,o=t.newPasswordConfirmation,r=new FormData;return r.append("password",n),r.append("new_password",i),r.append("new_password_confirmation",o),vt("/api/pleroma/change_password",{body:r,method:"POST",headers:wt(e)}).then(function(t){return t.json()})},settingsMFA:function(t){var e=t.credentials;return vt("/api/pleroma/accounts/mfa",{headers:wt(e),method:"GET"}).then(function(t){return t.json()})},mfaDisableOTP:function(t){var e=t.credentials,n=t.password,i=new FormData;return i.append("password",n),vt("/api/pleroma/accounts/mfa/totp",{body:i,method:"DELETE",headers:wt(e)}).then(function(t){return t.json()})},generateMfaBackupCodes:function(t){var e=t.credentials;return vt("/api/pleroma/accounts/mfa/backup_codes",{headers:wt(e),method:"GET"}).then(function(t){return t.json()})},mfaSetupOTP:function(t){var e=t.credentials;return vt("/api/pleroma/accounts/mfa/setup/totp",{headers:wt(e),method:"GET"}).then(function(t){return t.json()})},mfaConfirmOTP:function(t){var e=t.credentials,n=t.password,i=t.token,o=new FormData;return o.append("password",n),o.append("code",i),vt("/api/pleroma/accounts/mfa/confirm/totp",{body:o,headers:wt(e),method:"POST"}).then(function(t){return t.json()})},fetchFollowRequests:function(t){var e=t.credentials;return vt("/api/v1/follow_requests",{headers:wt(e)}).then(function(t){return t.json()}).then(function(t){return t.map(x.g)})},approveUser:function(t){var e=t.id,n=t.credentials,i=function(t){return"/api/v1/follow_requests/".concat(t,"/authorize")}(e);return vt(i,{headers:wt(n),method:"POST"}).then(function(t){return t.json()})},denyUser:function(t){var e=t.id,n=t.credentials,i=function(t){return"/api/v1/follow_requests/".concat(t,"/reject")}(e);return vt(i,{headers:wt(n),method:"POST"}).then(function(t){return t.json()})},suggestions:function(t){var e=t.credentials;return vt("/api/v1/suggestions",{headers:wt(e)}).then(function(t){return t.json()})},markNotificationsAsSeen:function(t){var e=t.id,n=t.credentials,i=t.single,o=void 0!==i&&i,r=new FormData;return o?r.append("id",e):r.append("max_id",e),vt("/api/v1/pleroma/notifications/read",{body:r,headers:wt(n),method:"POST"}).then(function(t){return t.json()})},dismissNotification:function(t){var e=t.credentials,n=t.id;return bt({url:W(n),method:"POST",payload:{id:n},credentials:e})},vote:function(t){var e,n=t.pollId,i=t.choices,o=t.credentials;return(new FormData).append("choices",i),bt({url:(e=encodeURIComponent(n),"/api/v1/polls/".concat(e,"/votes")),method:"POST",credentials:o,payload:{choices:i}})},fetchPoll:function(t){var e,n=t.pollId,i=t.credentials;return bt({url:(e=encodeURIComponent(n),"/api/v1/polls/".concat(e)),method:"GET",credentials:i})},fetchFavoritedByUsers:function(t){var e=t.id,n=t.credentials;return bt({url:ot(e),method:"GET",credentials:n}).then(function(t){return t.map(x.g)})},fetchRebloggedByUsers:function(t){var e=t.id,n=t.credentials;return bt({url:rt(e),method:"GET",credentials:n}).then(function(t){return t.map(x.g)})},fetchEmojiReactions:function(t){var e=t.id,n=t.credentials;return bt({url:ut(e),credentials:n}).then(function(t){return t.map(function(t){return t.accounts=t.accounts.map(x.g),t})})},reactWithEmoji:function(t){var e=t.id,n=t.emoji,i=t.credentials;return bt({url:dt(e,n),method:"PUT",credentials:i}).then(x.f)},unreactWithEmoji:function(t){var e=t.id,n=t.emoji,i=t.credentials;return bt({url:pt(e,n),method:"DELETE",credentials:i}).then(x.f)},reportUser:function(t){var e=t.credentials,n=t.userId,i=t.statusIds,o=t.comment,r=t.forward;return bt({url:"/api/v1/reports",method:"POST",payload:{account_id:n,status_ids:i,comment:o,forward:r},credentials:e})},updateNotificationSettings:function(t){var e=t.credentials,n=t.settings,i=new FormData;return _()(n,function(t,e){i.append(e,t)}),vt("/api/pleroma/notification_settings",{headers:wt(e),method:"PUT",body:i}).then(function(t){return t.json()})},search2:function(t){var e=t.credentials,n=t.q,i=t.resolve,o=t.limit,r=t.offset,s=t.following,a="/api/v2/search",c=[];n&&c.push(["q",encodeURIComponent(n)]),i&&c.push(["resolve",i]),o&&c.push(["limit",o]),r&&c.push(["offset",r]),s&&c.push(["following",!0]),c.push(["with_relationships",!0]);var l=b()(c,function(t){return"".concat(t[0],"=").concat(t[1])}).join("&");return a+="?".concat(l),vt(a,{headers:wt(e)}).then(function(t){if(t.ok)return t;throw new Error("Error fetching search result",t)}).then(function(t){return t.json()}).then(function(t){return t.accounts=t.accounts.slice(0,o).map(function(t){return Object(x.g)(t)}),t.statuses=t.statuses.slice(0,o).map(function(t){return Object(x.f)(t)}),t})},searchUsers:function(t){var e=t.credentials,n=t.query;return bt({url:"/api/v1/accounts/search",params:{q:n,resolve:!0},credentials:e}).then(function(t){return t.map(x.g)})},fetchKnownDomains:function(t){var e=t.credentials;return bt({url:"/api/v1/instance/peers",credentials:e})},fetchDomainMutes:function(t){var e=t.credentials;return bt({url:"/api/v1/domain_blocks",credentials:e})},muteDomain:function(t){var e=t.domain,n=t.credentials;return bt({url:"/api/v1/domain_blocks",method:"POST",payload:{domain:e},credentials:n})},unmuteDomain:function(t){var e=t.domain,n=t.credentials;return bt({url:"/api/v1/domain_blocks",method:"DELETE",payload:{domain:e},credentials:n})},chats:function(t){var e=t.credentials;return vt("/api/v1/pleroma/chats",{headers:wt(e)}).then(function(t){return t.json()}).then(function(t){return{chats:t.map(x.b).filter(function(t){return t})}})},getOrCreateChat:function(t){var e,n=t.accountId,i=t.credentials;return bt({url:(e=n,"/api/v1/pleroma/chats/by-account-id/".concat(e)),method:"POST",credentials:i})},chatMessages:function(t){var e=t.id,n=t.credentials,i=t.maxId,o=t.sinceId,r=t.limit,s=void 0===r?20:r,a=ft(e),c=[i&&"max_id=".concat(i),o&&"since_id=".concat(o),s&&"limit=".concat(s)].filter(function(t){return t}).join("&");return bt({url:a+=c?"?"+c:"",method:"GET",credentials:n})},sendChatMessage:function(t){var e=t.id,n=t.content,i=t.mediaId,o=void 0===i?null:i,r=t.credentials,s={content:n};return o&&(s.media_id=o),bt({url:ft(e),method:"POST",payload:s,credentials:r})},readChat:function(t){var e=t.id,n=t.lastReadId,i=t.credentials;return bt({url:ht(e),method:"POST",payload:{last_read_id:n},credentials:i})},deleteChatMessage:function(t){var e=t.chatId,n=t.messageId,i=t.credentials;return bt({url:mt(e,n),method:"DELETE",credentials:i})}};e.c=Ot},,,,,,function(t,e,n){"use strict";var i=n(97),o=n.n(i),r=function(t){return t&&t.includes("@")};e.a=function(t,e,n){var i=!e||r(e)||o()(n,e);return{name:i?"external-user-profile":"user-profile",params:i?{id:t}:{name:e}}}},function(t,e,n){"use strict";n.r(e);var i={props:["user","betterShadow","compact"],data:function(){return{showPlaceholder:!1,defaultAvatar:"".concat(this.$store.state.instance.server+this.$store.state.instance.defaultAvatar)}},components:{StillImage:n(62).a},methods:{imgSrc:function(t){return!t||this.showPlaceholder?this.defaultAvatar:t},imageLoadError:function(){this.showPlaceholder=!0}}},o=n(0);var r=function(t){n(415)},s=Object(o.a)(i,function(){var t=this.$createElement;return(this._self._c||t)("StillImage",{staticClass:"Avatar",class:{"avatar-compact":this.compact,"better-shadow":this.betterShadow},attrs:{alt:this.user.screen_name,title:this.user.screen_name,src:this.imgSrc(this.user.profile_image_url_original),"image-load-error":this.imageLoadError}})},[],!1,r,null,null);e.default=s.exports},function(t,e,n){"use strict";n.d(e,"d",function(){return d}),n.d(e,"b",function(){return h}),n.d(e,"c",function(){return g}),n.d(e,"a",function(){return v}),n.d(e,"e",function(){return b});var i=n(97),o=n.n(i),r=n(98),s=n.n(r),a=n(37),c=n.n(a),l=n(99),u=n(100),d=function(t){return t.state.statuses.notifications.data},p=function(t){var e=t.rootState||t.state;return[e.config.notificationVisibility.likes&&"like",e.config.notificationVisibility.mentions&&"mention",e.config.notificationVisibility.repeats&&"repeat",e.config.notificationVisibility.follows&&"follow",e.config.notificationVisibility.followRequest&&"follow_request",e.config.notificationVisibility.moves&&"move",e.config.notificationVisibility.emojiReactions&&"pleroma:emoji_reaction"].filter(function(t){return t})},f=["like","mention","repeat","pleroma:emoji_reaction"],h=function(t){return o()(f,t)},m=function(t,e){var n=Number(t.id),i=Number(e.id),o=!Number.isNaN(n),r=!Number.isNaN(i);return o&&r?n>i?-1:1:o&&!r?1:!o&&r?-1:t.id>e.id?-1:1},g=function(t,e){var n=t.rootState||t.state;if(!e.seen&&p(t).includes(e.type)&&("mention"!==e.type||!function(t,e){if(e.status)return e.status.muted||Object(l.a)(e.status,t.rootGetters.mergedConfig.muteWords).length>0}(t,e))){var i=w(e,t.rootGetters.i18n);Object(u.a)(n,i)}},v=function(t,e){var n=d(t).map(function(t){return t}).sort(m);return(n=s()(n,"seen")).filter(function(n){return(e||p(t)).includes(n.type)})},b=function(t){return c()(v(t),function(t){return!t.seen})},w=function(t,e){var n,i={tag:t.id},o=t.status,r=t.from_profile.name;switch(i.title=r,i.icon=t.from_profile.profile_image_url,t.type){case"like":n="favorited_you";break;case"repeat":n="repeated_you";break;case"follow":n="followed_you";break;case"move":n="migrated_to";break;case"follow_request":n="follow_request"}return"pleroma:emoji_reaction"===t.type?i.body=e.t("notifications.reacted_with",[t.emoji]):n?i.body=e.t("notifications."+n):h(t.type)&&(i.body=t.status.text),o&&o.attachments&&o.attachments.length>0&&!o.nsfw&&o.attachments[0].mimetype.startsWith("image/")&&(i.image=o.attachments[0].url),i}},,function(t,e,n){"use strict";var i=function(t){return t.match(/text\/html/)?"html":t.match(/image/)?"image":t.match(/video/)?"video":t.match(/audio/)?"audio":"unknown"},o={fileType:i,fileMatchesSomeType:function(t,e){return t.some(function(t){return i(e.mimetype)===t})}};e.a=o},function(t,e,n){"use strict";n.r(e);var i={name:"Popover",props:{trigger:String,placement:String,boundTo:Object,boundToSelector:String,margin:Object,offset:Object,popoverClass:String},data:function(){return{hidden:!0,styles:{opacity:0},oldSize:{width:0,height:0}}},methods:{containerBoundingClientRect:function(){return(this.boundToSelector?this.$el.closest(this.boundToSelector):this.$el.offsetParent).getBoundingClientRect()},updateStyles:function(){if(this.hidden)this.styles={opacity:0};else{var t=this.$refs.trigger&&this.$refs.trigger.children[0]||this.$el,e=t.getBoundingClientRect(),n=e.left+.5*e.width,i=e.top,o=this.$refs.content,r=this.boundTo&&("container"===this.boundTo.x||"container"===this.boundTo.y)&&this.containerBoundingClientRect(),s=this.margin||{},a=this.boundTo&&"container"===this.boundTo.x?{min:r.left+(s.left||0),max:r.right-(s.right||0)}:{min:0+(s.left||10),max:window.innerWidth-(s.right||10)},c=this.boundTo&&"container"===this.boundTo.y?{min:r.top+(s.top||0),max:r.bottom-(s.bottom||0)}:{min:0+(s.top||50),max:window.innerHeight-(s.bottom||5)},l=0;n-.5*o.offsetWidtha.max&&(l-=n+l+.5*o.offsetWidth-a.max);var u="bottom"!==this.placement;i+o.offsetHeight>c.max&&(u=!0),i-o.offsetHeight0?n("span",[t._v(t._s(t.status.fave_num))]):t._e()]):n("div",[n("i",{staticClass:"button-icon favorite-button",class:t.classes,attrs:{title:t.$t("tool_tip.favorite")}}),t._v(" "),!t.mergedConfig.hidePostStats&&t.status.fave_num>0?n("span",[t._v(t._s(t.status.fave_num))]):t._e()])},[],!1,f,null,null).exports,m=n(22);function g(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var v={props:["status"],data:function(){return{filterWord:""}},components:{Popover:m.default},methods:{addReaction:function(t,e,n){var i=this.status.emoji_reactions.find(function(t){return t.name===e});i&&i.me?this.$store.dispatch("unreactWithEmoji",{id:this.status.id,emoji:e}):this.$store.dispatch("reactWithEmoji",{id:this.status.id,emoji:e}),n()}},computed:function(t){for(var e=1;e0?n("span",[t._v(t._s(t.status.repeat_num))]):t._e()]:[n("i",{staticClass:"button-icon icon-lock",class:t.classes,attrs:{title:t.$t("timeline.no_retweet_hint")}})]],2):t.loggedIn?t._e():n("div",[n("i",{staticClass:"button-icon icon-retweet",class:t.classes,attrs:{title:t.$t("tool_tip.repeat")}}),t._v(" "),!t.mergedConfig.hidePostStats&&t.status.repeat_num>0?n("span",[t._v(t._s(t.status.repeat_num))]):t._e()])},[],!1,y,null,null).exports,C={props:["status"],components:{Popover:m.default},methods:{deleteStatus:function(){window.confirm(this.$t("status.delete_confirm"))&&this.$store.dispatch("deleteStatus",{id:this.status.id})},pinStatus:function(){var t=this;this.$store.dispatch("pinStatus",this.status.id).then(function(){return t.$emit("onSuccess")}).catch(function(e){return t.$emit("onError",e.error.error)})},unpinStatus:function(){var t=this;this.$store.dispatch("unpinStatus",this.status.id).then(function(){return t.$emit("onSuccess")}).catch(function(e){return t.$emit("onError",e.error.error)})},muteConversation:function(){var t=this;this.$store.dispatch("muteConversation",this.status.id).then(function(){return t.$emit("onSuccess")}).catch(function(e){return t.$emit("onError",e.error.error)})},unmuteConversation:function(){var t=this;this.$store.dispatch("unmuteConversation",this.status.id).then(function(){return t.$emit("onSuccess")}).catch(function(e){return t.$emit("onError",e.error.error)})},copyLink:function(){var t=this;navigator.clipboard.writeText(this.statusLink).then(function(){return t.$emit("onSuccess")}).catch(function(e){return t.$emit("onError",e.error.error)})},bookmarkStatus:function(){var t=this;this.$store.dispatch("bookmark",{id:this.status.id}).then(function(){return t.$emit("onSuccess")}).catch(function(e){return t.$emit("onError",e.error.error)})},unbookmarkStatus:function(){var t=this;this.$store.dispatch("unbookmark",{id:this.status.id}).then(function(){return t.$emit("onSuccess")}).catch(function(e){return t.$emit("onError",e.error.error)})}},computed:{currentUser:function(){return this.$store.state.users.currentUser},canDelete:function(){if(this.currentUser)return this.currentUser.rights.moderator||this.currentUser.rights.admin||this.status.user.id===this.currentUser.id},ownStatus:function(){return this.status.user.id===this.currentUser.id},canPin:function(){return this.ownStatus&&("public"===this.status.visibility||"unlisted"===this.status.visibility)},canMute:function(){return!!this.currentUser},statusLink:function(){return"".concat(this.$store.state.instance.server).concat(this.$router.resolve({name:"conversation",params:{id:this.status.id}}).href)}}};var S=function(t){n(385)},j=Object(p.a)(C,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("Popover",{staticClass:"extra-button-popover",attrs:{trigger:"click",placement:"top","bound-to":{x:"container"}},scopedSlots:t._u([{key:"content",fn:function(e){var i=e.close;return n("div",{},[n("div",{staticClass:"dropdown-menu"},[t.canMute&&!t.status.thread_muted?n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:function(e){return e.preventDefault(),t.muteConversation(e)}}},[n("i",{staticClass:"icon-eye-off"}),n("span",[t._v(t._s(t.$t("status.mute_conversation")))])]):t._e(),t._v(" "),t.canMute&&t.status.thread_muted?n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:function(e){return e.preventDefault(),t.unmuteConversation(e)}}},[n("i",{staticClass:"icon-eye-off"}),n("span",[t._v(t._s(t.$t("status.unmute_conversation")))])]):t._e(),t._v(" "),!t.status.pinned&&t.canPin?n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:[function(e){return e.preventDefault(),t.pinStatus(e)},i]}},[n("i",{staticClass:"icon-pin"}),n("span",[t._v(t._s(t.$t("status.pin")))])]):t._e(),t._v(" "),t.status.pinned&&t.canPin?n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:[function(e){return e.preventDefault(),t.unpinStatus(e)},i]}},[n("i",{staticClass:"icon-pin"}),n("span",[t._v(t._s(t.$t("status.unpin")))])]):t._e(),t._v(" "),t.status.bookmarked?t._e():n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:[function(e){return e.preventDefault(),t.bookmarkStatus(e)},i]}},[n("i",{staticClass:"icon-bookmark-empty"}),n("span",[t._v(t._s(t.$t("status.bookmark")))])]),t._v(" "),t.status.bookmarked?n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:[function(e){return e.preventDefault(),t.unbookmarkStatus(e)},i]}},[n("i",{staticClass:"icon-bookmark"}),n("span",[t._v(t._s(t.$t("status.unbookmark")))])]):t._e(),t._v(" "),t.canDelete?n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:[function(e){return e.preventDefault(),t.deleteStatus(e)},i]}},[n("i",{staticClass:"icon-cancel"}),n("span",[t._v(t._s(t.$t("status.delete")))])]):t._e(),t._v(" "),n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:[function(e){return e.preventDefault(),t.copyLink(e)},i]}},[n("i",{staticClass:"icon-share"}),n("span",[t._v(t._s(t.$t("status.copy_link")))])])])])}}])},[t._v(" "),n("i",{staticClass:"icon-ellipsis button-icon",attrs:{slot:"trigger"},slot:"trigger"})])},[],!1,S,null,null).exports,O=n(42),P=n(28),$=n(18),T=n(114),I=n(44),E=n(34),M=n(25),U=n.n(M),F={name:"StatusPopover",props:["statusId"],data:function(){return{error:!1}},computed:{status:function(){return U()(this.$store.state.statuses.allStatuses,{id:this.statusId})}},components:{Status:function(){return Promise.resolve().then(n.bind(null,33))},Popover:function(){return Promise.resolve().then(n.bind(null,22))}},methods:{enter:function(){var t=this;if(!this.status){if(!this.statusId)return void(this.error=!0);this.$store.dispatch("fetchStatus",this.statusId).then(function(e){return t.error=!1}).catch(function(e){return t.error=!0})}}}};var D=function(t){n(427)},L=Object(p.a)(F,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("Popover",{attrs:{trigger:"hover","popover-class":"popover-default status-popover","bound-to":{x:"container"}},on:{show:t.enter}},[n("template",{slot:"trigger"},[t._t("default")],2),t._v(" "),n("div",{attrs:{slot:"content"},slot:"content"},[t.status?n("Status",{attrs:{"is-preview":!0,statusoid:t.status,compact:!0}}):t.error?n("div",{staticClass:"status-preview-no-content faint"},[t._v("\n "+t._s(t.$t("status.status_unavailable"))+"\n ")]):n("div",{staticClass:"status-preview-no-content"},[n("i",{staticClass:"icon-spin4 animate-spin"})])],1)],2)},[],!1,D,null,null).exports,N={name:"UserListPopover",props:["users"],components:{Popover:function(){return Promise.resolve().then(n.bind(null,22))},UserAvatar:function(){return Promise.resolve().then(n.bind(null,18))}},computed:{usersCapped:function(){return this.users.slice(0,16)}}};var R=function(t){n(429)},A=Object(p.a)(N,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("Popover",{attrs:{trigger:"hover",placement:"top",offset:{y:5}}},[n("template",{slot:"trigger"},[t._t("default")],2),t._v(" "),n("div",{staticClass:"user-list-popover",attrs:{slot:"content"},slot:"content"},[t.users.length?n("div",t._l(t.usersCapped,function(e){return n("div",{key:e.id,staticClass:"user-list-row"},[n("UserAvatar",{staticClass:"avatar-small",attrs:{user:e,compact:!0}}),t._v(" "),n("div",{staticClass:"user-list-names"},[n("span",{domProps:{innerHTML:t._s(e.name_html)}}),t._v(" "),n("span",{staticClass:"user-list-screen-name"},[t._v(t._s(e.screen_name))])])],1)}),0):n("div",[n("i",{staticClass:"icon-spin4 animate-spin"})])])],2)},[],!1,R,null,null).exports,B={name:"EmojiReactions",components:{UserAvatar:$.default,UserListPopover:A},props:["status"],data:function(){return{showAll:!1}},computed:{tooManyReactions:function(){return this.status.emoji_reactions.length>12},emojiReactions:function(){return this.showAll?this.status.emoji_reactions:this.status.emoji_reactions.slice(0,12)},showMoreString:function(){return"+".concat(this.status.emoji_reactions.length-12)},accountsForEmoji:function(){return this.status.emoji_reactions.reduce(function(t,e){return t[e.name]=e.accounts||[],t},{})},loggedIn:function(){return!!this.$store.state.users.currentUser}},methods:{toggleShowAll:function(){this.showAll=!this.showAll},reactedWith:function(t){return this.status.emoji_reactions.find(function(e){return e.name===t}).me},fetchEmojiReactionsByIfMissing:function(){this.status.emoji_reactions.find(function(t){return!t.accounts})&&this.$store.dispatch("fetchEmojiReactionsBy",this.status.id)},reactWith:function(t){this.$store.dispatch("reactWithEmoji",{id:this.status.id,emoji:t})},unreact:function(t){this.$store.dispatch("unreactWithEmoji",{id:this.status.id,emoji:t})},emojiOnClick:function(t,e){this.loggedIn&&(this.reactedWith(t)?this.unreact(t):this.reactWith(t))}}};var z=function(t){n(431)},H=Object(p.a)(B,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"emoji-reactions"},[t._l(t.emojiReactions,function(e){return n("UserListPopover",{key:e.name,attrs:{users:t.accountsForEmoji[e.name]}},[n("button",{staticClass:"emoji-reaction btn btn-default",class:{"picked-reaction":t.reactedWith(e.name),"not-clickable":!t.loggedIn},on:{click:function(n){return t.emojiOnClick(e.name,n)},mouseenter:function(e){return t.fetchEmojiReactionsByIfMissing()}}},[n("span",{staticClass:"reaction-emoji"},[t._v(t._s(e.name))]),t._v(" "),n("span",[t._v(t._s(e.count))])])])}),t._v(" "),t.tooManyReactions?n("a",{staticClass:"emoji-reaction-expand faint",attrs:{href:"javascript:void(0)"},on:{click:t.toggleShowAll}},[t._v("\n "+t._s(t.showAll?t.$t("general.show_less"):t.showMoreString)+"\n ")]):t._e()],2)},[],!1,z,null,null).exports,q=n(17),W=n(46),V=n(99);function G(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var K={name:"Status",components:{FavoriteButton:h,ReactButton:w,RetweetButton:k,ExtraButtons:j,PostStatusForm:O.a,UserCard:P.a,UserAvatar:$.default,AvatarList:T.a,Timeago:I.a,StatusPopover:L,UserListPopover:A,EmojiReactions:H,StatusContent:E.a},props:["statusoid","expandable","inConversation","focused","highlight","compact","replies","isPreview","noHeading","inlineExpanded","showPinned","inProfile","profileUserId"],data:function(){return{replying:!1,unmuted:!1,userExpanded:!1,error:null}},computed:function(t){for(var e=1;e0,r=(this.inProfile&&(!e&&t.user.id===this.profileUserId||e&&e.user.id===this.profileUserId)||this.inConversation&&t.thread_muted)&&!this.muteWordHits.length>0;return!this.unmuted&&!r&&o},hideFilteredStatuses:function(){return this.mergedConfig.hideFilteredStatuses},hideStatus:function(){return this.deleted||this.muted&&this.hideFilteredStatuses},isFocused:function(){return!!this.focused||!!this.inConversation&&this.status.id===this.highlight},isReply:function(){return!(!this.status.in_reply_to_status_id||!this.status.in_reply_to_user_id)},replyToName:function(){if(this.status.in_reply_to_screen_name)return this.status.in_reply_to_screen_name;var t=this.$store.getters.findUser(this.status.in_reply_to_user_id);return t&&t.screen_name},replySubject:function(){if(!this.status.summary)return"";var t=c()(this.status.summary),e=this.mergedConfig.subjectLineBehavior,n=t.match(/^re[: ]/i);return"noop"!==e&&n||"masto"===e?t:"email"===e?"re: ".concat(t):"noop"===e?"":void 0},combinedFavsAndRepeatsUsers:function(){var t=[].concat(this.statusFromGlobalRepository.favoritedBy,this.statusFromGlobalRepository.rebloggedBy);return s()(t,"id")},tags:function(){return this.status.tags.filter(function(t){return t.hasOwnProperty("name")}).map(function(t){return t.name}).join(" ")},hidePostStats:function(){return this.mergedConfig.hidePostStats}},Object(l.c)(["mergedConfig"]),{},Object(l.e)({betterShadow:function(t){return t.interface.browserSupport.cssFilter},currentUser:function(t){return t.users.currentUser}})),methods:{visibilityIcon:function(t){switch(t){case"private":return"icon-lock";case"unlisted":return"icon-lock-open-alt";case"direct":return"icon-mail-alt";default:return"icon-globe"}},showError:function(t){this.error=t},clearError:function(){this.error=void 0},toggleReplying:function(){this.replying=!this.replying},gotoOriginal:function(t){this.inConversation&&this.$emit("goto",t)},toggleExpanded:function(){this.$emit("toggleExpanded")},toggleMute:function(){this.unmuted=!this.unmuted},toggleUserExpanded:function(){this.userExpanded=!this.userExpanded},generateUserProfileLink:function(t,e){return Object(q.a)(t,e,this.$store.state.instance.restrictedNicknames)}},watch:{highlight:function(t){if(this.status.id===t){var e=this.$el.getBoundingClientRect();e.top<100?window.scrollBy(0,e.top-100):e.height>=window.innerHeight-50?window.scrollBy(0,e.top-100):e.bottom>window.innerHeight-50&&window.scrollBy(0,e.bottom-window.innerHeight+50)}},"status.repeat_num":function(t){this.isFocused&&this.statusFromGlobalRepository.rebloggedBy&&this.statusFromGlobalRepository.rebloggedBy.length!==t&&this.$store.dispatch("fetchRepeats",this.status.id)},"status.fave_num":function(t){this.isFocused&&this.statusFromGlobalRepository.favoritedBy&&this.statusFromGlobalRepository.favoritedBy.length!==t&&this.$store.dispatch("fetchFavs",this.status.id)}},filters:{capitalize:function(t){return t.charAt(0).toUpperCase()+t.slice(1)}}};var Y=function(t){n(374)},J=Object(p.a)(K,function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.hideStatus?t._e():n("div",{staticClass:"Status",class:[{"-focused":t.isFocused},{"-conversation":t.inlineExpanded}]},[t.error?n("div",{staticClass:"alert error"},[t._v("\n "+t._s(t.error)+"\n "),n("i",{staticClass:"button-icon icon-cancel",on:{click:t.clearError}})]):t._e(),t._v(" "),t.muted&&!t.isPreview?[n("div",{staticClass:"status-csontainer muted"},[n("small",{staticClass:"status-username"},[t.muted&&t.retweet?n("i",{staticClass:"button-icon icon-retweet"}):t._e(),t._v(" "),n("router-link",{attrs:{to:t.userProfileLink}},[t._v("\n "+t._s(t.status.user.screen_name)+"\n ")])],1),t._v(" "),t.showReasonMutedThread?n("small",{staticClass:"mute-thread"},[t._v("\n "+t._s(t.$t("status.thread_muted"))+"\n ")]):t._e(),t._v(" "),t.showReasonMutedThread&&t.muteWordHits.length>0?n("small",{staticClass:"mute-thread"},[t._v("\n "+t._s(t.$t("status.thread_muted_and_words"))+"\n ")]):t._e(),t._v(" "),n("small",{staticClass:"mute-words",attrs:{title:t.muteWordHits.join(", ")}},[t._v("\n "+t._s(t.muteWordHits.join(", "))+"\n ")]),t._v(" "),n("a",{staticClass:"unmute",attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.toggleMute(e)}}},[n("i",{staticClass:"button-icon icon-eye-off"})])])]:[t.showPinned?n("div",{staticClass:"pin"},[n("i",{staticClass:"fa icon-pin faint"}),t._v(" "),n("span",{staticClass:"faint"},[t._v(t._s(t.$t("status.pinned")))])]):t._e(),t._v(" "),!t.retweet||t.noHeading||t.inConversation?t._e():n("div",{staticClass:"status-container repeat-info",class:[t.repeaterClass,{highlighted:t.repeaterStyle}],style:[t.repeaterStyle]},[t.retweet?n("UserAvatar",{staticClass:"left-side repeater-avatar",attrs:{"better-shadow":t.betterShadow,user:t.statusoid.user}}):t._e(),t._v(" "),n("div",{staticClass:"right-side faint"},[n("span",{staticClass:"status-username repeater-name",attrs:{title:t.retweeter}},[t.retweeterHtml?n("router-link",{attrs:{to:t.retweeterProfileLink},domProps:{innerHTML:t._s(t.retweeterHtml)}}):n("router-link",{attrs:{to:t.retweeterProfileLink}},[t._v(t._s(t.retweeter))])],1),t._v(" "),n("i",{staticClass:"fa icon-retweet retweeted",attrs:{title:t.$t("tool_tip.repeat")}}),t._v("\n "+t._s(t.$t("timeline.repeated"))+"\n ")])],1),t._v(" "),n("div",{staticClass:"status-container",class:[t.userClass,{highlighted:t.userStyle,"-repeat":t.retweet&&!t.inConversation}],style:[t.userStyle],attrs:{"data-tags":t.tags}},[t.noHeading?t._e():n("div",{staticClass:"left-side"},[n("router-link",{attrs:{to:t.userProfileLink},nativeOn:{"!click":function(e){return e.stopPropagation(),e.preventDefault(),t.toggleUserExpanded(e)}}},[n("UserAvatar",{attrs:{compact:t.compact,"better-shadow":t.betterShadow,user:t.status.user}})],1)],1),t._v(" "),n("div",{staticClass:"right-side"},[t.userExpanded?n("UserCard",{staticClass:"usercard",attrs:{"user-id":t.status.user.id,rounded:!0,bordered:!0}}):t._e(),t._v(" "),t.noHeading?t._e():n("div",{staticClass:"status-heading"},[n("div",{staticClass:"heading-name-row"},[n("div",{staticClass:"heading-left"},[t.status.user.name_html?n("h4",{staticClass:"status-username",attrs:{title:t.status.user.name},domProps:{innerHTML:t._s(t.status.user.name_html)}}):n("h4",{staticClass:"status-username",attrs:{title:t.status.user.name}},[t._v("\n "+t._s(t.status.user.name)+"\n ")]),t._v(" "),n("router-link",{staticClass:"account-name",attrs:{title:t.status.user.screen_name,to:t.userProfileLink}},[t._v("\n "+t._s(t.status.user.screen_name)+"\n ")]),t._v(" "),t.status.user&&t.status.user.favicon?n("img",{staticClass:"status-favicon",attrs:{src:t.status.user.favicon}}):t._e()],1),t._v(" "),n("span",{staticClass:"heading-right"},[n("router-link",{staticClass:"timeago faint-link",attrs:{to:{name:"conversation",params:{id:t.status.id}}}},[n("Timeago",{attrs:{time:t.status.created_at,"auto-update":60}})],1),t._v(" "),t.status.visibility?n("div",{staticClass:"button-icon visibility-icon"},[n("i",{class:t.visibilityIcon(t.status.visibility),attrs:{title:t._f("capitalize")(t.status.visibility)}})]):t._e(),t._v(" "),t.status.is_local||t.isPreview?t._e():n("a",{staticClass:"source_url",attrs:{href:t.status.external_url,target:"_blank",title:"Source"}},[n("i",{staticClass:"button-icon icon-link-ext-alt"})]),t._v(" "),t.expandable&&!t.isPreview?[n("a",{attrs:{href:"#",title:"Expand"},on:{click:function(e){return e.preventDefault(),t.toggleExpanded(e)}}},[n("i",{staticClass:"button-icon icon-plus-squared"})])]:t._e(),t._v(" "),t.unmuted?n("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.toggleMute(e)}}},[n("i",{staticClass:"button-icon icon-eye-off"})]):t._e()],2)]),t._v(" "),n("div",{staticClass:"heading-reply-row"},[t.isReply?n("div",{staticClass:"reply-to-and-accountname"},[t.isPreview?n("span",{staticClass:"reply-to-no-popover"},[n("span",{staticClass:"reply-to-text"},[t._v(t._s(t.$t("status.reply_to")))])]):n("StatusPopover",{staticClass:"reply-to-popover",class:{"-strikethrough":!t.status.parent_visible},staticStyle:{"min-width":"0"},attrs:{"status-id":t.status.parent_visible&&t.status.in_reply_to_status_id}},[n("a",{staticClass:"reply-to",attrs:{href:"#","aria-label":t.$t("tool_tip.reply")},on:{click:function(e){return e.preventDefault(),t.gotoOriginal(t.status.in_reply_to_status_id)}}},[n("i",{staticClass:"button-icon reply-button icon-reply"}),t._v(" "),n("span",{staticClass:"faint-link reply-to-text"},[t._v("\n "+t._s(t.$t("status.reply_to"))+"\n ")])])]),t._v(" "),n("router-link",{staticClass:"reply-to-link",attrs:{title:t.replyToName,to:t.replyProfileLink}},[t._v("\n "+t._s(t.replyToName)+"\n ")]),t._v(" "),t.replies&&t.replies.length?n("span",{staticClass:"faint replies-separator"},[t._v("\n -\n ")]):t._e()],1):t._e(),t._v(" "),t.inConversation&&!t.isPreview&&t.replies&&t.replies.length?n("div",{staticClass:"replies"},[n("span",{staticClass:"faint"},[t._v(t._s(t.$t("status.replies_list")))]),t._v(" "),t._l(t.replies,function(e){return n("StatusPopover",{key:e.id,attrs:{"status-id":e.id}},[n("a",{staticClass:"reply-link",attrs:{href:"#"},on:{click:function(n){return n.preventDefault(),t.gotoOriginal(e.id)}}},[t._v(t._s(e.name))])])})],2):t._e()])]),t._v(" "),n("StatusContent",{attrs:{status:t.status,"no-heading":t.noHeading,highlight:t.highlight,focused:t.isFocused}}),t._v(" "),n("transition",{attrs:{name:"fade"}},[!t.hidePostStats&&t.isFocused&&t.combinedFavsAndRepeatsUsers.length>0?n("div",{staticClass:"favs-repeated-users"},[n("div",{staticClass:"stats"},[t.statusFromGlobalRepository.rebloggedBy&&t.statusFromGlobalRepository.rebloggedBy.length>0?n("UserListPopover",{attrs:{users:t.statusFromGlobalRepository.rebloggedBy}},[n("div",{staticClass:"stat-count"},[n("a",{staticClass:"stat-title"},[t._v(t._s(t.$t("status.repeats")))]),t._v(" "),n("div",{staticClass:"stat-number"},[t._v("\n "+t._s(t.statusFromGlobalRepository.rebloggedBy.length)+"\n ")])])]):t._e(),t._v(" "),t.statusFromGlobalRepository.favoritedBy&&t.statusFromGlobalRepository.favoritedBy.length>0?n("UserListPopover",{attrs:{users:t.statusFromGlobalRepository.favoritedBy}},[n("div",{staticClass:"stat-count"},[n("a",{staticClass:"stat-title"},[t._v(t._s(t.$t("status.favorites")))]),t._v(" "),n("div",{staticClass:"stat-number"},[t._v("\n "+t._s(t.statusFromGlobalRepository.favoritedBy.length)+"\n ")])])]):t._e(),t._v(" "),n("div",{staticClass:"avatar-row"},[n("AvatarList",{attrs:{users:t.combinedFavsAndRepeatsUsers}})],1)],1)]):t._e()]),t._v(" "),!t.mergedConfig.emojiReactionsOnTimeline&&!t.isFocused||t.noHeading||t.isPreview?t._e():n("EmojiReactions",{attrs:{status:t.status}}),t._v(" "),t.noHeading||t.isPreview?t._e():n("div",{staticClass:"status-actions"},[n("div",[t.loggedIn?n("i",{staticClass:"button-icon button-reply icon-reply",class:{"-active":t.replying},attrs:{title:t.$t("tool_tip.reply")},on:{click:function(e){return e.preventDefault(),t.toggleReplying(e)}}}):n("i",{staticClass:"button-icon button-reply -disabled icon-reply",attrs:{title:t.$t("tool_tip.reply")}}),t._v(" "),t.status.replies_count>0?n("span",[t._v(t._s(t.status.replies_count))]):t._e()]),t._v(" "),n("retweet-button",{attrs:{visibility:t.status.visibility,"logged-in":t.loggedIn,status:t.status}}),t._v(" "),n("favorite-button",{attrs:{"logged-in":t.loggedIn,status:t.status}}),t._v(" "),t.loggedIn?n("ReactButton",{attrs:{status:t.status}}):t._e(),t._v(" "),n("extra-buttons",{attrs:{status:t.status},on:{onError:t.showError,onSuccess:t.clearError}})],1)],1)]),t._v(" "),t.replying?n("div",{staticClass:"status-container reply-form"},[n("PostStatusForm",{staticClass:"reply-body",attrs:{"reply-to":t.status.id,attentions:t.status.attentions,"replied-user":t.status.user,"copy-message-scope":t.status.visibility,subject:t.replySubject},on:{posted:t.toggleReplying}})],1):t._e()]],2)},[],!1,Y,null,null);e.default=J.exports},function(t,e,n){"use strict";var i=n(1),o=n.n(i),r=n(43),s=n(15),a=n.n(s),c=n(130),l=n.n(c),u={name:"Poll",props:["basePoll"],components:{Timeago:n(44).a},data:function(){return{loading:!1,choices:[]}},created:function(){this.$store.state.polls.pollsObject[this.pollId]||this.$store.dispatch("mergeOrAddPoll",this.basePoll),this.$store.dispatch("trackPoll",this.pollId)},destroyed:function(){this.$store.dispatch("untrackPoll",this.pollId)},computed:{pollId:function(){return this.basePoll.id},poll:function(){return this.$store.state.polls.pollsObject[this.pollId]||{}},options:function(){return this.poll&&this.poll.options||[]},expiresAt:function(){return this.poll&&this.poll.expires_at||0},expired:function(){return this.poll&&this.poll.expired||!1},loggedIn:function(){return this.$store.state.users.currentUser},showResults:function(){return this.poll.voted||this.expired||!this.loggedIn},totalVotesCount:function(){return this.poll.votes_count},containerClass:function(){return{loading:this.loading}},choiceIndices:function(){return this.choices.map(function(t,e){return t&&e}).filter(function(t){return"number"==typeof t})},isDisabled:function(){var t=0===this.choiceIndices.length;return this.loading||t}},methods:{percentageForOption:function(t){return 0===this.totalVotesCount?0:Math.round(t/this.totalVotesCount*100)},resultTitle:function(t){return"".concat(t.votes_count,"/").concat(this.totalVotesCount," ").concat(this.$t("polls.votes"))},fetchPoll:function(){this.$store.dispatch("refreshPoll",{id:this.statusId,pollId:this.poll.id})},activateOption:function(t){var e=this.$el.querySelectorAll("input"),n=this.$el.querySelector('input[value="'.concat(t,'"]'));this.poll.multiple?n.checked=!n.checked:(l()(e,function(t){t.checked=!1}),n.checked=!0),this.choices=a()(e,function(t){return t.checked})},optionId:function(t){return"poll".concat(this.poll.id,"-").concat(t)},vote:function(){var t=this;0!==this.choiceIndices.length&&(this.loading=!0,this.$store.dispatch("votePoll",{id:this.statusId,pollId:this.poll.id,choices:this.choiceIndices}).then(function(e){t.loading=!1}))}}},d=n(0);var p=function(t){n(407)},f=Object(d.a)(u,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"poll",class:t.containerClass},[t._l(t.options,function(e,i){return n("div",{key:i,staticClass:"poll-option"},[t.showResults?n("div",{staticClass:"option-result",attrs:{title:t.resultTitle(e)}},[n("div",{staticClass:"option-result-label"},[n("span",{staticClass:"result-percentage"},[t._v("\n "+t._s(t.percentageForOption(e.votes_count))+"%\n ")]),t._v(" "),n("span",{domProps:{innerHTML:t._s(e.title_html)}})]),t._v(" "),n("div",{staticClass:"result-fill",style:{width:t.percentageForOption(e.votes_count)+"%"}})]):n("div",{on:{click:function(e){return t.activateOption(i)}}},[t.poll.multiple?n("input",{attrs:{type:"checkbox",disabled:t.loading},domProps:{value:i}}):n("input",{attrs:{type:"radio",disabled:t.loading},domProps:{value:i}}),t._v(" "),n("label",{staticClass:"option-vote"},[n("div",[t._v(t._s(e.title))])])])])}),t._v(" "),n("div",{staticClass:"footer faint"},[t.showResults?t._e():n("button",{staticClass:"btn btn-default poll-vote-button",attrs:{type:"button",disabled:t.isDisabled},on:{click:t.vote}},[t._v("\n "+t._s(t.$t("polls.vote"))+"\n ")]),t._v(" "),n("div",{staticClass:"total"},[t._v("\n "+t._s(t.totalVotesCount)+" "+t._s(t.$t("polls.votes"))+" · \n ")]),t._v(" "),n("i18n",{attrs:{path:t.expired?"polls.expired":"polls.expires_in"}},[n("Timeago",{attrs:{time:t.expiresAt,"auto-update":60,"now-threshold":0}})],1)],1)],2)},[],!1,p,null,null).exports,h=n(111),m=n(112),g=n(17),v=n(21),b=n(7),w=n.n(b),_=n(2);function x(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var y={name:"StatusContent",props:["status","focused","noHeading","fullContent","singleLine"],data:function(){return{showingTall:this.fullContent||this.inConversation&&this.focused,showingLongSubject:!1,expandingSubject:!this.$store.getters.mergedConfig.collapseMessageWithSubject}},computed:function(t){for(var e=1;e20},longSubject:function(){return this.status.summary.length>240},mightHideBecauseSubject:function(){return!!this.status.summary&&this.localCollapseSubjectDefault},mightHideBecauseTall:function(){return this.tallStatus&&!(this.status.summary&&this.localCollapseSubjectDefault)},hideSubjectStatus:function(){return this.mightHideBecauseSubject&&!this.expandingSubject},hideTallStatus:function(){return this.mightHideBecauseTall&&!this.showingTall},showingMore:function(){return this.mightHideBecauseTall&&this.showingTall||this.mightHideBecauseSubject&&this.expandingSubject},nsfwClickthrough:function(){return!!this.status.nsfw&&(!this.status.summary||!this.localCollapseSubjectDefault)},attachmentSize:function(){return this.mergedConfig.hideAttachments&&!this.inConversation||this.mergedConfig.hideAttachmentsInConv&&this.inConversation||this.status.attachments.length>this.maxThumbnails?"hide":this.compact?"small":"normal"},galleryTypes:function(){return"hide"===this.attachmentSize?[]:this.mergedConfig.playVideosInModal?["image","video"]:["image"]},galleryAttachments:function(){var t=this;return this.status.attachments.filter(function(e){return v.a.fileMatchesSomeType(t.galleryTypes,e)})},nonGalleryAttachments:function(){var t=this;return this.status.attachments.filter(function(e){return!v.a.fileMatchesSomeType(t.galleryTypes,e)})},attachmentTypes:function(){return this.status.attachments.map(function(t){return v.a.fileType(t.mimetype)})},maxThumbnails:function(){return this.mergedConfig.maxThumbnails},postBodyHtml:function(){var t=this.status.statusnet_html;if(!this.mergedConfig.greentext)return t;try{return t.includes(">")?function(t,e){for(var n,i=new Set(["p","br","div"]),o=new Set(["p","div"]),r="",s=[],a="",c=null,l=function(){a.trim().length>0?r+=e(a):r+=a,a=""},u=function(t){l(),r+=t},d=function(t){l(),r+=t,s.push(t)},p=function(t){l(),r+=t,s[s.length-1]===t&&s.pop()},f=0;f"!==h&&null!==c)c+=h;else if(">"===h&&null!==c){var m=c+=h;c=null;var g=(n=void 0,(n=/(?:<\/(\w+)>|<(\w+)\s?[^/]*?\/?>)/gi.exec(m))&&(n[1]||n[2]));i.has(g)?"br"===g?u(m):o.has(g)&&("/"===m[1]?p(m):"/"===m[m.length-2]?u(m):d(m)):a+=m}else"\n"===h?u(h):a+=h}return c&&(a+=c),l(),r}(t,function(t){return t.includes(">")&&t.replace(/<[^>]+?>/gi,"").replace(/@\w+/gi,"").trim().startsWith(">")?"".concat(t,""):t}):t}catch(e){return console.err("Failed to process status html",e),t}}},Object(_.c)(["mergedConfig"]),{},Object(_.e)({betterShadow:function(t){return t.interface.browserSupport.cssFilter},currentUser:function(t){return t.users.currentUser}})),components:{Attachment:r.a,Poll:f,Gallery:h.a,LinkPreview:m.a},methods:{linkClicked:function(t){var e,n,i=t.target.closest(".status-content a");if(i){if(i.className.match(/mention/)){var o=i.href,r=this.status.attentions.find(function(t){return function(t,e){if(e===t.statusnet_profile_url)return!0;var n=t.screen_name.split("@"),i=w()(n,2),o=i[0],r=i[1],s=new RegExp("://"+r+"/.*"+o+"$","g");return!!e.match(s)}(t,o)});if(r){t.stopPropagation(),t.preventDefault();var s=this.generateUserProfileLink(r.id,r.screen_name);return void this.$router.push(s)}}if(i.rel.match(/(?:^|\s)tag(?:$|\s)/)||i.className.match(/hashtag/)){var a=i.dataset.tag||(e=i.href,!!(n=/tag[s]*\/(\w+)$/g.exec(e))&&n[1]);if(a){var c=this.generateTagLink(a);return void this.$router.push(c)}}window.open(i.href,"_blank")}},toggleShowMore:function(){this.mightHideBecauseTall?this.showingTall=!this.showingTall:this.mightHideBecauseSubject&&(this.expandingSubject=!this.expandingSubject)},generateUserProfileLink:function(t,e){return Object(g.a)(t,e,this.$store.state.instance.restrictedNicknames)},generateTagLink:function(t){return"/tag/".concat(t)},setMedia:function(){var t=this,e="hide"===this.attachmentSize?this.status.attachments:this.galleryAttachments;return function(){return t.$store.dispatch("setMedia",e)}}}};var k=function(t){n(405)},C=Object(d.a)(y,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"StatusContent"},[t._t("header"),t._v(" "),t.status.summary_html?n("div",{staticClass:"summary-wrapper",class:{"tall-subject":t.longSubject&&!t.showingLongSubject}},[n("div",{staticClass:"media-body summary",domProps:{innerHTML:t._s(t.status.summary_html)},on:{click:function(e){return e.preventDefault(),t.linkClicked(e)}}}),t._v(" "),t.longSubject&&t.showingLongSubject?n("a",{staticClass:"tall-subject-hider",attrs:{href:"#"},on:{click:function(e){e.preventDefault(),t.showingLongSubject=!1}}},[t._v(t._s(t.$t("status.hide_full_subject")))]):t.longSubject?n("a",{staticClass:"tall-subject-hider",class:{"tall-subject-hider_focused":t.focused},attrs:{href:"#"},on:{click:function(e){e.preventDefault(),t.showingLongSubject=!0}}},[t._v("\n "+t._s(t.$t("status.show_full_subject"))+"\n ")]):t._e()]):t._e(),t._v(" "),n("div",{staticClass:"status-content-wrapper",class:{"tall-status":t.hideTallStatus}},[t.hideTallStatus?n("a",{staticClass:"tall-status-hider",class:{"tall-status-hider_focused":t.focused},attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.toggleShowMore(e)}}},[t._v("\n "+t._s(t.$t("general.show_more"))+"\n ")]):t._e(),t._v(" "),t.hideSubjectStatus?t._e():n("div",{staticClass:"status-content media-body",class:{"single-line":t.singleLine},domProps:{innerHTML:t._s(t.postBodyHtml)},on:{click:function(e){return e.preventDefault(),t.linkClicked(e)}}}),t._v(" "),t.hideSubjectStatus?n("a",{staticClass:"cw-status-hider",attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.toggleShowMore(e)}}},[t._v("\n "+t._s(t.$t("status.show_content"))+"\n "),t.attachmentTypes.includes("image")?n("span",{staticClass:"icon-picture"}):t._e(),t._v(" "),t.attachmentTypes.includes("video")?n("span",{staticClass:"icon-video"}):t._e(),t._v(" "),t.attachmentTypes.includes("audio")?n("span",{staticClass:"icon-music"}):t._e(),t._v(" "),t.attachmentTypes.includes("unknown")?n("span",{staticClass:"icon-doc"}):t._e(),t._v(" "),t.status.poll&&t.status.poll.options?n("span",{staticClass:"icon-chart-bar"}):t._e(),t._v(" "),t.status.card?n("span",{staticClass:"icon-link"}):t._e()]):t._e(),t._v(" "),t.showingMore&&!t.fullContent?n("a",{staticClass:"status-unhider",attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.toggleShowMore(e)}}},[t._v("\n "+t._s(t.tallStatus?t.$t("general.show_less"):t.$t("status.hide_content"))+"\n ")]):t._e()]),t._v(" "),t.status.poll&&t.status.poll.options&&!t.hideSubjectStatus?n("div",[n("poll",{attrs:{"base-poll":t.status.poll}})],1):t._e(),t._v(" "),0===t.status.attachments.length||t.hideSubjectStatus&&!t.showingLongSubject?t._e():n("div",{staticClass:"attachments media-body"},[t._l(t.nonGalleryAttachments,function(e){return n("attachment",{key:e.id,staticClass:"non-gallery",attrs:{size:t.attachmentSize,nsfw:t.nsfwClickthrough,attachment:e,"allow-play":!0,"set-media":t.setMedia()}})}),t._v(" "),t.galleryAttachments.length>0?n("gallery",{attrs:{nsfw:t.nsfwClickthrough,attachments:t.galleryAttachments,"set-media":t.setMedia()}}):t._e()],2),t._v(" "),!t.status.card||t.hideSubjectStatus||t.noHeading?t._e():n("div",{staticClass:"link-preview media-body"},[n("link-preview",{attrs:{card:t.status.card,size:t.attachmentSize,nsfw:t.nsfwClickthrough}})],1),t._v(" "),t._t("footer")],2)},[],!1,k,null,null);e.a=C.exports},function(t,e,n){"use strict";n.d(e,"c",function(){return i}),n.d(e,"b",function(){return o}),n.d(e,"a",function(){return r}),n.d(e,"d",function(){return l}),n.d(e,"e",function(){return u});var i=6e4,o=60*i,r=24*o,s=7*r,a=30*r,c=365.25*r,l=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;"string"==typeof t&&(t=Date.parse(t));var n=Date.now()>t?Math.floor:Math.ceil,l=Math.abs(Date.now()-t),u={num:n(l/c),key:"time.years"};return l<1e3*e?(u.num=0,u.key="time.now"):l1&&void 0!==arguments[1]?arguments[1]:1,n=l(t,e);return n.key+="_short",n}},,,function(t,e,n){"use strict";var i=n(28),o=n(18),r=n(17),s={props:["user"],data:function(){return{userExpanded:!1}},components:{UserCard:i.a,UserAvatar:o.default},methods:{toggleUserExpanded:function(){this.userExpanded=!this.userExpanded},userProfileLink:function(t){return Object(r.a)(t.id,t.screen_name,this.$store.state.instance.restrictedNicknames)}}},a=n(0);var c=function(t){n(463)},l=Object(a.a)(s,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"basic-user-card"},[n("router-link",{attrs:{to:t.userProfileLink(t.user)}},[n("UserAvatar",{staticClass:"avatar",attrs:{user:t.user},nativeOn:{click:function(e){return e.preventDefault(),t.toggleUserExpanded(e)}}})],1),t._v(" "),t.userExpanded?n("div",{staticClass:"basic-user-card-expanded-content"},[n("UserCard",{attrs:{"user-id":t.user.id,rounded:!0,bordered:!0}})],1):n("div",{staticClass:"basic-user-card-collapsed-content"},[n("div",{staticClass:"basic-user-card-user-name",attrs:{title:t.user.name}},[t.user.name_html?n("span",{staticClass:"basic-user-card-user-name-value",domProps:{innerHTML:t._s(t.user.name_html)}}):n("span",{staticClass:"basic-user-card-user-name-value"},[t._v(t._s(t.user.name))])]),t._v(" "),n("div",[n("router-link",{staticClass:"basic-user-card-screen-name",attrs:{to:t.userProfileLink(t.user)}},[t._v("\n @"+t._s(t.user.screen_name)+"\n ")])],1),t._v(" "),t._t("default")],2)],1)},[],!1,c,null,null);e.a=l.exports},function(t,e,n){"use strict";n.d(e,"a",function(){return g}),n.d(e,"e",function(){return b}),n.d(e,"f",function(){return x}),n.d(e,"b",function(){return C}),n.d(e,"c",function(){return S}),n.d(e,"d",function(){return j});var i=n(1),o=n.n(i),r=n(7),s=n.n(r),a=n(27),c=n.n(a),l=n(10),u=n.n(l),d=n(14),p=n(9),f=n(29);function h(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}function m(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:f.b,n=[t],i=e[t];i;)n.unshift(i),i=e[i];return n},b=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,n=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0,o=arguments.length>4?arguments[4]:void 0;return v(t).map(function(r){return[r===t?i[e]:i[r],r===t?o[n]||1:o[r]]})},w=function(t,e){var n=e[t];if("string"==typeof n&&n.startsWith("--"))return[n.substring(2)];if(null===n)return[];var i=n.depends,o=n.layer,r=n.variant,s=o?v(o).map(function(t){return t===o?r||o:t}):[];return Array.isArray(i)?[].concat(u()(i),u()(s)):u()(s)},_=function(t){return"object"===c()(t)?t:{depends:t.startsWith("--")?[t.substring(2)]:[],default:t.startsWith("#")?t:void 0}},x=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:f.c,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:w,i=_(e[t]);if(null!==i.opacity){if(i.opacity)return i.opacity;return i.depends?function i(o){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[t],s=n(o,e)[0];if(void 0!==s){var a=e[s];if(void 0!==a)return a.opacity||null===a?a.opacity:a.depends&&r.includes(s)?i(s,[].concat(u()(r),[s])):null}}(t):void 0}},y=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:f.c,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:w,i=_(e[t]);if(f.b[t])return t;if(null!==i.layer){if(i.layer)return i.layer;return i.depends?function i(o){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[t],s=n(o,e)[0];if(void 0!==s){var a=e[s];if(void 0!==a)return a.layer||null===a?a.layer:a.depends?i(a,[].concat(u()(r),[s])):null}}(t):void 0}},k=function(){for(var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:f.c,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:w,n=Object.keys(t),i=new Set(n),o=new Set,r=new Set,s=u()(n),a=[],c=function n(s){if(i.has(s))i.delete(s),o.add(s),e(s,t).forEach(n),o.delete(s),r.add(s),a.push(s);else if(o.has(s))console.debug("Cyclic depenency in topoSort, ignoring"),a.push(s);else if(!r.has(s))throw new Error("Unintended condition in topoSort!")};s.length>0;)c(s.pop());return a.map(function(t,e){return{data:t,index:e}}).sort(function(n,i){var o=n.data,r=n.index,s=i.data,a=i.index,c=e(o,t).length,l=e(s,t).length;return c===l||0!==l&&0!==c?r-a:0===c&&0!==l?-1:0===l&&0!==c?1:void 0}).map(function(t){return t.data})}(Object.entries(f.c).sort(function(t,e){var n=s()(t,2),i=(n[0],n[1]),o=s()(e,2),r=(o[0],o[1]);return(i&&i.priority||0)-(r&&r.priority||0)}).reduce(function(t,e){var n=s()(e,2),i=n[0],r=n[1];return m({},t,o()({},i,r))},{})),C=Object.entries(f.c).reduce(function(t,e){var n=s()(e,2),i=n[0],r=(n[1],x(i,f.c,w));return r?m({},t,o()({},r,{defaultValue:f.a[r]||1,affectedSlots:[].concat(u()(t[r]&&t[r].affectedSlots||[]),[i])})):t},{}),S=function(t,e,n){if("string"!=typeof t||!t.startsWith("--"))return t;var i=null,o=t.split(/,/g).map(function(t){return t.trim()}),r=s()(o,2),a=r[0],c=r[1];return i=e(a.substring(2)),c&&(i=Object(d.brightness)(Number.parseFloat(c)*n,i).rgb),i},j=function(t,e){return k.reduce(function(n,i){var r=n.colors,s=n.opacity,a=t[i],c=_(f.c[i]),l=w(i,f.c),h=!!c.textColor,g=c.variant||c.layer,v=null;v=h?Object(p.b)(m({},r[l[0]]||Object(d.convert)(t[i]||"#FF00FF").rgb),b(y(i)||"bg",g||"bg",x(g),r,s)):g&&g!==i?r[g]||Object(d.convert)(t[g]).rgb:r.bg||Object(d.convert)(t.bg);var k=Object(p.h)(v)<.5?1:-1,j=null;if(a){var O=a;if("transparent"===O){var P=b(y(i),i,x(i)||i,r,s).slice(0,-1);O=m({},Object(p.b)(Object(d.convert)("#FF00FF").rgb,P),{a:0})}else"string"==typeof a&&a.startsWith("--")?O=S(a,function(e){return r[e]||t[e]},k):"string"==typeof a&&a.startsWith("#")&&(O=Object(d.convert)(O).rgb);j=m({},O)}else if(c.default)j=Object(d.convert)(c.default).rgb;else{var $=c.color||function(t,e){return m({},e)};if(c.textColor)if("bw"===c.textColor)j=Object(d.contrastRatio)(v).rgb;else{var T=m({},r[l[0]]);c.color&&(T=$.apply(void 0,[k].concat(u()(l.map(function(t){return m({},r[t])}))))),j=Object(p.e)(v,m({},T),"preserve"===c.textColor)}else j=$.apply(void 0,[k].concat(u()(l.map(function(t){return m({},r[t])}))))}if(!j)throw new Error("Couldn't generate color for "+i);var I=c.opacity||x(i),E=c.opacity;if(null===E)j.a=1;else if("transparent"===a)j.a=0;else{var M=E&&void 0!==e[I],U=l[0],F=U&&r[U];E||!F||c.textColor||null===E?F||I?F&&0===F.a?j.a=0:j.a=Number(M?e[I]:(C[I]||{}).defaultValue):delete j.a:j.a=F.a}return(Number.isNaN(j.a)||void 0===j.a)&&(j.a=1),I?{colors:m({},r,o()({},i,j)),opacity:m({},s,o()({},I,j.a))}:{colors:m({},r,o()({},i,j)),opacity:s}},{colors:{},opacity:{}})}},,,function(t,e,n){"use strict";var i=n(3),o=n.n(i),r=n(1),s=n.n(r),a=n(10),c=n.n(a),l=n(41),u=n.n(l),d=n(106),p=n.n(d),f=n(15),h=n.n(f),m=n(189),g=n.n(m),v=n(61),b=n(134),w={data:function(){return{uploadCount:0,uploadReady:!0}},computed:{uploading:function(){return this.uploadCount>0}},methods:{uploadFile:function(t){var e=this,n=this.$store;if(t.size>n.state.instance.uploadlimit){var i=b.a.fileSizeFormat(t.size),o=b.a.fileSizeFormat(n.state.instance.uploadlimit);e.$emit("upload-failed","file_too_big",{filesize:i.num,filesizeunit:i.unit,allowedsize:o.num,allowedsizeunit:o.unit})}else{var r=new FormData;r.append("file",t),e.$emit("uploading"),e.uploadCount++,v.a.uploadMedia({store:n,formData:r}).then(function(t){e.$emit("uploaded",t),e.decreaseUploadCount()},function(t){e.$emit("upload-failed","default"),e.decreaseUploadCount()})}},decreaseUploadCount:function(){this.uploadCount--,0===this.uploadCount&&this.$emit("all-uploaded")},clearFile:function(){var t=this;this.uploadReady=!1,this.$nextTick(function(){t.uploadReady=!0})},multiUpload:function(t){var e=!0,n=!1,i=void 0;try{for(var o,r=t[Symbol.iterator]();!(e=(o=r.next()).done);e=!0){var s=o.value;this.uploadFile(s)}}catch(t){n=!0,i=t}finally{try{e||null==r.return||r.return()}finally{if(n)throw i}}},change:function(t){var e=t.target;this.multiUpload(e.files)}},props:["dropFiles","disabled"],watch:{dropFiles:function(t){this.uploading||this.multiUpload(t)}}},_=n(0);var x=function(t){n(389)},y=Object(_.a)(w,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"media-upload",class:{disabled:t.disabled}},[n("label",{staticClass:"label",attrs:{title:t.$t("tool_tip.media_upload")}},[t.uploading?n("i",{staticClass:"progress-icon icon-spin4 animate-spin"}):t._e(),t._v(" "),t.uploading?t._e():n("i",{staticClass:"new-icon icon-upload"}),t._v(" "),t.uploadReady?n("input",{staticStyle:{position:"fixed",top:"-100em"},attrs:{disabled:t.disabled,type:"file",multiple:"true"},on:{change:t.change}}):t._e()])])},[],!1,x,null,null).exports,k=n(196),C=n(195),S=n(77),j=n.n(S),O=n(35),P={name:"PollForm",props:["visible"],data:function(){return{pollType:"single",options:["",""],expiryAmount:10,expiryUnit:"minutes"}},computed:{pollLimits:function(){return this.$store.state.instance.pollLimits},maxOptions:function(){return this.pollLimits.max_options},maxLength:function(){return this.pollLimits.max_option_chars},expiryUnits:function(){var t=this,e=this.convertExpiryFromUnit;return["minutes","hours","days"].filter(function(n){return t.pollLimits.max_expiration>=e(n,1)})},minExpirationInCurrentUnit:function(){return Math.ceil(this.convertExpiryToUnit(this.expiryUnit,this.pollLimits.min_expiration))},maxExpirationInCurrentUnit:function(){return Math.floor(this.convertExpiryToUnit(this.expiryUnit,this.pollLimits.max_expiration))}},methods:{clear:function(){this.pollType="single",this.options=["",""],this.expiryAmount=10,this.expiryUnit="minutes"},nextOption:function(t){var e=this.$el.querySelector("#poll-".concat(t+1));e?e.focus():this.addOption()&&this.$nextTick(function(){this.nextOption(t)})},addOption:function(){return this.options.length2&&(this.options.splice(t,1),this.updatePollToParent())},convertExpiryToUnit:function(t,e){switch(t){case"minutes":return 1e3*e/O.c;case"hours":return 1e3*e/O.b;case"days":return 1e3*e/O.a}},convertExpiryFromUnit:function(t,e){switch(t){case"minutes":return.001*e*O.c;case"hours":return.001*e*O.b;case"days":return.001*e*O.a}},expiryAmountChange:function(){this.expiryAmount=Math.max(this.minExpirationInCurrentUnit,this.expiryAmount),this.expiryAmount=Math.min(this.maxExpirationInCurrentUnit,this.expiryAmount),this.updatePollToParent()},updatePollToParent:function(){var t=this.convertExpiryFromUnit(this.expiryUnit,this.expiryAmount),e=j()(this.options.filter(function(t){return""!==t}));e.length<2?this.$emit("update-poll",{error:this.$t("polls.not_enough_options")}):this.$emit("update-poll",{options:e,multiple:"multiple"===this.pollType,expiresIn:t})}}};var $=function(t){n(399)},T=Object(_.a)(P,function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.visible?n("div",{staticClass:"poll-form"},[t._l(t.options,function(e,i){return n("div",{key:i,staticClass:"poll-option"},[n("div",{staticClass:"input-container"},[n("input",{directives:[{name:"model",rawName:"v-model",value:t.options[i],expression:"options[index]"}],staticClass:"poll-option-input",attrs:{id:"poll-"+i,type:"text",placeholder:t.$t("polls.option"),maxlength:t.maxLength},domProps:{value:t.options[i]},on:{change:t.updatePollToParent,keydown:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:(e.stopPropagation(),e.preventDefault(),t.nextOption(i))},input:function(e){e.target.composing||t.$set(t.options,i,e.target.value)}}})]),t._v(" "),t.options.length>2?n("div",{staticClass:"icon-container"},[n("i",{staticClass:"icon-cancel",on:{click:function(e){return t.deleteOption(i)}}})]):t._e()])}),t._v(" "),t.options.length0?s.join(" ")+" ":""}({user:this.repliedUser,attentions:this.attentions},n)}var i=this.copyMessageScope&&e||"direct"===this.copyMessageScope?this.copyMessageScope:this.$store.state.users.currentUser.default_scope,o=this.$store.getters.mergedConfig.postContentType;return{dropFiles:[],uploadingFiles:!1,error:null,posting:!1,highlighted:0,newStatus:{spoilerText:this.subject||"",status:t,nsfw:!1,files:[],poll:{},mediaDescriptions:{},visibility:i,contentType:o},caret:0,pollFormVisible:!1,showDropIcon:"hide",dropStopTimeout:null,preview:null,previewLoading:!1,emojiInputShown:!1,idempotencyKey:""}},computed:function(t){for(var e=1;e0},charactersLeft:function(){return this.statusLengthLimit-(this.statusLength+this.spoilerTextLength)},isOverLengthLimit:function(){return this.hasStatusLengthLimit&&this.charactersLeft<0},minimalScopesMode:function(){return this.$store.state.instance.minimalScopesMode},alwaysShowSubject:function(){return this.mergedConfig.alwaysShowSubjectInput},postFormats:function(){return this.$store.state.instance.postFormats||[]},safeDMEnabled:function(){return this.$store.state.instance.safeDM},pollsAvailable:function(){return this.$store.state.instance.pollsAvailable&&this.$store.state.instance.pollLimits.max_options>=2&&!0!==this.disablePolls},hideScopeNotice:function(){return this.disableNotice||this.$store.getters.mergedConfig.hideScopeNotice},pollContentError:function(){return this.pollFormVisible&&this.newStatus.poll&&this.newStatus.poll.error},showPreview:function(){return!this.disablePreview&&(!!this.preview||this.previewLoading)},emptyStatus:function(){return""===this.newStatus.status.trim()&&0===this.newStatus.files.length},uploadFileLimitReached:function(){return this.newStatus.files.length>=this.fileLimit}},Object(D.c)(["mergedConfig"]),{},Object(D.e)({mobileLayout:function(t){return t.interface.mobileLayout}})),watch:{newStatus:{deep:!0,handler:function(){this.statusChanged()}}},methods:{statusChanged:function(){this.autoPreview(),this.updateIdempotencyKey()},clearStatus:function(){var t=this,e=this.newStatus;this.newStatus={status:"",spoilerText:"",files:[],visibility:e.visibility,contentType:e.contentType,poll:{},mediaDescriptions:{}},this.pollFormVisible=!1,this.$refs.mediaUpload&&this.$refs.mediaUpload.clearFile(),this.clearPollForm(),this.preserveFocus&&this.$nextTick(function(){t.$refs.textarea.focus()});var n=this.$el.querySelector("textarea");n.style.height="auto",n.style.height=void 0,this.error=null,this.preview&&this.previewStatus()},postStatus:function(t,e){var n,i,r=this,s=arguments;return o.a.async(function(a){for(;;)switch(a.prev=a.next){case 0:if(s.length>2&&void 0!==s[2]?s[2]:{},!this.posting){a.next=3;break}return a.abrupt("return");case 3:if(!this.disableSubmit){a.next=5;break}return a.abrupt("return");case 5:if(!this.emojiInputShown){a.next=7;break}return a.abrupt("return");case 7:if(this.submitOnEnter&&(t.stopPropagation(),t.preventDefault()),!this.emptyStatus){a.next=11;break}return this.error=this.$t("post_status.empty_status_error"),a.abrupt("return");case 11:if(n=this.pollFormVisible?this.newStatus.poll:{},!this.pollContentError){a.next=15;break}return this.error=this.pollContentError,a.abrupt("return");case 15:return this.posting=!0,a.prev=16,a.next=19,o.a.awrap(this.setAllMediaDescriptions());case 19:a.next=26;break;case 21:return a.prev=21,a.t0=a.catch(16),this.error=this.$t("post_status.media_description_error"),this.posting=!1,a.abrupt("return");case 26:i={status:e.status,spoilerText:e.spoilerText||null,visibility:e.visibility,sensitive:e.nsfw,media:e.files,store:this.$store,inReplyToStatusId:this.replyTo,contentType:e.contentType,poll:n,idempotencyKey:this.idempotencyKey},(this.postHandler?this.postHandler:v.a.postStatus)(i).then(function(t){t.error?r.error=t.error:(r.clearStatus(),r.$emit("posted",t)),r.posting=!1});case 29:case"end":return a.stop()}},null,this,[[16,21]])},previewStatus:function(){var t=this;if(this.emptyStatus&&""===this.newStatus.spoilerText.trim())return this.preview={error:this.$t("post_status.preview_empty")},void(this.previewLoading=!1);var e=this.newStatus;this.previewLoading=!0,v.a.postStatus({status:e.status,spoilerText:e.spoilerText||null,visibility:e.visibility,sensitive:e.nsfw,media:[],store:this.$store,inReplyToStatusId:this.replyTo,contentType:e.contentType,poll:{},preview:!0}).then(function(e){t.previewLoading&&(e.error?t.preview={error:e.error}:t.preview=e)}).catch(function(e){t.preview={error:e}}).finally(function(){t.previewLoading=!1})},debouncePreviewStatus:u()(function(){this.previewStatus()},500),autoPreview:function(){this.preview&&(this.previewLoading=!0,this.debouncePreviewStatus())},closePreview:function(){this.preview=null,this.previewLoading=!1},togglePreview:function(){this.showPreview?this.closePreview():this.previewStatus()},addMediaFile:function(t){this.newStatus.files.push(t),this.$emit("resize",{delayed:!0})},removeMediaFile:function(t){var e=this.newStatus.files.indexOf(t);this.newStatus.files.splice(e,1),this.$emit("resize")},uploadFailed:function(t,e){e=e||{},this.error=this.$t("upload.error.base")+" "+this.$t("upload.error."+t,e)},startedUploadingFiles:function(){this.uploadingFiles=!0},finishedUploadingFiles:function(){this.$emit("resize"),this.uploadingFiles=!1},type:function(t){return M.a.fileType(t.mimetype)},paste:function(t){this.autoPreview(),this.resize(t),t.clipboardData.files.length>0&&(t.preventDefault(),this.dropFiles=[t.clipboardData.files[0]])},fileDrop:function(t){t.dataTransfer&&t.dataTransfer.types.includes("Files")&&(t.preventDefault(),this.dropFiles=t.dataTransfer.files,clearTimeout(this.dropStopTimeout),this.showDropIcon="hide")},fileDragStop:function(t){var e=this;clearTimeout(this.dropStopTimeout),this.showDropIcon="fade",this.dropStopTimeout=setTimeout(function(){return e.showDropIcon="hide"},500)},fileDrag:function(t){t.dataTransfer.dropEffect=this.uploadFileLimitReached?"none":"copy",t.dataTransfer&&t.dataTransfer.types.includes("Files")&&(clearTimeout(this.dropStopTimeout),this.showDropIcon="show")},onEmojiInputInput:function(t){var e=this;this.$nextTick(function(){e.resize(e.$refs.textarea)})},resize:function(t){var e=t.target||t;if(e instanceof window.Element){if(""===e.value)return e.style.height=null,this.$emit("resize"),void this.$refs["emoji-input"].resize();var n=this.$refs.form,i=this.$refs.bottom,o=window.getComputedStyle(i)["padding-bottom"],r=R(o),s=this.$el.closest(".sidebar-scroller")||this.$el.closest(".post-form-modal-view")||window,a=window.getComputedStyle(e)["padding-top"],c=window.getComputedStyle(e)["padding-bottom"],l=R(a)+R(c),u=R(e.style.height),d=s===window?s.scrollY:s.scrollTop,p=s===window?s.innerHeight:s.offsetHeight,f=d+p;e.style.height="auto";var h=Math.floor(e.scrollHeight-l),m=this.maxHeight?Math.min(h,this.maxHeight):h;Math.abs(m-u)<=1&&(m=u),e.style.height="".concat(m,"px"),this.$emit("resize",m);var g=i.offsetHeight+Object(U.a)(i,s).top+r,v=f1?n("div",{staticClass:"text-format"},[n("label",{staticClass:"select",attrs:{for:"post-content-type"}},[n("select",{directives:[{name:"model",rawName:"v-model",value:t.newStatus.contentType,expression:"newStatus.contentType"}],staticClass:"form-control",attrs:{id:"post-content-type"},on:{change:function(e){var n=Array.prototype.filter.call(e.target.options,function(t){return t.selected}).map(function(t){return"_value"in t?t._value:t.value});t.$set(t.newStatus,"contentType",e.target.multiple?n:n[0])}}},t._l(t.postFormats,function(e){return n("option",{key:e,domProps:{value:e}},[t._v("\n "+t._s(t.$t('post_status.content_type["'+e+'"]'))+"\n ")])}),0),t._v(" "),n("i",{staticClass:"icon-down-open"})])]):t._e(),t._v(" "),1===t.postFormats.length&&"text/plain"!==t.postFormats[0]?n("div",{staticClass:"text-format"},[n("span",{staticClass:"only-format"},[t._v("\n "+t._s(t.$t('post_status.content_type["'+t.postFormats[0]+'"]'))+"\n ")])]):t._e()],1)],1),t._v(" "),t.pollsAvailable?n("poll-form",{ref:"pollForm",attrs:{visible:t.pollFormVisible},on:{"update-poll":t.setPoll}}):t._e(),t._v(" "),n("div",{ref:"bottom",staticClass:"form-bottom"},[n("div",{staticClass:"form-bottom-left"},[n("media-upload",{ref:"mediaUpload",staticClass:"media-upload-icon",attrs:{"drop-files":t.dropFiles,disabled:t.uploadFileLimitReached},on:{uploading:t.startedUploadingFiles,uploaded:t.addMediaFile,"upload-failed":t.uploadFailed,"all-uploaded":t.finishedUploadingFiles}}),t._v(" "),n("div",{staticClass:"emoji-icon"},[n("i",{staticClass:"icon-smile btn btn-default",attrs:{title:t.$t("emoji.add_emoji")},on:{click:t.showEmojiPicker}})]),t._v(" "),t.pollsAvailable?n("div",{staticClass:"poll-icon",class:{selected:t.pollFormVisible}},[n("i",{staticClass:"icon-chart-bar btn btn-default",attrs:{title:t.$t("polls.add_poll")},on:{click:t.togglePollForm}})]):t._e()],1),t._v(" "),t.posting?n("button",{staticClass:"btn btn-default",attrs:{disabled:""}},[t._v("\n "+t._s(t.$t("post_status.posting"))+"\n ")]):t.isOverLengthLimit?n("button",{staticClass:"btn btn-default",attrs:{disabled:""}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")]):n("button",{staticClass:"btn btn-default",attrs:{disabled:t.uploadingFiles||t.disableSubmit},on:{touchstart:function(e){return e.stopPropagation(),e.preventDefault(),t.postStatus(e,t.newStatus)},click:function(e){return e.stopPropagation(),e.preventDefault(),t.postStatus(e,t.newStatus)}}},[t._v("\n "+t._s(t.$t("general.submit"))+"\n ")])]),t._v(" "),t.error?n("div",{staticClass:"alert error"},[t._v("\n Error: "+t._s(t.error)+"\n "),n("i",{staticClass:"button-icon icon-cancel",on:{click:t.clearError}})]):t._e(),t._v(" "),n("div",{staticClass:"attachments"},t._l(t.newStatus.files,function(e){return n("div",{key:e.url,staticClass:"media-upload-wrapper"},[n("i",{staticClass:"fa button-icon icon-cancel",on:{click:function(n){return t.removeMediaFile(e)}}}),t._v(" "),n("attachment",{attrs:{attachment:e,"set-media":function(){return t.$store.dispatch("setMedia",t.newStatus.files)},size:"small","allow-play":"false"}}),t._v(" "),n("input",{directives:[{name:"model",rawName:"v-model",value:t.newStatus.mediaDescriptions[e.id],expression:"newStatus.mediaDescriptions[file.id]"}],attrs:{type:"text",placeholder:t.$t("post_status.media_description")},domProps:{value:t.newStatus.mediaDescriptions[e.id]},on:{keydown:function(e){if(!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter"))return null;e.preventDefault()},input:function(n){n.target.composing||t.$set(t.newStatus.mediaDescriptions,e.id,n.target.value)}}})],1)}),0),t._v(" "),t.newStatus.files.length>0&&!t.disableSensitivityCheckbox?n("div",{staticClass:"upload_settings"},[n("Checkbox",{model:{value:t.newStatus.nsfw,callback:function(e){t.$set(t.newStatus,"nsfw",e)},expression:"newStatus.nsfw"}},[t._v("\n "+t._s(t.$t("post_status.attachments_sensitive"))+"\n ")])],1):t._e()],1)])},[],!1,B,null,null);e.a=z.exports},function(t,e,n){"use strict";var i=n(1),o=n.n(i),r=n(62),s=n(110),a=n(216),c=n.n(a),l=n(21),u=n(2);function d(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var p={props:["attachment","nsfw","size","allowPlay","setMedia","naturalSizeLoad"],data:function(){return{nsfwImage:this.$store.state.instance.nsfwCensorImage||c.a,hideNsfwLocal:this.$store.getters.mergedConfig.hideNsfw,preloadImage:this.$store.getters.mergedConfig.preloadImage,loading:!1,img:"image"===l.a.fileType(this.attachment.mimetype)&&document.createElement("img"),modalOpen:!1,showHidden:!1}},components:{StillImage:r.a,VideoAttachment:s.a},computed:function(t){for(var e=1;e2&&void 0!==arguments[2]?arguments[2]:{},r=i.top,s=void 0===r?0:r,a=i.left,c=void 0===a?0:a,l=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],u={top:s+e.offsetTop,left:c+e.offsetLeft};if(!l&&e!==window){var d=o(e),p=d.topPadding,f=d.leftPadding;u.top+=l?0:p,u.left+=l?0:f}if(e.offsetParent&&(n===window||n.contains(e.offsetParent)||n===e.offsetParent))return t(e.offsetParent,n,u,!1);if(n!==window){var h=o(n),m=h.topPadding,g=h.leftPadding;u.top+=m,u.left+=g}return u},o=function(t){var e=window.getComputedStyle(t)["padding-top"],n=Number(e.substring(0,e.length-2)),i=window.getComputedStyle(t)["padding-left"];return{topPadding:n,leftPadding:Number(i.substring(0,i.length-2))}}},,function(t,e,n){"use strict";var i=n(7),o=n.n(i),r=function(t,e){return new Promise(function(n,i){e.state.api.backendInteractor.followUser({id:t}).then(function(t){if(e.commit("updateUserRelationship",[t]),!(t.following||t.locked&&t.requested))return function t(e,n,i){return new Promise(function(t,o){setTimeout(function(){i.state.api.backendInteractor.fetchUserRelationship({id:n}).then(function(t){return i.commit("updateUserRelationship",[t]),t}).then(function(n){return t([n.following,n.requested,n.locked,e])}).catch(function(t){return o(t)})},500)}).then(function(e){var r=o()(e,4),s=r[0],a=r[1],c=r[2],l=r[3];s||c&&a||!(l<=3)||t(++l,n,i)})}(1,t,e).then(function(){n()});n()})})},s={props:["relationship","labelFollowing","buttonClass"],data:function(){return{inProgress:!1}},computed:{isPressed:function(){return this.inProgress||this.relationship.following},title:function(){return this.inProgress||this.relationship.following?this.$t("user_card.follow_unfollow"):this.relationship.requested?this.$t("user_card.follow_again"):this.$t("user_card.follow")},label:function(){return this.inProgress?this.$t("user_card.follow_progress"):this.relationship.following?this.labelFollowing||this.$t("user_card.following"):this.relationship.requested?this.$t("user_card.follow_sent"):this.$t("user_card.follow")}},methods:{onClick:function(){this.relationship.following?this.unfollow():this.follow()},follow:function(){var t=this;this.inProgress=!0,r(this.relationship.id,this.$store).then(function(){t.inProgress=!1})},unfollow:function(){var t=this,e=this.$store;this.inProgress=!0,function(t,e){return new Promise(function(n,i){e.state.api.backendInteractor.unfollowUser({id:t}).then(function(t){e.commit("updateUserRelationship",[t]),n({updated:t})})})}(this.relationship.id,e).then(function(){t.inProgress=!1,e.commit("removeStatus",{timeline:"friends",userId:t.relationship.id})})}}},a=n(0),c=Object(a.a)(s,function(){var t=this.$createElement;return(this._self._c||t)("button",{staticClass:"btn btn-default follow-button",class:{toggled:this.isPressed},attrs:{disabled:this.inProgress,title:this.title},on:{click:this.onClick}},[this._v("\n "+this._s(this.label)+"\n")])},[],!1,null,null,null);e.a=c.exports},function(t,e,n){"use strict";var i={props:["attachment","controls"],data:function(){return{loopVideo:this.$store.getters.mergedConfig.loopVideo}},methods:{onVideoDataLoad:function(t){var e=t.srcElement||t.target;void 0!==e.webkitAudioDecodedByteCount?e.webkitAudioDecodedByteCount>0&&(this.loopVideo=this.loopVideo&&!this.$store.getters.mergedConfig.loopVideoSilentOnly):void 0!==e.mozHasAudio?e.mozHasAudio&&(this.loopVideo=this.loopVideo&&!this.$store.getters.mergedConfig.loopVideoSilentOnly):void 0!==e.audioTracks&&e.audioTracks.length>0&&(this.loopVideo=this.loopVideo&&!this.$store.getters.mergedConfig.loopVideoSilentOnly)}}},o=n(0),r=Object(o.a)(i,function(){var t=this.$createElement;return(this._self._c||t)("video",{staticClass:"video",attrs:{src:this.attachment.url,loop:this.loopVideo,controls:this.controls,alt:this.attachment.description,title:this.attachment.description,playsinline:""},on:{loadeddata:this.onVideoDataLoad}})},[],!1,null,null,null);e.a=r.exports},function(t,e,n){"use strict";var i=n(104),o=n.n(i),r=n(217),s=n.n(r),a=n(23),c=n.n(a),l=n(218),u=n.n(l),d={props:["attachments","nsfw","setMedia"],data:function(){return{sizes:{}}},components:{Attachment:n(43).a},computed:{rows:function(){if(!this.attachments)return[];var t=u()(this.attachments,3);if(1===c()(t).length&&t.length>1){var e=c()(t)[0],n=s()(t);return c()(n).push(e),n}return t},useContainFit:function(){return this.$store.getters.mergedConfig.useContainFit}},methods:{onNaturalSizeLoad:function(t,e){this.$set(this.sizes,t,e)},rowStyle:function(t){return{"padding-bottom":"".concat(100/(t+.6),"%")}},itemStyle:function(t,e){var n=this,i=o()(e,function(t){return n.getAspectRatio(t.id)});return{flex:"".concat(this.getAspectRatio(t)/i," 1 0%")}},getAspectRatio:function(t){var e=this.sizes[t];return e?e.width/e.height:1}}},p=n(0);var f=function(t){n(409)},h=Object(p.a)(d,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{ref:"galleryContainer",staticStyle:{width:"100%"}},t._l(t.rows,function(e,i){return n("div",{key:i,staticClass:"gallery-row",class:{"contain-fit":t.useContainFit,"cover-fit":!t.useContainFit},style:t.rowStyle(e.length)},[n("div",{staticClass:"gallery-row-inner"},t._l(e,function(i){return n("attachment",{key:i.id,style:t.itemStyle(i.id,e),attrs:{"set-media":t.setMedia,nsfw:t.nsfw,attachment:i,"allow-play":!1,"natural-size-load":t.onNaturalSizeLoad.bind(null,i.id)}})}),1)])}),0)},[],!1,f,null,null);e.a=h.exports},function(t,e,n){"use strict";var i={name:"LinkPreview",props:["card","size","nsfw"],data:function(){return{imageLoaded:!1}},computed:{useImage:function(){return this.card.image&&!this.nsfw&&"hide"!==this.size},useDescription:function(){return this.card.description&&/\S/.test(this.card.description)}},created:function(){var t=this;if(this.useImage){var e=new Image;e.onload=function(){t.imageLoaded=!0},e.src=this.card.image}}},o=n(0);var r=function(t){n(411)},s=Object(o.a)(i,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("a",{staticClass:"link-preview-card",attrs:{href:t.card.url,target:"_blank",rel:"noopener"}},[t.useImage&&t.imageLoaded?n("div",{staticClass:"card-image",class:{"small-image":"small"===t.size}},[n("img",{attrs:{src:t.card.image}})]):t._e(),t._v(" "),n("div",{staticClass:"card-content"},[n("span",{staticClass:"card-host faint"},[t._v(t._s(t.card.provider_name))]),t._v(" "),n("h4",{staticClass:"card-title"},[t._v(t._s(t.card.title))]),t._v(" "),t.useDescription?n("p",{staticClass:"card-description"},[t._v(t._s(t.card.description))]):t._e()])])])},[],!1,r,null,null);e.a=s.exports},function(t,e,n){"use strict";var i={props:["user"],computed:{subscribeUrl:function(){var t=new URL(this.user.statusnet_profile_url);return"".concat(t.protocol,"//").concat(t.host,"/main/ostatus")}}},o=n(0);var r=function(t){n(417)},s=Object(o.a)(i,function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"remote-follow"},[e("form",{attrs:{method:"POST",action:this.subscribeUrl}},[e("input",{attrs:{type:"hidden",name:"nickname"},domProps:{value:this.user.screen_name}}),this._v(" "),e("input",{attrs:{type:"hidden",name:"profile",value:""}}),this._v(" "),e("button",{staticClass:"remote-button",attrs:{click:"submit"}},[this._v("\n "+this._s(this.$t("user_card.remote_follow"))+"\n ")])])])},[],!1,r,null,null);e.a=s.exports},function(t,e,n){"use strict";var i=n(18),o=n(17),r={props:["users"],computed:{slicedUsers:function(){return this.users?this.users.slice(0,15):[]}},components:{UserAvatar:i.default},methods:{userProfileLink:function(t){return Object(o.a)(t.id,t.screen_name,this.$store.state.instance.restrictedNicknames)}}},s=n(0);var a=function(t){n(425)},c=Object(s.a)(r,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"avatars"},t._l(t.slicedUsers,function(e){return n("router-link",{key:e.id,staticClass:"avatars-item",attrs:{to:t.userProfileLink(e)}},[n("UserAvatar",{staticClass:"avatar-small",attrs:{user:e}})],1)}),1)},[],!1,a,null,null);e.a=c.exports},,,,,,,,,,,,,,,,,,,,function(t,e,n){"use strict";var i={fileSizeFormat:function(t){var e,n=["B","KiB","MiB","GiB","TiB"];return t<1?t+" "+n[0]:(e=Math.min(Math.floor(Math.log(t)/Math.log(1024)),n.length-1),{num:t=1*(t/Math.pow(1024,e)).toFixed(2),unit:n[e]})}};e.a=i},function(t,e,n){"use strict";var i=n(41),o=n.n(i)()(function(t,e){t.updateUsersList(e)},500);e.a=function(t){return function(e){var n=e[0];return":"===n&&t.emoji?r(t.emoji)(e):"@"===n&&t.users?s(t)(e):[]}};var r=function(t){return function(e){var n=e.toLowerCase().substr(1);return t.filter(function(t){return t.displayText.toLowerCase().match(n)}).sort(function(t,e){var i=0,o=0;return i+=t.displayText.toLowerCase()===n?200:0,o+=e.displayText.toLowerCase()===n?200:0,i+=t.imageUrl?100:0,o+=e.imageUrl?100:0,i+=t.displayText.toLowerCase().startsWith(n)?10:0,o+=e.displayText.toLowerCase().startsWith(n)?10:0,i-=t.displayText.length,(o-=e.displayText.length)-i+(t.displayText>e.displayText?.5:-.5)})}},s=function(t){return function(e){var n=e.toLowerCase().substr(1),i=t.users.filter(function(t){return t.screen_name.toLowerCase().startsWith(n)||t.name.toLowerCase().startsWith(n)}).slice(0,20).sort(function(t,e){var i=0,o=0;return i+=t.screen_name.toLowerCase().startsWith(n)?2:0,o+=e.screen_name.toLowerCase().startsWith(n)?2:0,i+=t.name.toLowerCase().startsWith(n)?1:0,10*((o+=e.name.toLowerCase().startsWith(n)?1:0)-i)+(t.name>e.name?1:-1)+(t.screen_name>e.screen_name?1:-1)}).map(function(t){var e=t.screen_name;return{displayText:e,detailText:t.name,imageUrl:t.profile_image_url_original,replacement:"@"+e+" "}});return t.updateUsersList&&o(t,n),i}}},,,,,,function(t,e,n){"use strict";var i=n(1),o=n.n(i),r=n(6),s=n.n(r),a=n(2);n(475);function c(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}e.a=s.a.component("tab-switcher",{name:"TabSwitcher",props:{renderOnlyFocused:{required:!1,type:Boolean,default:!1},onSwitch:{required:!1,type:Function,default:void 0},activeTab:{required:!1,type:String,default:void 0},scrollableTabs:{required:!1,type:Boolean,default:!1},sideTabBar:{required:!1,type:Boolean,default:!1}},data:function(){return{active:this.$slots.default.findIndex(function(t){return t.tag})}},computed:function(t){for(var e=1;e0){var i=t.pop();n.start+=i.end,n.end+=i.end,t.push(i)}return t.push(n),t},[])},h=function(t){for(var e=[],n="",i=0;ie})},addPositionToWords:f,splitByWhitespaceBoundary:h,replaceWord:function(t,e,n){return t.slice(0,e.start)+n+t.slice(e.end)}},g=n(54),v=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return t.filter(function(t){return t.displayText.includes(e)})},b={props:{enableStickerPicker:{required:!1,type:Boolean,default:!1}},data:function(){return{keyword:"",activeGroup:"custom",showingStickers:!1,groupsScrolledClass:"scrolled-top",keepOpen:!1,customEmojiBufferSlice:60,customEmojiTimeout:null,customEmojiLoadAllConfirmed:!1}},components:{StickerPicker:function(){return n.e(4).then(n.bind(null,642))},Checkbox:g.a},methods:{onStickerUploaded:function(t){this.$emit("sticker-uploaded",t)},onStickerUploadFailed:function(t){this.$emit("sticker-upload-failed",t)},onEmoji:function(t){var e=t.imageUrl?":".concat(t.displayText,":"):t.replacement;this.$emit("emoji",{insertion:e,keepOpen:this.keepOpen})},onScroll:function(t){var e=t&&t.target||this.$refs["emoji-groups"];this.updateScrolledClass(e),this.scrolledGroup(e),this.triggerLoadMore(e)},highlight:function(t){var e=this,n=this.$refs["group-"+t][0].offsetTop;this.setShowStickers(!1),this.activeGroup=t,this.$nextTick(function(){e.$refs["emoji-groups"].scrollTop=n+1})},updateScrolledClass:function(t){t.scrollTop<=5?this.groupsScrolledClass="scrolled-top":t.scrollTop>=t.scrollTopMax-5?this.groupsScrolledClass="scrolled-bottom":this.groupsScrolledClass="scrolled-middle"},triggerLoadMore:function(t){var e=this.$refs["group-end-custom"][0];if(e){var n=e.offsetTop+e.offsetHeight,i=t.scrollTop+t.clientHeight,o=t.scrollTop,r=t.scrollHeight;n0&&void 0!==arguments[0]&&arguments[0];e||(this.keyword=""),this.$nextTick(function(){t.$refs["emoji-groups"].scrollTop=0}),this.customEmojiBuffer.length===this.filteredEmoji.length&&!e||(this.customEmojiBufferSlice=60)},toggleStickers:function(){this.showingStickers=!this.showingStickers},setShowStickers:function(t){this.showingStickers=t}},watch:{keyword:function(){this.customEmojiLoadAllConfirmed=!1,this.onScroll(),this.startEmojiLoad(!0)}},computed:{activeGroupView:function(){return this.showingStickers?"":this.activeGroup},stickersAvailable:function(){return this.$store.state.instance.stickers?this.$store.state.instance.stickers.length>0:0},filteredEmoji:function(){return v(this.$store.state.instance.customEmoji||[],this.keyword)},customEmojiBuffer:function(){return this.filteredEmoji.slice(0,this.customEmojiBufferSlice)},emojis:function(){var t=this.$store.state.instance.emoji||[],e=this.customEmojiBuffer;return[{id:"custom",text:this.$t("emoji.custom"),icon:"icon-smile",emojis:e},{id:"standard",text:this.$t("emoji.unicode"),icon:"icon-picture",emojis:v(t,this.keyword)}]},emojisView:function(){return this.emojis.filter(function(t){return t.emojis.length>0})},stickerPickerEnabled:function(){return 0!==(this.$store.state.instance.stickers||[]).length}}},w=n(0);var _=function(t){n(395)},x=Object(w.a)(b,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"emoji-picker panel panel-default panel-body"},[n("div",{staticClass:"heading"},[n("span",{staticClass:"emoji-tabs"},t._l(t.emojis,function(e){return n("span",{key:e.id,staticClass:"emoji-tabs-item",class:{active:t.activeGroupView===e.id,disabled:0===e.emojis.length},attrs:{title:e.text},on:{click:function(n){return n.preventDefault(),t.highlight(e.id)}}},[n("i",{class:e.icon})])}),0),t._v(" "),t.stickerPickerEnabled?n("span",{staticClass:"additional-tabs"},[n("span",{staticClass:"stickers-tab-icon additional-tabs-item",class:{active:t.showingStickers},attrs:{title:t.$t("emoji.stickers")},on:{click:function(e){return e.preventDefault(),t.toggleStickers(e)}}},[n("i",{staticClass:"icon-star"})])]):t._e()]),t._v(" "),n("div",{staticClass:"content"},[n("div",{staticClass:"emoji-content",class:{hidden:t.showingStickers}},[n("div",{staticClass:"emoji-search"},[n("input",{directives:[{name:"model",rawName:"v-model",value:t.keyword,expression:"keyword"}],staticClass:"form-control",attrs:{type:"text",placeholder:t.$t("emoji.search_emoji")},domProps:{value:t.keyword},on:{input:function(e){e.target.composing||(t.keyword=e.target.value)}}})]),t._v(" "),n("div",{ref:"emoji-groups",staticClass:"emoji-groups",class:t.groupsScrolledClass,on:{scroll:t.onScroll}},t._l(t.emojisView,function(e){return n("div",{key:e.id,staticClass:"emoji-group"},[n("h6",{ref:"group-"+e.id,refInFor:!0,staticClass:"emoji-group-title"},[t._v("\n "+t._s(e.text)+"\n ")]),t._v(" "),t._l(e.emojis,function(i){return n("span",{key:e.id+i.displayText,staticClass:"emoji-item",attrs:{title:i.displayText},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.onEmoji(i)}}},[i.imageUrl?n("img",{attrs:{src:i.imageUrl}}):n("span",[t._v(t._s(i.replacement))])])}),t._v(" "),n("span",{ref:"group-end-"+e.id,refInFor:!0})],2)}),0),t._v(" "),n("div",{staticClass:"keep-open"},[n("Checkbox",{model:{value:t.keepOpen,callback:function(e){t.keepOpen=e},expression:"keepOpen"}},[t._v("\n "+t._s(t.$t("emoji.keep_open"))+"\n ")])],1)]),t._v(" "),t.showingStickers?n("div",{staticClass:"stickers-content"},[n("sticker-picker",{on:{uploaded:t.onStickerUploaded,"upload-failed":t.onStickerUploadFailed}})],1):t._e()])])},[],!1,_,null,null).exports,y=n(107);function k(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var C={props:{suggest:{required:!0,type:Function},value:{required:!0,type:String},enableEmojiPicker:{required:!1,type:Boolean,default:!1},hideEmojiButton:{required:!1,type:Boolean,default:!1},enableStickerPicker:{required:!1,type:Boolean,default:!1},placement:{required:!1,type:String,default:"auto"},newlineOnCtrlEnter:{required:!1,type:Boolean,default:!1}},data:function(){return{input:void 0,highlighted:0,caret:0,focused:!1,blurTimeout:null,showPicker:!1,temporarilyHideSuggestions:!1,keepOpen:!1,disableClickOutside:!1}},components:{EmojiPicker:x},computed:{padEmoji:function(){return this.$store.getters.mergedConfig.padEmoji},suggestions:function(){var t=this,e=this.textAtCaret.charAt(0);if(this.textAtCaret===e)return[];var n=this.suggest(this.textAtCaret);return n.length<=0?[]:c()(n,5).map(function(e,n){var i=e.imageUrl;return function(t){for(var e=1;e0&&!this.showPicker&&!this.temporarilyHideSuggestions},textAtCaret:function(){return(this.wordAtCaret||{}).word||""},wordAtCaret:function(){if(this.value&&this.caret)return m.wordAtPosition(this.value,this.caret-1)||{}}},mounted:function(){var t=this.$slots.default;if(t&&0!==t.length){var e=t.find(function(t){return["input","textarea"].includes(t.tag)});e&&(this.input=e,this.resize(),e.elm.addEventListener("blur",this.onBlur),e.elm.addEventListener("focus",this.onFocus),e.elm.addEventListener("paste",this.onPaste),e.elm.addEventListener("keyup",this.onKeyUp),e.elm.addEventListener("keydown",this.onKeyDown),e.elm.addEventListener("click",this.onClickInput),e.elm.addEventListener("transitionend",this.onTransition),e.elm.addEventListener("input",this.onInput))}},unmounted:function(){var t=this.input;t&&(t.elm.removeEventListener("blur",this.onBlur),t.elm.removeEventListener("focus",this.onFocus),t.elm.removeEventListener("paste",this.onPaste),t.elm.removeEventListener("keyup",this.onKeyUp),t.elm.removeEventListener("keydown",this.onKeyDown),t.elm.removeEventListener("click",this.onClickInput),t.elm.removeEventListener("transitionend",this.onTransition),t.elm.removeEventListener("input",this.onInput))},watch:{showSuggestions:function(t){this.$emit("shown",t)}},methods:{triggerShowPicker:function(){var t=this;this.showPicker=!0,this.$refs.picker.startEmojiLoad(),this.$nextTick(function(){t.scrollIntoView()}),this.disableClickOutside=!0,setTimeout(function(){t.disableClickOutside=!1},0)},togglePicker:function(){this.input.elm.focus(),this.showPicker=!this.showPicker,this.showPicker&&(this.scrollIntoView(),this.$refs.picker.startEmojiLoad())},replace:function(t){var e=m.replaceWord(this.value,this.wordAtCaret,t);this.$emit("input",e),this.caret=0},insert:function(t){var e=t.insertion,n=t.keepOpen,i=t.surroundingSpace,o=void 0===i||i,r=this.value.substring(0,this.caret)||"",s=this.value.substring(this.caret)||"",a=/\s/,c=o&&!a.exec(r.slice(-1))&&r.length&&this.padEmoji>0?" ":"",l=o&&!a.exec(s[0])&&this.padEmoji?" ":"",u=[r,c,e,l,s].join("");this.keepOpen=n,this.$emit("input",u);var d=this.caret+(e+l+c).length;n||this.input.elm.focus(),this.$nextTick(function(){this.input.elm.setSelectionRange(d,d),this.caret=d})},replaceText:function(t,e){var n=this.suggestions.length||0;if(1!==this.textAtCaret.length&&(n>0||e)){var i=(e||this.suggestions[this.highlighted]).replacement,o=m.replaceWord(this.value,this.wordAtCaret,i);this.$emit("input",o),this.highlighted=0;var r=this.wordAtCaret.start+i.length;this.$nextTick(function(){this.input.elm.focus(),this.input.elm.setSelectionRange(r,r),this.caret=r}),t.preventDefault()}},cycleBackward:function(t){(this.suggestions.length||0)>1?(this.highlighted-=1,this.highlighted<0&&(this.highlighted=this.suggestions.length-1),t.preventDefault()):this.highlighted=0},cycleForward:function(t){var e=this.suggestions.length||0;e>1?(this.highlighted+=1,this.highlighted>=e&&(this.highlighted=0),t.preventDefault()):this.highlighted=0},scrollIntoView:function(){var t=this,e=this.$refs.picker.$el,n=this.$el.closest(".sidebar-scroller")||this.$el.closest(".post-form-modal-view")||window,i=n===window?n.scrollY:n.scrollTop,o=i+(n===window?n.innerHeight:n.offsetHeight),r=e.offsetHeight+Object(y.a)(e,n).top,s=i+Math.max(0,r-o);n===window?n.scroll(0,s):n.scrollTop=s,this.$nextTick(function(){var e=t.input.elm.offsetHeight,n=t.$refs.picker;n.$el.getBoundingClientRect().bottom>window.innerHeight&&(n.$el.style.top="auto",n.$el.style.bottom=e+"px")})},onTransition:function(t){this.resize()},onBlur:function(t){var e=this;this.blurTimeout=setTimeout(function(){e.focused=!1,e.setCaret(t),e.resize()},200)},onClick:function(t,e){this.replaceText(t,e)},onFocus:function(t){this.blurTimeout&&(clearTimeout(this.blurTimeout),this.blurTimeout=null),this.keepOpen||(this.showPicker=!1),this.focused=!0,this.setCaret(t),this.resize(),this.temporarilyHideSuggestions=!1},onKeyUp:function(t){var e=t.key;this.setCaret(t),this.resize(),this.temporarilyHideSuggestions="Escape"===e},onPaste:function(t){this.setCaret(t),this.resize()},onKeyDown:function(t){var e=this,n=t.ctrlKey,i=t.shiftKey,o=t.key;this.newlineOnCtrlEnter&&n&&"Enter"===o&&(this.insert({insertion:"\n",surroundingSpace:!1}),t.stopPropagation(),t.preventDefault(),this.$nextTick(function(){e.input.elm.blur(),e.input.elm.focus()})),this.temporarilyHideSuggestions||("Tab"===o&&(i?this.cycleBackward(t):this.cycleForward(t)),"ArrowUp"===o?this.cycleBackward(t):"ArrowDown"===o&&this.cycleForward(t),"Enter"===o&&(n||this.replaceText(t))),"Escape"===o&&(this.temporarilyHideSuggestions||this.input.elm.focus()),this.showPicker=!1,this.resize()},onInput:function(t){this.showPicker=!1,this.setCaret(t),this.resize(),this.$emit("input",t.target.value)},onClickInput:function(t){this.showPicker=!1},onClickOutside:function(t){this.disableClickOutside||(this.showPicker=!1)},onStickerUploaded:function(t){this.showPicker=!1,this.$emit("sticker-uploaded",t)},onStickerUploadFailed:function(t){this.showPicker=!1,this.$emit("sticker-upload-Failed",t)},setCaret:function(t){var e=t.target.selectionStart;this.caret=e},resize:function(){var t=this.$refs.panel;if(t){var e=this.$refs.picker.$el,n=this.$refs["panel-body"],i=this.input.elm,o=i.offsetHeight,r=i.offsetTop+o;this.setPlacement(n,t,r),this.setPlacement(e,e,r)}},setPlacement:function(t,e,n){t&&e&&(e.style.top=n+"px",e.style.bottom="auto",("top"===this.placement||"auto"===this.placement&&this.overflowsBottom(t))&&(e.style.top="auto",e.style.bottom=this.input.elm.offsetHeight+"px"))},overflowsBottom:function(t){return t.getBoundingClientRect().bottom>window.innerHeight}}};var S=function(t){n(393)},j=Object(w.a)(C,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:t.onClickOutside,expression:"onClickOutside"}],staticClass:"emoji-input",class:{"with-picker":!t.hideEmojiButton}},[t._t("default"),t._v(" "),t.enableEmojiPicker?[t.hideEmojiButton?t._e():n("div",{staticClass:"emoji-picker-icon",on:{click:function(e){return e.preventDefault(),t.togglePicker(e)}}},[n("i",{staticClass:"icon-smile"})]),t._v(" "),t.enableEmojiPicker?n("EmojiPicker",{ref:"picker",staticClass:"emoji-picker-panel",class:{hide:!t.showPicker},attrs:{"enable-sticker-picker":t.enableStickerPicker},on:{emoji:t.insert,"sticker-uploaded":t.onStickerUploaded,"sticker-upload-failed":t.onStickerUploadFailed}}):t._e()]:t._e(),t._v(" "),n("div",{ref:"panel",staticClass:"autocomplete-panel",class:{hide:!t.showSuggestions}},[n("div",{ref:"panel-body",staticClass:"autocomplete-panel-body"},t._l(t.suggestions,function(e,i){return n("div",{key:i,staticClass:"autocomplete-item",class:{highlighted:e.highlighted},on:{click:function(n){return n.stopPropagation(),n.preventDefault(),t.onClick(n,e)}}},[n("span",{staticClass:"image"},[e.img?n("img",{attrs:{src:e.img}}):n("span",[t._v(t._s(e.replacement))])]),t._v(" "),n("div",{staticClass:"label"},[n("span",{staticClass:"displayText"},[t._v(t._s(e.displayText))]),t._v(" "),n("span",{staticClass:"detailText"},[t._v(t._s(e.detailText))])])])}),0)])],2)},[],!1,S,null,null);e.a=j.exports},function(t,e,n){"use strict";var i={props:["showAll","userDefault","originalScope","initialScope","onScopeChange"],data:function(){return{currentScope:this.initialScope}},computed:{showNothing:function(){return!(this.showPublic||this.showUnlisted||this.showPrivate||this.showDirect)},showPublic:function(){return"direct"!==this.originalScope&&this.shouldShow("public")},showUnlisted:function(){return"direct"!==this.originalScope&&this.shouldShow("unlisted")},showPrivate:function(){return"direct"!==this.originalScope&&this.shouldShow("private")},showDirect:function(){return this.shouldShow("direct")},css:function(){return{public:{selected:"public"===this.currentScope},unlisted:{selected:"unlisted"===this.currentScope},private:{selected:"private"===this.currentScope},direct:{selected:"direct"===this.currentScope}}}},methods:{shouldShow:function(t){return this.showAll||this.currentScope===t||this.originalScope===t||this.userDefault===t||"direct"===t},changeVis:function(t){this.currentScope=t,this.onScopeChange&&this.onScopeChange(t)}}},o=n(0);var r=function(t){n(391)},s=Object(o.a)(i,function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.showNothing?t._e():n("div",{staticClass:"scope-selector"},[t.showDirect?n("i",{staticClass:"icon-mail-alt",class:t.css.direct,attrs:{title:t.$t("post_status.scope.direct")},on:{click:function(e){return t.changeVis("direct")}}}):t._e(),t._v(" "),t.showPrivate?n("i",{staticClass:"icon-lock",class:t.css.private,attrs:{title:t.$t("post_status.scope.private")},on:{click:function(e){return t.changeVis("private")}}}):t._e(),t._v(" "),t.showUnlisted?n("i",{staticClass:"icon-lock-open-alt",class:t.css.unlisted,attrs:{title:t.$t("post_status.scope.unlisted")},on:{click:function(e){return t.changeVis("unlisted")}}}):t._e(),t._v(" "),t.showPublic?n("i",{staticClass:"icon-globe",class:t.css.public,attrs:{title:t.$t("post_status.scope.public")},on:{click:function(e){return t.changeVis("public")}}}):t._e()])},[],!1,r,null,null);e.a=s.exports},,,,,,,,,,,,,,,,,,,,function(t,e,n){t.exports=n.p+"static/img/nsfw.74818f9.png"},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(t){t.exports={about:{mrf:{federation:"Federation",keyword:{keyword_policies:"Keyword Policies",ftl_removal:'Removal from "The Whole Known Network" Timeline',reject:"Reject",replace:"Replace",is_replaced_by:"→"},mrf_policies:"Enabled MRF Policies",mrf_policies_desc:"MRF policies manipulate the federation behaviour of the instance. The following policies are enabled:",simple:{simple_policies:"Instance-specific Policies",accept:"Accept",accept_desc:"This instance only accepts messages from the following instances:",reject:"Reject",reject_desc:"This instance will not accept messages from the following instances:",quarantine:"Quarantine",quarantine_desc:"This instance will send only public posts to the following instances:",ftl_removal:'Removal from "The Whole Known Network" Timeline',ftl_removal_desc:'This instance removes these instances from "The Whole Known Network" timeline:',media_removal:"Media Removal",media_removal_desc:"This instance removes media from posts on the following instances:",media_nsfw:"Media Force-set As Sensitive",media_nsfw_desc:"This instance forces media to be set sensitive in posts on the following instances:"}},staff:"Staff"},shoutbox:{title:"Shoutbox"},domain_mute_card:{mute:"Mute",mute_progress:"Muting…",unmute:"Unmute",unmute_progress:"Unmuting…"},exporter:{export:"Export",processing:"Processing, you'll soon be asked to download your file"},features_panel:{chat:"Chat",pleroma_chat_messages:"Pleroma Chat",gopher:"Gopher",media_proxy:"Media proxy",scope_options:"Scope options",text_limit:"Text limit",title:"Features",who_to_follow:"Who to follow"},finder:{error_fetching_user:"Error fetching user",find_user:"Find user"},general:{apply:"Apply",submit:"Submit",more:"More",loading:"Loading…",generic_error:"An error occured",error_retry:"Please try again",retry:"Try again",optional:"optional",show_more:"Show more",show_less:"Show less",dismiss:"Dismiss",cancel:"Cancel",disable:"Disable",enable:"Enable",confirm:"Confirm",verify:"Verify",close:"Close",peek:"Peek"},image_cropper:{crop_picture:"Crop picture",save:"Save",save_without_cropping:"Save without cropping",cancel:"Cancel"},importer:{submit:"Submit",success:"Imported successfully.",error:"An error occured while importing this file."},login:{login:"Log in",description:"Log in with OAuth",logout:"Log out",password:"Password",placeholder:"e.g. lain",register:"Register",username:"Username",hint:"Log in to join the discussion",authentication_code:"Authentication code",enter_recovery_code:"Enter a recovery code",enter_two_factor_code:"Enter a two-factor code",recovery_code:"Recovery code",heading:{totp:"Two-factor authentication",recovery:"Two-factor recovery"}},media_modal:{previous:"Previous",next:"Next"},nav:{about:"About",administration:"Administration",back:"Back",chat:"Local Chat",friend_requests:"Follow Requests",mentions:"Mentions",interactions:"Interactions",dms:"Direct Messages",public_tl:"Public Timeline",timeline:"Timeline",twkn:"Known Network",bookmarks:"Bookmarks",user_search:"User Search",search:"Search",who_to_follow:"Who to follow",preferences:"Preferences",timelines:"Timelines",chats:"Chats"},notifications:{broken_favorite:"Unknown status, searching for it…",favorited_you:"favorited your status",followed_you:"followed you",follow_request:"wants to follow you",load_older:"Load older notifications",notifications:"Notifications",read:"Read!",repeated_you:"repeated your status",no_more_notifications:"No more notifications",migrated_to:"migrated to",reacted_with:"reacted with {0}"},polls:{add_poll:"Add Poll",add_option:"Add Option",option:"Option",votes:"votes",vote:"Vote",type:"Poll type",single_choice:"Single choice",multiple_choices:"Multiple choices",expiry:"Poll age",expires_in:"Poll ends in {0}",expired:"Poll ended {0} ago",not_enough_options:"Too few unique options in poll"},emoji:{stickers:"Stickers",emoji:"Emoji",keep_open:"Keep picker open",search_emoji:"Search for an emoji",add_emoji:"Insert emoji",custom:"Custom emoji",unicode:"Unicode emoji",load_all_hint:"Loaded first {saneAmount} emoji, loading all emoji may cause performance issues.",load_all:"Loading all {emojiAmount} emoji"},errors:{storage_unavailable:"Pleroma could not access browser storage. Your login or your local settings won't be saved and you might encounter unexpected issues. Try enabling cookies."},interactions:{favs_repeats:"Repeats and Favorites",follows:"New follows",moves:"User migrates",load_older:"Load older interactions"},post_status:{new_status:"Post new status",account_not_locked_warning:"Your account is not {0}. Anyone can follow you to view your follower-only posts.",account_not_locked_warning_link:"locked",attachments_sensitive:"Mark attachments as sensitive",media_description:"Media description",content_type:{"text/plain":"Plain text","text/html":"HTML","text/markdown":"Markdown","text/bbcode":"BBCode"},content_warning:"Subject (optional)",default:"Just landed in L.A.",direct_warning_to_all:"This post will be visible to all the mentioned users.",direct_warning_to_first_only:"This post will only be visible to the mentioned users at the beginning of the message.",posting:"Posting",preview:"Preview",preview_empty:"Empty",empty_status_error:"Can't post an empty status with no files",media_description_error:"Failed to update media, try again",scope_notice:{public:"This post will be visible to everyone",private:"This post will be visible to your followers only",unlisted:"This post will not be visible in Public Timeline and The Whole Known Network"},scope:{direct:"Direct - Post to mentioned users only",private:"Followers-only - Post to followers only",public:"Public - Post to public timelines",unlisted:"Unlisted - Do not post to public timelines"}},registration:{bio:"Bio",email:"Email",fullname:"Display name",password_confirm:"Password confirmation",registration:"Registration",token:"Invite token",captcha:"CAPTCHA",new_captcha:"Click the image to get a new captcha",username_placeholder:"e.g. lain",fullname_placeholder:"e.g. Lain Iwakura",bio_placeholder:"e.g.\nHi, I'm Lain.\nI’m an anime girl living in suburban Japan. You may know me from the Wired.",validations:{username_required:"cannot be left blank",fullname_required:"cannot be left blank",email_required:"cannot be left blank",password_required:"cannot be left blank",password_confirmation_required:"cannot be left blank",password_confirmation_match:"should be the same as password"}},remote_user_resolver:{remote_user_resolver:"Remote user resolver",searching_for:"Searching for",error:"Not found."},selectable_list:{select_all:"Select all"},settings:{app_name:"App name",security:"Security",enter_current_password_to_confirm:"Enter your current password to confirm your identity",mfa:{otp:"OTP",setup_otp:"Setup OTP",wait_pre_setup_otp:"presetting OTP",confirm_and_enable:"Confirm & enable OTP",title:"Two-factor Authentication",generate_new_recovery_codes:"Generate new recovery codes",warning_of_generate_new_codes:"When you generate new recovery codes, your old codes won’t work anymore.",recovery_codes:"Recovery codes.",waiting_a_recovery_codes:"Receiving backup codes…",recovery_codes_warning:"Write the codes down or save them somewhere secure - otherwise you won't see them again. If you lose access to your 2FA app and recovery codes you'll be locked out of your account.",authentication_methods:"Authentication methods",scan:{title:"Scan",desc:"Using your two-factor app, scan this QR code or enter text key:",secret_code:"Key"},verify:{desc:"To enable two-factor authentication, enter the code from your two-factor app:"}},allow_following_move:"Allow auto-follow when following account moves",attachmentRadius:"Attachments",attachments:"Attachments",avatar:"Avatar",avatarAltRadius:"Avatars (Notifications)",avatarRadius:"Avatars",background:"Background",bio:"Bio",block_export:"Block export",block_export_button:"Export your blocks to a csv file",block_import:"Block import",block_import_error:"Error importing blocks",blocks_imported:"Blocks imported! Processing them will take a while.",blocks_tab:"Blocks",bot:"This is a bot account",btnRadius:"Buttons",cBlue:"Blue (Reply, follow)",cGreen:"Green (Retweet)",cOrange:"Orange (Favorite)",cRed:"Red (Cancel)",change_email:"Change Email",change_email_error:"There was an issue changing your email.",changed_email:"Email changed successfully!",change_password:"Change Password",change_password_error:"There was an issue changing your password.",changed_password:"Password changed successfully!",chatMessageRadius:"Chat message",collapse_subject:"Collapse posts with subjects",composing:"Composing",confirm_new_password:"Confirm new password",current_password:"Current password",mutes_and_blocks:"Mutes and Blocks",data_import_export_tab:"Data Import / Export",default_vis:"Default visibility scope",delete_account:"Delete Account",delete_account_description:"Permanently delete your data and deactivate your account.",delete_account_error:"There was an issue deleting your account. If this persists please contact your instance administrator.",delete_account_instructions:"Type your password in the input below to confirm account deletion.",discoverable:"Allow discovery of this account in search results and other services",domain_mutes:"Domains",avatar_size_instruction:"The recommended minimum size for avatar images is 150x150 pixels.",pad_emoji:"Pad emoji with spaces when adding from picker",emoji_reactions_on_timeline:"Show emoji reactions on timeline",export_theme:"Save preset",filtering:"Filtering",filtering_explanation:"All statuses containing these words will be muted, one per line",follow_export:"Follow export",follow_export_button:"Export your follows to a csv file",follow_import:"Follow import",follow_import_error:"Error importing followers",follows_imported:"Follows imported! Processing them will take a while.",accent:"Accent",foreground:"Foreground",general:"General",hide_attachments_in_convo:"Hide attachments in conversations",hide_attachments_in_tl:"Hide attachments in timeline",hide_muted_posts:"Hide posts of muted users",max_thumbnails:"Maximum amount of thumbnails per post",hide_isp:"Hide instance-specific panel",preload_images:"Preload images",use_one_click_nsfw:"Open NSFW attachments with just one click",hide_post_stats:"Hide post statistics (e.g. the number of favorites)",hide_user_stats:"Hide user statistics (e.g. the number of followers)",hide_filtered_statuses:"Hide filtered statuses",import_blocks_from_a_csv_file:"Import blocks from a csv file",import_followers_from_a_csv_file:"Import follows from a csv file",import_theme:"Load preset",inputRadius:"Input fields",checkboxRadius:"Checkboxes",instance_default:"(default: {value})",instance_default_simple:"(default)",interface:"Interface",interfaceLanguage:"Interface language",invalid_theme_imported:"The selected file is not a supported Pleroma theme. No changes to your theme were made.",limited_availability:"Unavailable in your browser",links:"Links",lock_account_description:"Restrict your account to approved followers only",loop_video:"Loop videos",loop_video_silent_only:'Loop only videos without sound (i.e. Mastodon\'s "gifs")',mutes_tab:"Mutes",play_videos_in_modal:"Play videos in a popup frame",profile_fields:{label:"Profile metadata",add_field:"Add Field",name:"Label",value:"Content"},use_contain_fit:"Don't crop the attachment in thumbnails",name:"Name",name_bio:"Name & Bio",new_email:"New Email",new_password:"New password",notification_visibility:"Types of notifications to show",notification_visibility_follows:"Follows",notification_visibility_likes:"Likes",notification_visibility_mentions:"Mentions",notification_visibility_repeats:"Repeats",notification_visibility_moves:"User Migrates",notification_visibility_emoji_reactions:"Reactions",no_rich_text_description:"Strip rich text formatting from all posts",no_blocks:"No blocks",no_mutes:"No mutes",hide_follows_description:"Don't show who I'm following",hide_followers_description:"Don't show who's following me",hide_follows_count_description:"Don't show follow count",hide_followers_count_description:"Don't show follower count",show_admin_badge:"Show Admin badge in my profile",show_moderator_badge:"Show Moderator badge in my profile",nsfw_clickthrough:"Enable clickthrough NSFW attachment hiding",oauth_tokens:"OAuth tokens",token:"Token",refresh_token:"Refresh Token",valid_until:"Valid Until",revoke_token:"Revoke",panelRadius:"Panels",pause_on_unfocused:"Pause streaming when tab is not focused",presets:"Presets",profile_background:"Profile Background",profile_banner:"Profile Banner",profile_tab:"Profile",radii_help:"Set up interface edge rounding (in pixels)",replies_in_timeline:"Replies in timeline",reply_visibility_all:"Show all replies",reply_visibility_following:"Only show replies directed at me or users I'm following",reply_visibility_self:"Only show replies directed at me",autohide_floating_post_button:"Automatically hide New Post button (mobile)",saving_err:"Error saving settings",saving_ok:"Settings saved",search_user_to_block:"Search whom you want to block",search_user_to_mute:"Search whom you want to mute",security_tab:"Security",scope_copy:"Copy scope when replying (DMs are always copied)",minimal_scopes_mode:"Minimize post scope selection options",set_new_avatar:"Set new avatar",set_new_profile_background:"Set new profile background",set_new_profile_banner:"Set new profile banner",reset_avatar:"Reset avatar",reset_profile_background:"Reset profile background",reset_profile_banner:"Reset profile banner",reset_avatar_confirm:"Do you really want to reset the avatar?",reset_banner_confirm:"Do you really want to reset the banner?",reset_background_confirm:"Do you really want to reset the background?",settings:"Settings",subject_input_always_show:"Always show subject field",subject_line_behavior:"Copy subject when replying",subject_line_email:'Like email: "re: subject"',subject_line_mastodon:"Like mastodon: copy as is",subject_line_noop:"Do not copy",post_status_content_type:"Post status content type",stop_gifs:"Play-on-hover GIFs",streaming:"Enable automatic streaming of new posts when scrolled to the top",user_mutes:"Users",useStreamingApi:"Receive posts and notifications real-time",useStreamingApiWarning:"(Not recommended, experimental, known to skip posts)",text:"Text",theme:"Theme",theme_help:"Use hex color codes (#rrggbb) to customize your color theme.",theme_help_v2_1:'You can also override certain component\'s colors and opacity by toggling the checkbox, use "Clear all" button to clear all overrides.',theme_help_v2_2:"Icons underneath some entries are background/text contrast indicators, hover over for detailed info. Please keep in mind that when using transparency contrast indicators show the worst possible case.",tooltipRadius:"Tooltips/alerts",type_domains_to_mute:"Search domains to mute",upload_a_photo:"Upload a photo",user_settings:"User Settings",values:{false:"no",true:"yes"},fun:"Fun",greentext:"Meme arrows",notifications:"Notifications",notification_setting_filters:"Filters",notification_setting_block_from_strangers:"Block notifications from users who you do not follow",notification_setting_privacy:"Privacy",notification_setting_hide_notification_contents:"Hide the sender and contents of push notifications",notification_mutes:"To stop receiving notifications from a specific user, use a mute.",notification_blocks:"Blocking a user stops all notifications as well as unsubscribes them.",enable_web_push_notifications:"Enable web push notifications",style:{switcher:{keep_color:"Keep colors",keep_shadows:"Keep shadows",keep_opacity:"Keep opacity",keep_roundness:"Keep roundness",keep_fonts:"Keep fonts",save_load_hint:'"Keep" options preserve currently set options when selecting or loading themes, it also stores said options when exporting a theme. When all checkboxes unset, exporting theme will save everything.',reset:"Reset",clear_all:"Clear all",clear_opacity:"Clear opacity",load_theme:"Load theme",keep_as_is:"Keep as is",use_snapshot:"Old version",use_source:"New version",help:{upgraded_from_v2:"PleromaFE has been upgraded, theme could look a little bit different than you remember.",v2_imported:"File you imported was made for older FE. We try to maximize compatibility but there still could be inconsistencies.",future_version_imported:"File you imported was made in newer version of FE.",older_version_imported:"File you imported was made in older version of FE.",snapshot_present:"Theme snapshot is loaded, so all values are overriden. You can load theme's actual data instead.",snapshot_missing:"No theme snapshot was in the file so it could look different than originally envisioned.",fe_upgraded:"PleromaFE's theme engine upgraded after version update.",fe_downgraded:"PleromaFE's version rolled back.",migration_snapshot_ok:"Just to be safe, theme snapshot loaded. You can try loading theme data.",migration_napshot_gone:"For whatever reason snapshot was missing, some stuff could look different than you remember.",snapshot_source_mismatch:"Versions conflict: most likely FE was rolled back and updated again, if you changed theme using older version of FE you most likely want to use old version, otherwise use new version."}},common:{color:"Color",opacity:"Opacity",contrast:{hint:"Contrast ratio is {ratio}, it {level} {context}",level:{aa:"meets Level AA guideline (minimal)",aaa:"meets Level AAA guideline (recommended)",bad:"doesn't meet any accessibility guidelines"},context:{"18pt":"for large (18pt+) text",text:"for text"}}},common_colors:{_tab_label:"Common",main:"Common colors",foreground_hint:'See "Advanced" tab for more detailed control',rgbo:"Icons, accents, badges"},advanced_colors:{_tab_label:"Advanced",alert:"Alert background",alert_error:"Error",alert_warning:"Warning",alert_neutral:"Neutral",post:"Posts/User bios",badge:"Badge background",popover:"Tooltips, menus, popovers",badge_notification:"Notification",panel_header:"Panel header",top_bar:"Top bar",borders:"Borders",buttons:"Buttons",inputs:"Input fields",faint_text:"Faded text",underlay:"Underlay",poll:"Poll graph",icons:"Icons",highlight:"Highlighted elements",pressed:"Pressed",selectedPost:"Selected post",selectedMenu:"Selected menu item",disabled:"Disabled",toggled:"Toggled",tabs:"Tabs",chat:{incoming:"Incoming",outgoing:"Outgoing",border:"Border"}},radii:{_tab_label:"Roundness"},shadows:{_tab_label:"Shadow and lighting",component:"Component",override:"Override",shadow_id:"Shadow #{value}",blur:"Blur",spread:"Spread",inset:"Inset",hintV3:"For shadows you can also use the {0} notation to use other color slot.",filter_hint:{always_drop_shadow:"Warning, this shadow always uses {0} when browser supports it.",drop_shadow_syntax:"{0} does not support {1} parameter and {2} keyword.",avatar_inset:"Please note that combining both inset and non-inset shadows on avatars might give unexpected results with transparent avatars.",spread_zero:"Shadows with spread > 0 will appear as if it was set to zero",inset_classic:"Inset shadows will be using {0}"},components:{panel:"Panel",panelHeader:"Panel header",topBar:"Top bar",avatar:"User avatar (in profile view)",avatarStatus:"User avatar (in post display)",popup:"Popups and tooltips",button:"Button",buttonHover:"Button (hover)",buttonPressed:"Button (pressed)",buttonPressedHover:"Button (pressed+hover)",input:"Input field"}},fonts:{_tab_label:"Fonts",help:'Select font to use for elements of UI. For "custom" you have to enter exact font name as it appears in system.',components:{interface:"Interface",input:"Input fields",post:"Post text",postCode:"Monospaced text in a post (rich text)"},family:"Font name",size:"Size (in px)",weight:"Weight (boldness)",custom:"Custom"},preview:{header:"Preview",content:"Content",error:"Example error",button:"Button",text:"A bunch of more {0} and {1}",mono:"content",input:"Just landed in L.A.",faint_link:"helpful manual",fine_print:"Read our {0} to learn nothing useful!",header_faint:"This is fine",checkbox:"I have skimmed over terms and conditions",link:"a nice lil' link"}},version:{title:"Version",backend_version:"Backend Version",frontend_version:"Frontend Version"}},time:{day:"{0} day",days:"{0} days",day_short:"{0}d",days_short:"{0}d",hour:"{0} hour",hours:"{0} hours",hour_short:"{0}h",hours_short:"{0}h",in_future:"in {0}",in_past:"{0} ago",minute:"{0} minute",minutes:"{0} minutes",minute_short:"{0}min",minutes_short:"{0}min",month:"{0} month",months:"{0} months",month_short:"{0}mo",months_short:"{0}mo",now:"just now",now_short:"now",second:"{0} second",seconds:"{0} seconds",second_short:"{0}s",seconds_short:"{0}s",week:"{0} week",weeks:"{0} weeks",week_short:"{0}w",weeks_short:"{0}w",year:"{0} year",years:"{0} years",year_short:"{0}y",years_short:"{0}y"},timeline:{collapse:"Collapse",conversation:"Conversation",error_fetching:"Error fetching updates",load_older:"Load older statuses",no_retweet_hint:"Post is marked as followers-only or direct and cannot be repeated",repeated:"repeated",show_new:"Show new",reload:"Reload",up_to_date:"Up-to-date",no_more_statuses:"No more statuses",no_statuses:"No statuses"},status:{favorites:"Favorites",repeats:"Repeats",delete:"Delete status",pin:"Pin on profile",unpin:"Unpin from profile",pinned:"Pinned",bookmark:"Bookmark",unbookmark:"Unbookmark",delete_confirm:"Do you really want to delete this status?",reply_to:"Reply to",replies_list:"Replies:",mute_conversation:"Mute conversation",unmute_conversation:"Unmute conversation",status_unavailable:"Status unavailable",copy_link:"Copy link to status",thread_muted:"Thread muted",thread_muted_and_words:", has words:",show_full_subject:"Show full subject",hide_full_subject:"Hide full subject",show_content:"Show content",hide_content:"Hide content"},user_card:{approve:"Approve",block:"Block",blocked:"Blocked!",deny:"Deny",favorites:"Favorites",follow:"Follow",follow_sent:"Request sent!",follow_progress:"Requesting…",follow_again:"Send request again?",follow_unfollow:"Unfollow",followees:"Following",followers:"Followers",following:"Following!",follows_you:"Follows you!",hidden:"Hidden",its_you:"It's you!",media:"Media",mention:"Mention",message:"Message",mute:"Mute",muted:"Muted",per_day:"per day",remote_follow:"Remote follow",report:"Report",statuses:"Statuses",subscribe:"Subscribe",unsubscribe:"Unsubscribe",unblock:"Unblock",unblock_progress:"Unblocking…",block_progress:"Blocking…",unmute:"Unmute",unmute_progress:"Unmuting…",mute_progress:"Muting…",hide_repeats:"Hide repeats",show_repeats:"Show repeats",admin_menu:{moderation:"Moderation",grant_admin:"Grant Admin",revoke_admin:"Revoke Admin",grant_moderator:"Grant Moderator",revoke_moderator:"Revoke Moderator",activate_account:"Activate account",deactivate_account:"Deactivate account",delete_account:"Delete account",force_nsfw:"Mark all posts as NSFW",strip_media:"Remove media from posts",force_unlisted:"Force posts to be unlisted",sandbox:"Force posts to be followers-only",disable_remote_subscription:"Disallow following user from remote instances",disable_any_subscription:"Disallow following user at all",quarantine:"Disallow user posts from federating",delete_user:"Delete user",delete_user_confirmation:"Are you absolutely sure? This action cannot be undone."}},user_profile:{timeline_title:"User Timeline",profile_does_not_exist:"Sorry, this profile does not exist.",profile_loading_error:"Sorry, there was an error loading this profile."},user_reporting:{title:"Reporting {0}",add_comment_description:"The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",additional_comments:"Additional comments",forward_description:"The account is from another server. Send a copy of the report there as well?",forward_to:"Forward to {0}",submit:"Submit",generic_error:"An error occurred while processing your request."},who_to_follow:{more:"More",who_to_follow:"Who to follow"},tool_tip:{media_upload:"Upload Media",repeat:"Repeat",reply:"Reply",favorite:"Favorite",add_reaction:"Add Reaction",user_settings:"User Settings",accept_follow_request:"Accept follow request",reject_follow_request:"Reject follow request",bookmark:"Bookmark"},upload:{error:{base:"Upload failed.",file_too_big:"File too big [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",default:"Try again later"},file_size_units:{B:"B",KiB:"KiB",MiB:"MiB",GiB:"GiB",TiB:"TiB"}},search:{people:"People",hashtags:"Hashtags",person_talking:"{count} person talking",people_talking:"{count} people talking",no_results:"No results"},password_reset:{forgot_password:"Forgot password?",password_reset:"Password reset",instruction:"Enter your email address or username. We will send you a link to reset your password.",placeholder:"Your email or username",check_email:"Check your email for a link to reset your password.",return_home:"Return to the home page",too_many_requests:"You have reached the limit of attempts, try again later.",password_reset_disabled:"Password reset is disabled. Please contact your instance administrator.",password_reset_required:"You must reset your password to log in.",password_reset_required_but_mailer_is_disabled:"You must reset your password, but password reset is disabled. Please contact your instance administrator."},chats:{you:"You:",message_user:"Message {nickname}",delete:"Delete",chats:"Chats",new:"New Chat",empty_message_error:"Cannot post empty message",more:"More",delete_confirm:"Do you really want to delete this message?",error_loading_chat:"Something went wrong when loading the chat.",error_sending_message:"Something went wrong when sending the message.",empty_chat_list_placeholder:"You don't have any chats yet. Start a new chat!"},file_type:{audio:"Audio",video:"Video",image:"Image",file:"File"},display_date:{today:"Today"}}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(t,e,n){var i=n(369);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("0084eb3d",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".timeline .loadmore-text{opacity:1}.timeline-heading{max-width:100%;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.timeline-heading .loadmore-button,.timeline-heading .loadmore-text{-ms-flex-negative:0;flex-shrink:0}.timeline-heading .loadmore-text{line-height:1em}",""])},,,,,function(t,e,n){var i=n(375);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("80571546",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.Status{min-width:0}.Status:hover{--still-image-img:visible;--still-image-canvas:hidden}.Status.-focused{background-color:#151e2a;background-color:var(--selectedPost,#151e2a);color:#b9b9ba;color:var(--selectedPostText,#b9b9ba);--lightText:var(--selectedPostLightText,$fallback--light);--faint:var(--selectedPostFaintText,$fallback--faint);--faintLink:var(--selectedPostFaintLink,$fallback--faint);--postLink:var(--selectedPostPostLink,$fallback--faint);--postFaintLink:var(--selectedPostFaintPostLink,$fallback--faint);--icon:var(--selectedPostIcon,$fallback--icon)}.Status .status-container{display:-ms-flexbox;display:flex;padding:.75em}.Status .status-container.-repeat{padding-top:0}.Status .pin{padding:.75em .75em 0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end}.Status .left-side{margin-right:.75em}.Status .right-side{-ms-flex:1;flex:1;min-width:0}.Status .usercard{margin-bottom:.75em}.Status .status-username{white-space:nowrap;font-size:14px;overflow:hidden;max-width:85%;font-weight:700;-ms-flex-negative:1;flex-shrink:1;margin-right:.4em;text-overflow:ellipsis}.Status .status-username .emoji{width:14px;height:14px;vertical-align:middle;-o-object-fit:contain;object-fit:contain}.Status .status-favicon{height:18px;width:18px;margin-right:.4em}.Status .status-heading{margin-bottom:.5em}.Status .heading-name-row{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;line-height:18px}.Status .heading-name-row a{display:inline-block;word-break:break-all}.Status .account-name{min-width:1.6em;margin-right:.4em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-ms-flex:1 1 0px;flex:1 1 0}.Status .heading-left{display:-ms-flexbox;display:flex;min-width:0}.Status .heading-right{display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0}.Status .timeago{margin-right:.2em}.Status .heading-reply-row{position:relative;-ms-flex-line-pack:baseline;align-content:baseline;font-size:12px;line-height:18px;max-width:100%;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch}.Status .reply-to-and-accountname{display:-ms-flexbox;display:flex;height:18px;margin-right:.5em;max-width:100%}.Status .reply-to-and-accountname .reply-to-link{white-space:nowrap;word-break:break-word;text-overflow:ellipsis;overflow-x:hidden}.Status .reply-to-and-accountname .icon-reply{transform:scaleX(-1)}.Status .reply-to-no-popover,.Status .reply-to-popover{min-width:0;margin-right:.4em;-ms-flex-negative:0;flex-shrink:0}.Status .reply-to-popover .reply-to:hover:before{content:"";display:block;position:absolute;bottom:0;width:100%;border-bottom:1px solid var(--faint);pointer-events:none}.Status .reply-to-popover .faint-link:hover{text-decoration:none}.Status .reply-to-popover.-strikethrough .reply-to:after{content:"";display:block;position:absolute;top:50%;width:100%;border-bottom:1px solid var(--faint);pointer-events:none}.Status .reply-to{display:-ms-flexbox;display:flex;position:relative}.Status .reply-to-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-left:.2em}.Status .replies-separator{margin-left:.4em}.Status .replies{line-height:18px;font-size:12px;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.Status .replies>*{margin-right:.4em}.Status .reply-link{height:17px}.Status .repeat-info{padding:.4em .75em;line-height:22px}.Status .repeat-info .right-side{display:-ms-flexbox;display:flex;-ms-flex-line-pack:center;align-content:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.Status .repeat-info i{padding:0 .2em}.Status .repeater-avatar{border-radius:var(--avatarAltRadius,10px);margin-left:28px;width:20px;height:20px}.Status .repeater-name{text-overflow:ellipsis;margin-right:0}.Status .repeater-name .emoji{width:14px;height:14px;vertical-align:middle;-o-object-fit:contain;object-fit:contain}.Status .status-fadein{animation-duration:.4s;animation-name:fadein}@keyframes fadein{0%{opacity:0}to{opacity:1}}.Status .status-actions{position:relative;width:100%;display:-ms-flexbox;display:flex;margin-top:.75em}.Status .status-actions>*{max-width:4em;-ms-flex:1;flex:1}.Status .button-reply:not(.-disabled){cursor:pointer}.Status .button-reply.-active,.Status .button-reply:not(.-disabled):hover{color:#0095ff;color:var(--cBlue,#0095ff)}.Status .muted{padding:.25em .6em;height:1.2em;line-height:1.2em;text-overflow:ellipsis;overflow:hidden;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.Status .muted .mute-thread,.Status .muted .mute-words,.Status .muted .status-username{word-wrap:normal;word-break:normal;white-space:nowrap}.Status .muted .mute-words,.Status .muted .status-username{text-overflow:ellipsis;overflow:hidden}.Status .muted .status-username{font-weight:400;-ms-flex:0 1 auto;flex:0 1 auto;margin-right:.2em;font-size:smaller}.Status .muted .mute-thread{-ms-flex:0 0 auto;flex:0 0 auto}.Status .muted .mute-words{-ms-flex:1 0 5em;flex:1 0 5em;margin-left:.2em}.Status .muted .mute-words:before{content:" "}.Status .muted .unmute{-ms-flex:0 0 auto;flex:0 0 auto;margin-left:auto;display:block}.Status .reply-form{padding-top:0;padding-bottom:0}.Status .reply-body{-ms-flex:1;flex:1}.Status .favs-repeated-users{margin-top:.75em}.Status .stats{width:100%;display:-ms-flexbox;display:flex;line-height:1em}.Status .avatar-row{-ms-flex:1;flex:1;overflow:hidden;position:relative;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.Status .avatar-row:before{content:"";position:absolute;height:100%;width:1px;left:0;background-color:var(--faint,hsla(240,1%,73%,.5))}.Status .stat-count{margin-right:.75em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.Status .stat-count .stat-title{color:var(--faint,hsla(240,1%,73%,.5));font-size:12px;text-transform:uppercase;position:relative}.Status .stat-count .stat-number{font-weight:bolder;font-size:16px;line-height:1em}.Status .stat-count:hover .stat-title{text-decoration:underline}@media (max-width:800px){.Status .repeater-avatar{margin-left:20px}.Status .avatar:not(.repeater-avatar){width:40px;height:40px}.Status .avatar:not(.repeater-avatar).avatar-compact{width:32px;height:32px}}',""])},,function(t,e,n){var i=n(378);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7d4fb47f",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".fav-active{cursor:pointer;animation-duration:.6s}.fav-active:hover,.favorite-button.icon-star{color:orange;color:var(--cOrange,orange)}",""])},function(t,e,n){var i=n(380);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("b98558e8",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".reaction-picker-filter{padding:.5em;display:-ms-flexbox;display:flex}.reaction-picker-filter input{-ms-flex:1;flex:1}.reaction-picker-divider{height:1px;width:100%;margin:.5em;background-color:var(--border,#222)}.reaction-picker{width:10em;height:9em;font-size:1.5em;overflow-y:scroll;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.5em;text-align:center;-ms-flex-line-pack:start;align-content:flex-start;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-mask:linear-gradient(0deg,#fff 0,transparent) bottom no-repeat,linear-gradient(180deg,#fff 0,transparent) top no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff 0,transparent) bottom no-repeat,linear-gradient(180deg,#fff 0,transparent) top no-repeat,linear-gradient(0deg,#fff,#fff);transition:-webkit-mask-size .15s;transition:mask-size .15s;transition:mask-size .15s,-webkit-mask-size .15s;-webkit-mask-size:100% 20px,100% 20px,auto;mask-size:100% 20px,100% 20px,auto;-webkit-mask-composite:xor;mask-composite:exclude}.reaction-picker .emoji-button{cursor:pointer;-ms-flex-preferred-size:20%;flex-basis:20%;line-height:1.5em;-ms-flex-line-pack:center;align-content:center}.reaction-picker .emoji-button:hover{transform:scale(1.25)}.add-reaction-button{cursor:pointer}.add-reaction-button:hover{color:#b9b9ba;color:var(--text,#b9b9ba)}",""])},function(t,e,n){var i=n(382);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("92bf6e22",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".popover{z-index:8;position:absolute;min-width:0}.popover-default{transition:opacity .3s;box-shadow:1px 1px 4px rgba(0,0,0,.6);box-shadow:var(--panelShadow);border-radius:4px;border-radius:var(--btnRadius,4px);background-color:#121a24;background-color:var(--popover,#121a24);color:#b9b9ba;color:var(--popoverText,#b9b9ba);--faint:var(--popoverFaintText,$fallback--faint);--faintLink:var(--popoverFaintLink,$fallback--faint);--lightText:var(--popoverLightText,$fallback--lightText);--postLink:var(--popoverPostLink,$fallback--link);--postFaintLink:var(--popoverPostFaintLink,$fallback--link);--icon:var(--popoverIcon,$fallback--icon)}.dropdown-menu{display:block;padding:.5rem 0;font-size:1rem;text-align:left;list-style:none;max-width:100vw;z-index:10;white-space:nowrap}.dropdown-menu .dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #222;border-top:1px solid var(--border,#222)}.dropdown-menu .dropdown-item{line-height:21px;margin-right:5px;overflow:auto;display:block;padding:.25rem 1rem .25rem 1.5rem;clear:both;font-weight:400;text-align:inherit;white-space:nowrap;border:none;border-radius:0;background-color:transparent;box-shadow:none;width:100%;height:100%;--btnText:var(--popoverText,$fallback--text)}.dropdown-menu .dropdown-item-icon{padding-left:.5rem}.dropdown-menu .dropdown-item-icon i{margin-right:.25rem;color:var(--menuPopoverIcon,#666)}.dropdown-menu .dropdown-item:active,.dropdown-menu .dropdown-item:hover{background-color:#151e2a;background-color:var(--selectedMenuPopover,#151e2a);color:#d8a070;color:var(--selectedMenuPopoverText,#d8a070);--faint:var(--selectedMenuPopoverFaintText,$fallback--faint);--faintLink:var(--selectedMenuPopoverFaintLink,$fallback--faint);--lightText:var(--selectedMenuPopoverLightText,$fallback--lightText);--icon:var(--selectedMenuPopoverIcon,$fallback--icon)}.dropdown-menu .dropdown-item:active i,.dropdown-menu .dropdown-item:hover i{color:var(--selectedMenuPopoverIcon,#666)}",""])},function(t,e,n){var i=n(384);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("2c52cbcb",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".rt-active{cursor:pointer;animation-duration:.6s}.icon-retweet.retweeted,.rt-active:hover{color:#0fa00f;color:var(--cGreen,#0fa00f)}",""])},function(t,e,n){var i=n(386);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("0d2c533c",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".icon-ellipsis{cursor:pointer}.extra-button-popover.open .icon-ellipsis,.icon-ellipsis:hover{color:#b9b9ba;color:var(--text,#b9b9ba)}",""])},function(t,e,n){var i=n(388);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("ce7966a8",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".tribute-container ul{padding:0}.tribute-container ul li{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.tribute-container img{padding:3px;width:16px;height:16px;border-radius:10px;border-radius:var(--avatarAltRadius,10px)}.post-status-form{position:relative}.post-status-form .form-bottom{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:.5em;height:32px}.post-status-form .form-bottom button{width:10em}.post-status-form .form-bottom p{margin:.35em;padding:.35em;display:-ms-flexbox;display:flex}.post-status-form .form-bottom-left{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;padding-right:7px;margin-right:7px;max-width:10em}.post-status-form .preview-heading{padding-left:.5em;display:-ms-flexbox;display:flex;width:100%}.post-status-form .preview-heading .icon-spin3{margin-left:auto}.post-status-form .preview-toggle{display:-ms-flexbox;display:flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.post-status-form .preview-toggle:hover{text-decoration:underline}.post-status-form .preview-toggle i{margin-left:.2em;font-size:.8em;transform:rotate(90deg)}.post-status-form .preview-container{margin-bottom:1em}.post-status-form .preview-error{font-style:italic;color:hsla(240,1%,73%,.5);color:var(--faint,hsla(240,1%,73%,.5))}.post-status-form .preview-status{border:1px solid #222;border:1px solid var(--border,#222);border-radius:5px;border-radius:var(--tooltipRadius,5px);padding:.5em;margin:0;line-height:1.4em}.post-status-form .text-format .only-format{color:hsla(240,1%,73%,.5);color:var(--faint,hsla(240,1%,73%,.5))}.post-status-form .visibility-tray{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding-top:5px}.post-status-form .emoji-icon,.post-status-form .media-upload-icon,.post-status-form .poll-icon{font-size:26px;-ms-flex:1;flex:1}.post-status-form .emoji-icon.selected i,.post-status-form .emoji-icon.selected label,.post-status-form .emoji-icon:hover i,.post-status-form .emoji-icon:hover label,.post-status-form .media-upload-icon.selected i,.post-status-form .media-upload-icon.selected label,.post-status-form .media-upload-icon:hover i,.post-status-form .media-upload-icon:hover label,.post-status-form .poll-icon.selected i,.post-status-form .poll-icon.selected label,.post-status-form .poll-icon:hover i,.post-status-form .poll-icon:hover label{color:#b9b9ba;color:var(--lightText,#b9b9ba)}.post-status-form .emoji-icon.disabled i,.post-status-form .media-upload-icon.disabled i,.post-status-form .poll-icon.disabled i{cursor:not-allowed;color:#666;color:var(--btnDisabledText,#666)}.post-status-form .emoji-icon.disabled i:hover,.post-status-form .media-upload-icon.disabled i:hover,.post-status-form .poll-icon.disabled i:hover{color:#666;color:var(--btnDisabledText,#666)}.post-status-form .media-upload-icon{-ms-flex-order:1;order:1;text-align:left}.post-status-form .emoji-icon{-ms-flex-order:2;order:2;text-align:center}.post-status-form .poll-icon{-ms-flex-order:3;order:3;text-align:right}.post-status-form .icon-chart-bar{cursor:pointer}.post-status-form .error{text-align:center}.post-status-form .media-upload-wrapper{margin-right:.2em;margin-bottom:.5em;width:18em}.post-status-form .media-upload-wrapper .icon-cancel{display:inline-block;position:static;margin:0;padding-bottom:0;margin-left:10px;margin-left:var(--attachmentRadius,10px);background-color:#182230;background-color:var(--btn,#182230);border-bottom-left-radius:0;border-bottom-right-radius:0}.post-status-form .media-upload-wrapper img,.post-status-form .media-upload-wrapper video{-o-object-fit:contain;object-fit:contain;max-height:10em}.post-status-form .media-upload-wrapper .video{max-height:10em}.post-status-form .media-upload-wrapper input{-ms-flex:1;flex:1;width:100%}.post-status-form .status-input-wrapper{display:-ms-flexbox;display:flex;position:relative;width:100%;-ms-flex-direction:column;flex-direction:column}.post-status-form .media-upload-wrapper .attachments{padding:0 .5em}.post-status-form .media-upload-wrapper .attachments .attachment{margin:0;padding:0;position:relative}.post-status-form .media-upload-wrapper .attachments i{position:absolute;margin:10px;padding:5px;background:hsla(0,0%,90%,.6);border-radius:10px;border-radius:var(--attachmentRadius,10px);font-weight:700}.post-status-form form{margin:.6em;position:relative}.post-status-form .form-group,.post-status-form form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.post-status-form .form-group{padding:.25em .5em .5em;line-height:24px}.post-status-form .form-post-body,.post-status-form form textarea.form-cw{line-height:16px;resize:none;overflow:hidden;transition:min-height .2s .1s;min-height:1px}.post-status-form .form-post-body{height:16px;padding-bottom:1.75em;box-sizing:content-box}.post-status-form .form-post-body.scrollable-form{overflow-y:auto}.post-status-form .main-input{position:relative}.post-status-form .character-counter{position:absolute;bottom:0;right:0;padding:0;margin:0 .5em}.post-status-form .character-counter.error{color:red;color:var(--cRed,red)}.post-status-form .btn{cursor:pointer}.post-status-form .btn[disabled]{cursor:not-allowed}.post-status-form .icon-cancel{cursor:pointer;z-index:4}@keyframes fade-in{0%{opacity:0}to{opacity:.6}}@keyframes fade-out{0%{opacity:.6}to{opacity:0}}.post-status-form .drop-indicator{position:absolute;z-index:1;width:100%;height:100%;font-size:5em;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;opacity:.6;color:#b9b9ba;color:var(--text,#b9b9ba);background-color:#121a24;background-color:var(--bg,#121a24);border-radius:5px;border-radius:var(--tooltipRadius,5px);border:2px dashed #b9b9ba;border:2px dashed var(--text,#b9b9ba)}.media-upload-container>video,img.media-upload{line-height:0;max-height:200px;max-width:100%}",""])},function(t,e,n){var i=n(390);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("8585287c",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".media-upload .label{display:inline-block}.media-upload .new-icon{cursor:pointer}.media-upload .progress-icon{display:inline-block;line-height:0}.media-upload .progress-icon:before{margin:0;line-height:0}",""])},function(t,e,n){var i=n(392);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("770eecd8",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".scope-selector i{font-size:1.2em;cursor:pointer}.scope-selector i.selected{color:#b9b9ba;color:var(--lightText,#b9b9ba)}",""])},function(t,e,n){var i=n(394);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("d6bd964a",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".emoji-input{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;position:relative}.emoji-input.with-picker input{padding-right:30px}.emoji-input .emoji-picker-icon{position:absolute;top:0;right:0;margin:.2em .25em;font-size:16px;cursor:pointer;line-height:24px}.emoji-input .emoji-picker-icon:hover i{color:#b9b9ba;color:var(--text,#b9b9ba)}.emoji-input .emoji-picker-panel{position:absolute;z-index:20;margin-top:2px}.emoji-input .emoji-picker-panel.hide{display:none}.emoji-input .autocomplete-panel{position:absolute;z-index:20;margin-top:2px}.emoji-input .autocomplete-panel.hide{display:none}.emoji-input .autocomplete-panel-body{margin:0 .5em;border-radius:5px;border-radius:var(--tooltipRadius,5px);box-shadow:1px 2px 4px rgba(0,0,0,.5);box-shadow:var(--popupShadow);min-width:75%;background-color:#121a24;background-color:var(--popover,#121a24);color:#d8a070;color:var(--popoverText,#d8a070);--faint:var(--popoverFaintText,$fallback--faint);--faintLink:var(--popoverFaintLink,$fallback--faint);--lightText:var(--popoverLightText,$fallback--lightText);--postLink:var(--popoverPostLink,$fallback--link);--postFaintLink:var(--popoverPostFaintLink,$fallback--link);--icon:var(--popoverIcon,$fallback--icon)}.emoji-input .autocomplete-item{display:-ms-flexbox;display:flex;cursor:pointer;padding:.2em .4em;border-bottom:1px solid rgba(0,0,0,.4);height:32px}.emoji-input .autocomplete-item .image{width:32px;height:32px;line-height:32px;text-align:center;font-size:32px;margin-right:4px}.emoji-input .autocomplete-item .image img{width:32px;height:32px;-o-object-fit:contain;object-fit:contain}.emoji-input .autocomplete-item .label{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;margin:0 .1em 0 .2em}.emoji-input .autocomplete-item .label .displayText{line-height:1.5}.emoji-input .autocomplete-item .label .detailText{font-size:9px;line-height:9px}.emoji-input .autocomplete-item.highlighted{background-color:#182230;background-color:var(--selectedMenuPopover,#182230);color:var(--selectedMenuPopoverText,#b9b9ba);--faint:var(--selectedMenuPopoverFaintText,$fallback--faint);--faintLink:var(--selectedMenuPopoverFaintLink,$fallback--faint);--lightText:var(--selectedMenuPopoverLightText,$fallback--lightText);--icon:var(--selectedMenuPopoverIcon,$fallback--icon)}.emoji-input input,.emoji-input textarea{-ms-flex:1 0 auto;flex:1 0 auto}",""])},function(t,e,n){var i=n(396);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7bb72e68",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".emoji-picker{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;position:absolute;right:0;left:0;margin:0!important;z-index:1;background-color:#121a24;background-color:var(--popover,#121a24);color:#d8a070;color:var(--popoverText,#d8a070);--lightText:var(--popoverLightText,$fallback--faint);--faint:var(--popoverFaintText,$fallback--faint);--faintLink:var(--popoverFaintLink,$fallback--faint);--lightText:var(--popoverLightText,$fallback--lightText);--icon:var(--popoverIcon,$fallback--icon)}.emoji-picker .keep-open,.emoji-picker .too-many-emoji{padding:7px;line-height:normal}.emoji-picker .too-many-emoji{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.emoji-picker .keep-open-label{padding:0 7px;display:-ms-flexbox;display:flex}.emoji-picker .heading{display:-ms-flexbox;display:flex;height:32px;padding:10px 7px 5px}.emoji-picker .content{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1 1 auto;flex:1 1 auto;min-height:0}.emoji-picker .emoji-tabs{-ms-flex-positive:1;flex-grow:1}.emoji-picker .emoji-groups{min-height:200px}.emoji-picker .additional-tabs{border-left:1px solid;border-left-color:#666;border-left-color:var(--icon,#666);padding-left:7px;-ms-flex:0 0 auto;flex:0 0 auto}.emoji-picker .additional-tabs,.emoji-picker .emoji-tabs{display:block;min-width:0;-ms-flex-preferred-size:auto;flex-basis:auto;-ms-flex-negative:1;flex-shrink:1}.emoji-picker .additional-tabs-item,.emoji-picker .emoji-tabs-item{padding:0 7px;cursor:pointer;font-size:24px}.emoji-picker .additional-tabs-item.disabled,.emoji-picker .emoji-tabs-item.disabled{opacity:.5;pointer-events:none}.emoji-picker .additional-tabs-item.active,.emoji-picker .emoji-tabs-item.active{border-bottom:4px solid}.emoji-picker .additional-tabs-item.active i,.emoji-picker .emoji-tabs-item.active i{color:#b9b9ba;color:var(--lightText,#b9b9ba)}.emoji-picker .sticker-picker{-ms-flex:1 1 auto;flex:1 1 auto}.emoji-picker .emoji-content,.emoji-picker .stickers-content{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex:1 1 auto;flex:1 1 auto;min-height:0}.emoji-picker .emoji-content.hidden,.emoji-picker .stickers-content.hidden{opacity:0;pointer-events:none;position:absolute}.emoji-picker .emoji-search{padding:5px;-ms-flex:0 0 auto;flex:0 0 auto}.emoji-picker .emoji-search input{width:100%}.emoji-picker .emoji-groups{-ms-flex:1 1 1px;flex:1 1 1px;position:relative;overflow:auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-mask:linear-gradient(0deg,#fff 0,transparent) bottom no-repeat,linear-gradient(180deg,#fff 0,transparent) top no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff 0,transparent) bottom no-repeat,linear-gradient(180deg,#fff 0,transparent) top no-repeat,linear-gradient(0deg,#fff,#fff);transition:-webkit-mask-size .15s;transition:mask-size .15s;transition:mask-size .15s,-webkit-mask-size .15s;-webkit-mask-size:100% 20px,100% 20px,auto;mask-size:100% 20px,100% 20px,auto;-webkit-mask-composite:xor;mask-composite:exclude}.emoji-picker .emoji-groups.scrolled-top{-webkit-mask-size:100% 20px,100% 0,auto;mask-size:100% 20px,100% 0,auto}.emoji-picker .emoji-groups.scrolled-bottom{-webkit-mask-size:100% 0,100% 20px,auto;mask-size:100% 0,100% 20px,auto}.emoji-picker .emoji-group{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:5px;-ms-flex-pack:left;justify-content:left}.emoji-picker .emoji-group-title{font-size:12px;width:100%;margin:0}.emoji-picker .emoji-group-title.disabled{display:none}.emoji-picker .emoji-item{width:32px;height:32px;box-sizing:border-box;display:-ms-flexbox;display:flex;font-size:32px;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin:4px;cursor:pointer}.emoji-picker .emoji-item img{-o-object-fit:contain;object-fit:contain;max-width:100%;max-height:100%}",""])},function(t,e,n){var i=n(398);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("002629bb",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.checkbox{position:relative;display:inline-block;min-height:1.2em}.checkbox-indicator{position:relative;padding-left:1.2em}.checkbox-indicator:before{position:absolute;right:0;top:0;display:block;content:"\\2713";transition:color .2s;width:1.1em;height:1.1em;border-radius:2px;border-radius:var(--checkboxRadius,2px);box-shadow:inset 0 0 2px #000;box-shadow:var(--inputShadow);background-color:#182230;background-color:var(--input,#182230);vertical-align:top;text-align:center;line-height:1.1em;font-size:1.1em;color:transparent;overflow:hidden;box-sizing:border-box}.checkbox.disabled .checkbox-indicator:before,.checkbox.disabled .label{opacity:.5}.checkbox.disabled .label{color:hsla(240,1%,73%,.5);color:var(--faint,hsla(240,1%,73%,.5))}.checkbox input[type=checkbox]{display:none}.checkbox input[type=checkbox]:checked+.checkbox-indicator:before{color:#b9b9ba;color:var(--inputText,#b9b9ba)}.checkbox input[type=checkbox]:indeterminate+.checkbox-indicator:before{content:"\\2013";color:#b9b9ba;color:var(--inputText,#b9b9ba)}.checkbox>span{margin-left:.5em}',""])},function(t,e,n){var i=n(400);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("60db0262",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".poll-form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:0 .5em .5em}.poll-form .add-option{-ms-flex-item-align:start;align-self:flex-start;padding-top:.25em;cursor:pointer}.poll-form .poll-option{display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.25em}.poll-form .input-container{width:100%}.poll-form .input-container input{padding-right:2.5em;width:100%}.poll-form .icon-container{width:2em;margin-left:-2em;z-index:1}.poll-form .poll-type-expiry{margin-top:.5em;display:-ms-flexbox;display:flex;width:100%}.poll-form .poll-type{margin-right:.75em;-ms-flex:1 1 60%;flex:1 1 60%}.poll-form .poll-type .select{border:none;box-shadow:none;background-color:transparent}.poll-form .poll-expiry{display:-ms-flexbox;display:flex}.poll-form .poll-expiry .expiry-amount{width:3em;text-align:right}.poll-form .poll-expiry .expiry-unit{border:none;box-shadow:none;background-color:transparent}",""])},function(t,e,n){var i=n(402);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("60b296ca",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".attachments{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.attachments .non-gallery{max-width:100%}.attachments .placeholder{display:inline-block;padding:.3em 1em .3em 0;color:#d8a070;color:var(--postLink,#d8a070);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;max-width:100%}.attachments .nsfw-placeholder{cursor:pointer}.attachments .nsfw-placeholder.loading{cursor:progress}.attachments .attachment{position:relative;margin-top:.5em;-ms-flex-item-align:start;align-self:flex-start;line-height:0;border-radius:10px;border-radius:var(--attachmentRadius,10px);border-color:#222;border:1px solid var(--border,#222);overflow:hidden}.attachments .non-gallery.attachment.video{-ms-flex:1 0 40%;flex:1 0 40%}.attachments .non-gallery.attachment .nsfw{height:260px}.attachments .non-gallery.attachment .small{height:120px;-ms-flex-positive:0;flex-grow:0}.attachments .non-gallery.attachment .video{height:260px;display:-ms-flexbox;display:flex}.attachments .non-gallery.attachment video{max-height:100%;-o-object-fit:contain;object-fit:contain}.attachments .fullwidth{-ms-flex-preferred-size:100%;flex-basis:100%}.attachments.video{line-height:0}.attachments .video-container{display:-ms-flexbox;display:flex;max-height:100%}.attachments .video{width:100%;height:100%}.attachments .play-icon{position:absolute;font-size:64px;top:calc(50% - 32px);left:calc(50% - 32px);color:hsla(0,0%,100%,.75);text-shadow:0 0 2px rgba(0,0,0,.4)}.attachments .play-icon:before{margin:0}.attachments.html{-ms-flex-preferred-size:90%;flex-basis:90%;width:100%;display:-ms-flexbox;display:flex}.attachments .hider{position:absolute;right:0;white-space:nowrap;margin:10px;padding:5px;background:hsla(0,0%,90%,.6);font-weight:700;z-index:4;line-height:1;border-radius:5px;border-radius:var(--tooltipRadius,5px)}.attachments video{z-index:0}.attachments audio{width:100%}.attachments img.media-upload{line-height:0;max-height:200px;max-width:100%}.attachments .oembed{line-height:1.2em;-ms-flex:1 0 100%;flex:1 0 100%;width:100%;margin-right:15px;display:-ms-flexbox;display:flex}.attachments .oembed img{width:100%}.attachments .oembed .image{-ms-flex:1;flex:1}.attachments .oembed .image img{border:0;border-radius:5px;height:100%;-o-object-fit:cover;object-fit:cover}.attachments .oembed .text{-ms-flex:2;flex:2;margin:8px;word-break:break-all}.attachments .oembed .text h1{font-size:14px;margin:0}.attachments .image-attachment,.attachments .image-attachment .image{width:100%;height:100%}.attachments .image-attachment.hidden{display:none}.attachments .image-attachment .nsfw{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.attachments .image-attachment img{image-orientation:from-image}",""])},function(t,e,n){var i=n(404);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("24ab97e0",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.still-image{position:relative;line-height:0;overflow:hidden;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.still-image canvas{position:absolute;top:0;bottom:0;left:0;right:0;height:100%;visibility:var(--still-image-canvas,visible)}.still-image canvas,.still-image img{width:100%;-o-object-fit:contain;object-fit:contain}.still-image img{min-height:100%}.still-image.animated:before{content:"gif";position:absolute;line-height:10px;font-size:10px;top:5px;left:5px;background:hsla(0,0%,50%,.5);color:#fff;display:block;padding:2px 4px;border-radius:5px;border-radius:var(--tooltipRadius,5px);z-index:2;visibility:var(--still-image-label-visibility,visible)}.still-image.animated:hover canvas{display:none}.still-image.animated:hover:before,.still-image.animated img{visibility:var(--still-image-img,hidden)}.still-image.animated:hover img{visibility:visible}',""])},function(t,e,n){var i=n(406);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("af4a4f5c",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".StatusContent{-ms-flex:1;flex:1;min-width:0}.StatusContent .status-content-wrapper{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.StatusContent .tall-status{position:relative;height:220px;overflow-x:hidden;overflow-y:hidden;z-index:1}.StatusContent .tall-status .status-content{min-height:0;-webkit-mask:linear-gradient(0deg,#fff,transparent) bottom/100% 70px no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff,transparent) bottom/100% 70px no-repeat,linear-gradient(0deg,#fff,#fff);-webkit-mask-composite:xor;mask-composite:exclude}.StatusContent .tall-status-hider{position:absolute;height:70px;margin-top:150px;line-height:110px;z-index:2}.StatusContent .cw-status-hider,.StatusContent .status-unhider,.StatusContent .tall-status-hider{display:inline-block;word-break:break-all;width:100%;text-align:center}.StatusContent img,.StatusContent video{max-width:100%;max-height:400px;vertical-align:middle;-o-object-fit:contain;object-fit:contain}.StatusContent img.emoji,.StatusContent video.emoji{width:32px;height:32px}.StatusContent .summary-wrapper{margin-bottom:.5em;border-style:solid;border-width:0 0 1px;border-color:var(--border,#222);-ms-flex-positive:0;flex-grow:0}.StatusContent .summary{font-style:italic;padding-bottom:.5em}.StatusContent .tall-subject{position:relative}.StatusContent .tall-subject .summary{max-height:2em;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.StatusContent .tall-subject-hider{display:inline-block;word-break:break-all;width:100%;text-align:center;padding-bottom:.5em}.StatusContent .status-content{font-family:var(--postFont,sans-serif);line-height:1.4em;white-space:pre-wrap;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.StatusContent .status-content blockquote{margin:.2em 0 .2em 2em;font-style:italic}.StatusContent .status-content pre{overflow:auto}.StatusContent .status-content code,.StatusContent .status-content kbd,.StatusContent .status-content pre,.StatusContent .status-content samp,.StatusContent .status-content var{font-family:var(--postCodeFont,monospace)}.StatusContent .status-content p{margin:0 0 1em}.StatusContent .status-content p:last-child{margin:0}.StatusContent .status-content h1{font-size:1.1em;line-height:1.2em;margin:1.4em 0}.StatusContent .status-content h2{font-size:1.1em;margin:1em 0}.StatusContent .status-content h3{font-size:1em;margin:1.2em 0}.StatusContent .status-content h4{margin:1.1em 0}.StatusContent .status-content.single-line{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;height:1.4em}.greentext{color:#0fa00f;color:var(--postGreentext,#0fa00f)}",""])},function(t,e,n){var i=n(408);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("1a8b173f",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".poll .votes{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin:0 0 .5em}.poll .poll-option{margin:.75em .5em}.poll .option-result{height:100%;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;position:relative;color:#b9b9ba;color:var(--lightText,#b9b9ba)}.poll .option-result-label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.1em .25em;z-index:1;word-break:break-word}.poll .result-percentage{width:3.5em;-ms-flex-negative:0;flex-shrink:0}.poll .result-fill{height:100%;position:absolute;color:#b9b9ba;color:var(--pollText,#b9b9ba);background-color:#151e2a;background-color:var(--poll,#151e2a);border-radius:10px;border-radius:var(--panelRadius,10px);top:0;left:0;transition:width .5s}.poll .option-vote{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.poll input{width:3.5em}.poll .footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.poll.loading *{cursor:progress}.poll .poll-vote-button{padding:0 .5em;margin-right:.5em}",""])},function(t,e,n){var i=n(410);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("6c9d5cbc",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".gallery-row{position:relative;height:0;width:100%;-ms-flex-positive:1;flex-grow:1;margin-top:.5em}.gallery-row .gallery-row-inner{position:absolute;top:0;left:0;right:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-line-pack:stretch;align-content:stretch}.gallery-row .gallery-row-inner .attachment{margin:0 .5em 0 0;-ms-flex-positive:1;flex-grow:1;height:100%;box-sizing:border-box;min-width:2em}.gallery-row .gallery-row-inner .attachment:last-child{margin:0}.gallery-row .image-attachment{width:100%;height:100%}.gallery-row .video-container{height:100%}.gallery-row.contain-fit canvas,.gallery-row.contain-fit img,.gallery-row.contain-fit video{-o-object-fit:contain;object-fit:contain;height:100%}.gallery-row.cover-fit canvas,.gallery-row.cover-fit img,.gallery-row.cover-fit video{-o-object-fit:cover;object-fit:cover}",""])},function(t,e,n){var i=n(412);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("c13d6bee",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".link-preview-card{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;cursor:pointer;overflow:hidden;margin-top:.5em;color:#b9b9ba;color:var(--text,#b9b9ba);border-radius:10px;border-radius:var(--attachmentRadius,10px);border-color:#222;border:1px solid var(--border,#222)}.link-preview-card .card-image{-ms-flex-negative:0;flex-shrink:0;width:120px;max-width:25%}.link-preview-card .card-image img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;border-radius:10px;border-radius:var(--attachmentRadius,10px)}.link-preview-card .small-image{width:80px}.link-preview-card .card-content{max-height:100%;margin:.5em;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.link-preview-card .card-host{font-size:12px}.link-preview-card .card-description{margin:.5em 0 0;overflow:hidden;text-overflow:ellipsis;word-break:break-word;line-height:1.2em;max-height:calc(1.2em * 3 - 1px)}",""])},function(t,e,n){var i=n(414);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("0060b6a4",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".user-card{position:relative}.user-card .panel-heading{padding:.5em 0;text-align:center;box-shadow:none;background:transparent;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:stretch;align-items:stretch;position:relative}.user-card .panel-body{word-wrap:break-word;border-bottom-right-radius:inherit;border-bottom-left-radius:inherit;position:relative}.user-card .background-image{position:absolute;top:0;left:0;right:0;bottom:0;-webkit-mask:linear-gradient(0deg,#fff,transparent) bottom no-repeat,linear-gradient(0deg,#fff,#fff);mask:linear-gradient(0deg,#fff,transparent) bottom no-repeat,linear-gradient(0deg,#fff,#fff);-webkit-mask-composite:xor;mask-composite:exclude;background-size:cover;-webkit-mask-size:100% 60%;mask-size:100% 60%;border-top-left-radius:calc(var(--panelRadius) - 1px);border-top-right-radius:calc(var(--panelRadius) - 1px);background-color:var(--profileBg)}.user-card .background-image.hide-bio{-webkit-mask-size:100% 40px;mask-size:100% 40px}.user-card p{margin-bottom:0}.user-card-bio{text-align:center}.user-card-bio a{color:#d8a070;color:var(--postLink,#d8a070)}.user-card-bio img{-o-object-fit:contain;object-fit:contain;vertical-align:middle;max-width:100%;max-height:400px}.user-card-bio img.emoji{width:32px;height:32px}.user-card-rounded-t{border-top-left-radius:10px;border-top-left-radius:var(--panelRadius,10px);border-top-right-radius:10px;border-top-right-radius:var(--panelRadius,10px)}.user-card-rounded{border-radius:10px;border-radius:var(--panelRadius,10px)}.user-card-bordered{border-color:#222;border:1px solid var(--border,#222)}.user-info{color:#b9b9ba;color:var(--lightText,#b9b9ba);padding:0 26px}.user-info .container{padding:16px 0 6px;display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;max-height:56px}.user-info .container .Avatar{-ms-flex:1 0 100%;flex:1 0 100%;width:56px;height:56px;box-shadow:0 1px 8px rgba(0,0,0,.75);box-shadow:var(--avatarShadow);-o-object-fit:cover;object-fit:cover}.user-info:hover .Avatar{--still-image-img:visible;--still-image-canvas:hidden}.user-info-avatar-link{position:relative;cursor:pointer}.user-info-avatar-link-overlay{position:absolute;left:0;top:0;right:0;bottom:0;background-color:rgba(0,0,0,.3);display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;border-radius:4px;border-radius:var(--avatarRadius,4px);opacity:0;transition:opacity .2s ease}.user-info-avatar-link-overlay i{color:#fff}.user-info-avatar-link:hover .user-info-avatar-link-overlay{opacity:1}.user-info .usersettings{color:#b9b9ba;color:var(--lightText,#b9b9ba);opacity:.8}.user-info .user-summary{display:block;margin-left:.6em;text-align:left;text-overflow:ellipsis;white-space:nowrap;-ms-flex:1 1 0px;flex:1 1 0;z-index:1}.user-info .user-summary img{width:26px;height:26px;vertical-align:middle;-o-object-fit:contain;object-fit:contain}.user-info .user-summary .top-line{display:-ms-flexbox;display:flex}.user-info .user-name{text-overflow:ellipsis;overflow:hidden;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:1em;font-size:15px}.user-info .user-name img{-o-object-fit:contain;object-fit:contain;height:16px;width:16px;vertical-align:middle}.user-info .bottom-line{display:-ms-flexbox;display:flex;font-weight:light;font-size:15px}.user-info .bottom-line .user-screen-name{min-width:1px;-ms-flex:0 1 auto;flex:0 1 auto;text-overflow:ellipsis;overflow:hidden;color:#b9b9ba;color:var(--lightText,#b9b9ba)}.user-info .bottom-line .dailyAvg{min-width:1px;-ms-flex:0 0 auto;flex:0 0 auto;margin-left:1em;font-size:.7em;color:#b9b9ba;color:var(--text,#b9b9ba)}.user-info .bottom-line .user-role{-ms-flex:none;flex:none;text-transform:capitalize;color:#b9b9ba;color:var(--alertNeutralText,#b9b9ba);background-color:#182230;background-color:var(--alertNeutral,#182230)}.user-info .user-meta{margin-bottom:.15em;display:-ms-flexbox;display:flex;-ms-flex-align:baseline;align-items:baseline;font-size:14px;line-height:22px;-ms-flex-wrap:wrap;flex-wrap:wrap}.user-info .user-meta .following{-ms-flex:1 0 auto;flex:1 0 auto;margin:0;margin-bottom:.25em;text-align:left}.user-info .user-meta .highlighter{-ms-flex:0 1 auto;flex:0 1 auto;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-.5em;-ms-flex-item-align:start;align-self:start}.user-info .user-meta .highlighter .userHighlightCl{padding:2px 10px;-ms-flex:1 0 auto;flex:1 0 auto}.user-info .user-meta .highlighter .userHighlightSel,.user-info .user-meta .highlighter .userHighlightSel.select{padding-top:0;padding-bottom:0;-ms-flex:1 0 auto;flex:1 0 auto}.user-info .user-meta .highlighter .userHighlightSel.select i{line-height:22px}.user-info .user-meta .highlighter .userHighlightText{width:70px;-ms-flex:1 0 auto;flex:1 0 auto}.user-info .user-meta .highlighter .userHighlightCl,.user-info .user-meta .highlighter .userHighlightSel,.user-info .user-meta .highlighter .userHighlightSel.select,.user-info .user-meta .highlighter .userHighlightText{height:22px;vertical-align:top;margin-right:.5em;margin-bottom:.25em}.user-info .user-interactions{position:relative;display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-.75em}.user-info .user-interactions>*{margin:0 .75em .6em 0;white-space:nowrap;min-width:95px}.user-info .user-interactions button{margin:0}.user-counts{display:-ms-flexbox;display:flex;line-height:16px;padding:.5em 1.5em 0;text-align:center;-ms-flex-pack:justify;justify-content:space-between;color:#b9b9ba;color:var(--lightText,#b9b9ba);-ms-flex-wrap:wrap;flex-wrap:wrap}.user-count{-ms-flex:1 0 auto;flex:1 0 auto;padding:.5em 0;margin:0 .5em}.user-count h5{font-size:1em;font-weight:bolder;margin:0 0 .25em}.user-count a{text-decoration:none}",""])},function(t,e,n){var i=n(416);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("6b6f3617",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".Avatar{--still-image-label-visibility:hidden;width:48px;height:48px;box-shadow:var(--avatarStatusShadow);border-radius:4px;border-radius:var(--avatarRadius,4px)}.Avatar img{width:100%;height:100%}.Avatar.better-shadow{box-shadow:var(--avatarStatusShadowInset);filter:var(--avatarStatusShadowFilter)}.Avatar.animated:before{display:none}.Avatar.avatar-compact{width:32px;height:32px;border-radius:10px;border-radius:var(--avatarAltRadius,10px)}",""])},function(t,e,n){var i=n(418);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("4852bbb4",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".remote-follow{max-width:220px}.remote-follow .remote-button{width:100%;min-height:28px}",""])},function(t,e,n){var i=n(420);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("2c0672fc",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.menu-checkbox{float:right;min-width:22px;max-width:22px;min-height:22px;max-height:22px;line-height:22px;text-align:center;border-radius:0;background-color:#182230;background-color:var(--input,#182230);box-shadow:inset 0 0 2px #000;box-shadow:var(--inputShadow)}.menu-checkbox.menu-checkbox-checked:after{content:"\\2714"}.moderation-tools-popover{height:100%}.moderation-tools-popover .trigger{display:-ms-flexbox!important;display:flex!important;height:100%}',""])},function(t,e,n){var i=n(422);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("56d82e88",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.dark-overlay:before{bottom:0;content:" ";left:0;right:0;background:rgba(27,31,35,.5);z-index:99}.dark-overlay:before,.dialog-modal.panel{display:block;cursor:default;position:fixed;top:0}.dialog-modal.panel{left:50%;max-height:80vh;max-width:90vw;margin:15vh auto;transform:translateX(-50%);z-index:999;background-color:#121a24;background-color:var(--bg,#121a24)}.dialog-modal.panel .dialog-modal-heading{padding:.5em;margin-right:auto;margin-bottom:0;white-space:nowrap;color:var(--panelText);background-color:#182230;background-color:var(--panel,#182230)}.dialog-modal.panel .dialog-modal-heading .title{margin-bottom:0;text-align:center}.dialog-modal.panel .dialog-modal-content{margin:0;padding:1rem;background-color:#121a24;background-color:var(--bg,#121a24);white-space:normal}.dialog-modal.panel .dialog-modal-footer{margin:0;padding:.5em;background-color:#121a24;background-color:var(--bg,#121a24);border-top:1px solid #222;border-top:1px solid var(--border,#222);display:-ms-flexbox;display:flex;-ms-flex-pack:end;justify-content:flex-end}.dialog-modal.panel .dialog-modal-footer button{width:auto;margin-left:.5rem}',""])},function(t,e,n){var i=n(424);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("8c9d5016",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".account-actions{margin:0 .8em}.account-actions button.dropdown-item{margin-left:0}.account-actions .trigger-button{color:#b9b9ba;color:var(--lightText,#b9b9ba);opacity:.8;cursor:pointer}.account-actions .trigger-button:hover{color:#b9b9ba;color:var(--text,#b9b9ba)}",""])},function(t,e,n){var i=n(426);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7096a06e",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".avatars{display:-ms-flexbox;display:flex;margin:0;padding:0;-ms-flex-wrap:wrap;flex-wrap:wrap;height:24px}.avatars .avatars-item{margin:0 0 5px 5px}.avatars .avatars-item:first-child{padding-left:5px}.avatars .avatars-item .avatar-small{border-radius:10px;border-radius:var(--avatarAltRadius,10px);height:24px;width:24px}",""])},function(t,e,n){var i=n(428);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("14cff5b4",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".status-popover.popover{font-size:1rem;min-width:15em;max-width:95%;border-color:#222;border:1px solid var(--border,#222);border-radius:5px;border-radius:var(--tooltipRadius,5px);box-shadow:2px 2px 3px rgba(0,0,0,.5);box-shadow:var(--popupShadow)}.status-popover.popover .Status.Status{border:none}.status-popover.popover .status-preview-no-content{padding:1em;text-align:center}.status-popover.popover .status-preview-no-content i{font-size:2em}",""])},function(t,e,n){var i=n(430);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("50540f22",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".user-list-popover{padding:.5em}.user-list-popover .user-list-row{padding:.25em;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.user-list-popover .user-list-row .user-list-names{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin-left:.5em;min-width:5em}.user-list-popover .user-list-row .user-list-names img{width:1em;height:1em}.user-list-popover .user-list-row .user-list-screen-name{font-size:9px}",""])},function(t,e,n){var i=n(432);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("cf35b50a",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".emoji-reactions{display:-ms-flexbox;display:flex;margin-top:.25em;-ms-flex-wrap:wrap;flex-wrap:wrap}.emoji-reaction{padding:0 .5em;margin-right:.5em;margin-top:.5em;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;box-sizing:border-box}.emoji-reaction .reaction-emoji{width:1.25em;margin-right:.25em}.emoji-reaction:focus{outline:none}.emoji-reaction.not-clickable{cursor:default}.emoji-reaction.not-clickable:hover{box-shadow:0 0 2px 0 #000,inset 0 1px 0 0 hsla(0,0%,100%,.2),inset 0 -1px 0 0 rgba(0,0,0,.2);box-shadow:var(--buttonShadow)}.emoji-reaction-expand{padding:0 .5em;margin-right:.5em;margin-top:.5em;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.emoji-reaction-expand:hover{text-decoration:underline}.picked-reaction{border:1px solid var(--accent,#d8a070);margin-left:-1px;margin-right:calc(.5em - 1px)}",""])},function(t,e,n){var i=n(434);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("93498d0a",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".Conversation .conversation-status{border-left:none;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:var(--border,#222);border-radius:0}.Conversation.-expanded .conversation-status{border-color:#222;border-color:var(--border,#222);border-left:4px solid red;border-left:4px solid var(--cRed,red)}.Conversation.-expanded .conversation-status:last-child{border-bottom:none;border-radius:0 0 10px 10px;border-radius:0 0 var(--panelRadius,10px) var(--panelRadius,10px)}",""])},,,,,,,,,,,,,,,function(t,e,n){var i=n(450);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("b449a0b2",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".timeline-menu{-ms-flex-negative:1;flex-shrink:1;margin-right:auto;min-width:0;width:24rem}.timeline-menu .timeline-menu-popover-wrap{overflow:hidden;margin-top:.6rem;padding:0 15px 15px}.timeline-menu .timeline-menu-popover{width:24rem;max-width:100vw;margin:0;font-size:1rem;transform:translateY(-100%);transition:transform .1s}.timeline-menu .panel:after,.timeline-menu .timeline-menu-popover{border-top-right-radius:0;border-top-left-radius:0}.timeline-menu.open .timeline-menu-popover{transform:translateY(0)}.timeline-menu .timeline-menu-title{margin:0;cursor:pointer;display:-ms-flexbox;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.timeline-menu .timeline-menu-title span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.timeline-menu .timeline-menu-title i{margin-left:.6em;-ms-flex-negative:0;flex-shrink:0;font-size:1rem;transition:transform .1s}.timeline-menu.open .timeline-menu-title i{color:#b9b9ba;color:var(--panelText,#b9b9ba);transform:rotate(180deg)}.timeline-menu .panel{box-shadow:var(--popoverShadow)}.timeline-menu ul{list-style:none;margin:0;padding:0}.timeline-menu li{border-bottom:1px solid;border-color:#222;border-color:var(--border,#222);padding:0}.timeline-menu li:last-child a{border-bottom-right-radius:10px;border-bottom-right-radius:var(--panelRadius,10px);border-bottom-left-radius:10px;border-bottom-left-radius:var(--panelRadius,10px)}.timeline-menu li:last-child{border:none}.timeline-menu li i{margin:0 .5em}.timeline-menu a{display:block;padding:.6em 0}.timeline-menu a:hover{color:#d8a070;color:var(--selectedMenuText,#d8a070)}.timeline-menu a.router-link-active,.timeline-menu a:hover{background-color:#151e2a;background-color:var(--selectedMenu,#151e2a);--faint:var(--selectedMenuFaintText,$fallback--faint);--faintLink:var(--selectedMenuFaintLink,$fallback--faint);--lightText:var(--selectedMenuLightText,$fallback--lightText);--icon:var(--selectedMenuIcon,$fallback--icon)}.timeline-menu a.router-link-active{font-weight:bolder;color:#b9b9ba;color:var(--selectedMenuText,#b9b9ba)}.timeline-menu a.router-link-active:hover{text-decoration:underline}",""])},function(t,e,n){var i=n(452);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("87e1cf2e",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".notifications:not(.minimal){padding-bottom:15em}.notifications .loadmore-error{color:#b9b9ba;color:var(--text,#b9b9ba)}.notifications .notification{position:relative}.notifications .notification .notification-overlay{position:absolute;top:0;right:0;left:0;bottom:0;pointer-events:none}.notifications .notification.unseen .notification-overlay{background-image:linear-gradient(135deg,var(--badgeNotification,red) 4px,transparent 10px)}.notification{box-sizing:border-box;border-bottom:1px solid;border-color:#222;border-color:var(--border,#222);word-wrap:break-word;word-break:break-word}.notification:hover .animated.Avatar canvas{display:none}.notification:hover .animated.Avatar img{visibility:visible}.notification .non-mention{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.6em;min-width:0;--link:var(--faintLink);--text:var(--faint)}.notification .non-mention .avatar-container{width:32px;height:32px}.notification .follow-request-accept{cursor:pointer}.notification .follow-request-accept:hover{color:#b9b9ba;color:var(--text,#b9b9ba)}.notification .follow-request-reject{cursor:pointer}.notification .follow-request-reject:hover{color:red;color:var(--cRed,red)}.notification .follow-text,.notification .move-text{padding:.5em 0;overflow-wrap:break-word;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.notification .follow-text .follow-name,.notification .move-text .follow-name{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.notification .Status{-ms-flex:1;flex:1}.notification time{white-space:nowrap}.notification .notification-right{-ms-flex:1;flex:1;padding-left:.8em;min-width:0}.notification .notification-right .timeago{min-width:3em;text-align:right}.notification .emoji-reaction-emoji{font-size:16px}.notification .notification-details{min-width:0;word-wrap:break-word;line-height:18px;position:relative;overflow:hidden;width:100%;-ms-flex:1 1 0px;flex:1 1 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:justify;justify-content:space-between}.notification .notification-details .name-and-action{-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis}.notification .notification-details .username{font-weight:bolder;max-width:100%;text-overflow:ellipsis;white-space:nowrap}.notification .notification-details .username img{width:14px;height:14px;vertical-align:middle;-o-object-fit:contain;object-fit:contain}.notification .notification-details .timeago{margin-right:.2em}.notification .notification-details .icon-retweet.lit{color:#0fa00f;color:var(--cGreen,#0fa00f)}.notification .notification-details .icon-reply.lit,.notification .notification-details .icon-user-plus.lit,.notification .notification-details .icon-user.lit{color:#0095ff;color:var(--cBlue,#0095ff)}.notification .notification-details .icon-star.lit{color:orange;color:var(--cOrange,orange)}.notification .notification-details .icon-arrow-curved.lit{color:#0095ff;color:var(--cBlue,#0095ff)}.notification .notification-details .status-content{margin:0;max-height:300px}.notification .notification-details h1{word-break:break-all;margin:0 0 .3em;padding:0;font-size:1em;line-height:20px}.notification .notification-details h1 small{font-weight:lighter}.notification .notification-details p{margin:0;margin-top:0;margin-bottom:.3em}",""])},function(t,e,n){var i=n(454);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("41041624",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.Notification.-muted{padding:.25em .6em;height:1.2em;line-height:1.2em;text-overflow:ellipsis;overflow:hidden;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.Notification.-muted .mute-thread,.Notification.-muted .mute-words,.Notification.-muted .status-username{word-wrap:normal;word-break:normal;white-space:nowrap}.Notification.-muted .mute-words,.Notification.-muted .status-username{text-overflow:ellipsis;overflow:hidden}.Notification.-muted .status-username{font-weight:400;-ms-flex:0 1 auto;flex:0 1 auto;margin-right:.2em;font-size:smaller}.Notification.-muted .mute-thread{-ms-flex:0 0 auto;flex:0 0 auto}.Notification.-muted .mute-words{-ms-flex:1 0 5em;flex:1 0 5em;margin-left:.2em}.Notification.-muted .mute-words:before{content:" "}.Notification.-muted .unmute{-ms-flex:0 0 auto;flex:0 0 auto;margin-left:auto;display:block}',""])},function(t,e,n){var i=n(456);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("3a6f72a2",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".chat-list{min-height:25em;margin-bottom:0}.emtpy-chat-list-alert{padding:3em;font-size:1.2em;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;color:#b9b9ba;color:var(--faint,#b9b9ba)}",""])},function(t,e,n){var i=n(458);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("33c6b65e",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".chat-list-item{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;padding:.75em;height:5em;overflow:hidden;box-sizing:border-box;cursor:pointer}.chat-list-item :focus{outline:none}.chat-list-item:hover{background-color:var(--selectedPost,#151e2a);box-shadow:0 0 3px 1px rgba(0,0,0,.1)}.chat-list-item .chat-list-item-left{margin-right:1em}.chat-list-item .chat-list-item-center{width:100%;box-sizing:border-box;overflow:hidden;word-wrap:break-word}.chat-list-item .heading{width:100%;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-pack:justify;justify-content:space-between;line-height:1em}.chat-list-item .heading-right{white-space:nowrap}.chat-list-item .name-and-account-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;-ms-flex-negative:1;flex-shrink:1;line-height:1.4em}.chat-list-item .chat-preview{display:-ms-inline-flexbox;display:inline-flex;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin:.35em 0;color:#b9b9ba;color:var(--faint,#b9b9ba);width:100%}.chat-list-item a{color:var(--faintLink,#d8a070);text-decoration:none;pointer-events:none}.chat-list-item:hover .animated.avatar canvas{display:none}.chat-list-item:hover .animated.avatar img{visibility:visible}.chat-list-item .Avatar{border-radius:10px;border-radius:var(--avatarAltRadius,10px)}.chat-list-item .StatusContent img.emoji{width:1.4em;height:1.4em}.chat-list-item .time-wrapper{line-height:1.4em}.chat-list-item .single-line{padding-right:1em}",""])},function(t,e,n){var i=n(460);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("3dcd538d",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".chat-title{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.chat-title,.chat-title .username{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chat-title .username{max-width:100%;display:inline;word-wrap:break-word}.chat-title .username .emoji{width:14px;height:14px;vertical-align:middle;-o-object-fit:contain;object-fit:contain}.chat-title .Avatar{width:23px;height:23px;margin-right:.5em;border-radius:10px;border-radius:var(--avatarAltRadius,10px)}.chat-title .Avatar.animated:before{display:none}",""])},function(t,e,n){var i=n(462);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("ca48b176",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".chat-new .input-wrap{display:-ms-flexbox;display:flex;margin:.7em .5em}.chat-new .input-wrap input{width:100%}.chat-new .icon-search{font-size:1.5em;float:right;margin-right:.3em}.chat-new .member-list{padding-bottom:.7rem}.chat-new .basic-user-card:hover{cursor:pointer;background-color:var(--selectedPost,#151e2a)}.chat-new .go-back-button{cursor:pointer}",""])},function(t,e,n){var i=n(464);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("119ab786",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".basic-user-card{display:-ms-flexbox;display:flex;-ms-flex:1 0;flex:1 0;margin:0;padding:.6em 1em}.basic-user-card-collapsed-content{margin-left:.7em;text-align:left;-ms-flex:1;flex:1;min-width:0}.basic-user-card-user-name img{-o-object-fit:contain;object-fit:contain;height:16px;width:16px;vertical-align:middle}.basic-user-card-screen-name,.basic-user-card-user-name-value{display:inline-block;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.basic-user-card-expanded-content{-ms-flex:1;flex:1;margin-left:.7em;min-width:0}",""])},function(t,e,n){var i=n(466);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("33745640",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".list-item:not(:last-child){border-bottom:1px solid;border-bottom-color:#222;border-bottom-color:var(--border,#222)}.list-empty-content{text-align:center;padding:10px}",""])},function(t,e,n){var i=n(468);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("0f673926",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".chat-view{display:-ms-flexbox;display:flex;height:calc(100vh - 60px);width:100%}.chat-view .chat-title{height:28px}.chat-view .chat-view-inner{height:auto;margin:.5em .5em 0}.chat-view .chat-view-body,.chat-view .chat-view-inner{width:100%;overflow:visible;display:-ms-flexbox;display:flex}.chat-view .chat-view-body{background-color:var(--chatBg,#121a24);-ms-flex-direction:column;flex-direction:column;min-height:100%;margin:0;border-radius:10px 10px 0 0;border-radius:var(--panelRadius,10px) var(--panelRadius,10px) 0 0}.chat-view .chat-view-body:after{border-radius:0}.chat-view .scrollable-message-list{padding:0 .8em;height:100%;overflow-y:scroll;overflow-x:hidden;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.chat-view .footer{position:-webkit-sticky;position:sticky;bottom:0}.chat-view .chat-view-heading{-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;top:50px;display:-ms-flexbox;display:flex;z-index:2;position:-webkit-sticky;position:sticky;overflow:hidden}.chat-view .go-back-button{cursor:pointer;margin-right:1.4em}.chat-view .go-back-button i,.chat-view .jump-to-bottom-button{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.chat-view .jump-to-bottom-button{width:2.5em;height:2.5em;border-radius:100%;position:absolute;right:1.3em;top:-3.2em;background-color:#182230;background-color:var(--btn,#182230);-ms-flex-pack:center;justify-content:center;box-shadow:0 1px 1px rgba(0,0,0,.3),0 2px 4px rgba(0,0,0,.3);z-index:10;transition:all .35s;transition-timing-function:cubic-bezier(0,1,.5,1);opacity:0;visibility:hidden;cursor:pointer}.chat-view .jump-to-bottom-button.visible{opacity:1;visibility:visible}.chat-view .jump-to-bottom-button i{font-size:1em;color:#b9b9ba;color:var(--text,#b9b9ba)}.chat-view .jump-to-bottom-button .unread-message-count{font-size:.8em;left:50%;transform:translate(-50%);border-radius:100%;margin-top:-1rem;padding:0}.chat-view .jump-to-bottom-button .chat-loading-error{width:100%;display:-ms-flexbox;display:flex;-ms-flex-align:end;align-items:flex-end;height:100%}.chat-view .jump-to-bottom-button .chat-loading-error .error{width:100%}@media (max-width:800px){.chat-view{height:100%;overflow:hidden}.chat-view .chat-view-inner{overflow:hidden;height:100%;margin-top:0;margin-left:0;margin-right:0}.chat-view .chat-view-body{display:-ms-flexbox;display:flex;min-height:auto;overflow:hidden;height:100%;margin:0;border-radius:0}.chat-view .chat-view-heading{position:static;z-index:9999;top:0;margin-top:0;border-radius:0}.chat-view .scrollable-message-list{display:unset;overflow-y:scroll;overflow-x:hidden;-webkit-overflow-scrolling:touch}.chat-view .footer{position:-webkit-sticky;position:sticky;bottom:auto}}",""])},function(t,e,n){var i=n(470);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("20b81e5e",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.chat-message-wrapper.hovered-message-chain .animated.Avatar canvas{display:none}.chat-message-wrapper.hovered-message-chain .animated.Avatar img{visibility:visible}.chat-message-wrapper .chat-message-menu{transition:opacity .1s;opacity:0;position:absolute;top:-.8em}.chat-message-wrapper .chat-message-menu button{padding-top:.2em;padding-bottom:.2em}.chat-message-wrapper .icon-ellipsis{cursor:pointer;border-radius:10px;border-radius:var(--chatMessageRadius,10px)}.chat-message-wrapper .icon-ellipsis:hover,.extra-button-popover.open .chat-message-wrapper .icon-ellipsis{color:#b9b9ba;color:var(--text,#b9b9ba)}.chat-message-wrapper .popover{width:12em}.chat-message-wrapper .chat-message{display:-ms-flexbox;display:flex;padding-bottom:.5em}.chat-message-wrapper .avatar-wrapper{margin-right:.72em;width:32px}.chat-message-wrapper .attachments,.chat-message-wrapper .link-preview{margin-bottom:1em}.chat-message-wrapper .chat-message-inner{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;max-width:80%;min-width:10em;width:100%}.chat-message-wrapper .chat-message-inner.with-media{width:100%}.chat-message-wrapper .chat-message-inner.with-media .gallery-row{overflow:hidden}.chat-message-wrapper .chat-message-inner.with-media .status{width:100%}.chat-message-wrapper .status{border-radius:10px;border-radius:var(--chatMessageRadius,10px);display:-ms-flexbox;display:flex;padding:.75em}.chat-message-wrapper .created-at{position:relative;float:right;font-size:.8em;margin:-1em 0 -.5em;font-style:italic;opacity:.8}.chat-message-wrapper .without-attachment .status-content:after{margin-right:5.4em;content:" ";display:inline-block}.chat-message-wrapper .incoming a{color:var(--chatMessageIncomingLink,#d8a070)}.chat-message-wrapper .incoming .status{background-color:var(--chatMessageIncomingBg,#121a24);border:1px solid var(--chatMessageIncomingBorder,--border)}.chat-message-wrapper .incoming .created-at a,.chat-message-wrapper .incoming .status{color:var(--chatMessageIncomingText,#b9b9ba)}.chat-message-wrapper .incoming .chat-message-menu{left:.4rem}.chat-message-wrapper .outgoing{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-line-pack:end;align-content:end;-ms-flex-pack:end;justify-content:flex-end}.chat-message-wrapper .outgoing a{color:var(--chatMessageOutgoingLink,#d8a070)}.chat-message-wrapper .outgoing .status{color:var(--chatMessageOutgoingText,#b9b9ba);background-color:var(--chatMessageOutgoingBg,#151e2a);border:1px solid var(--chatMessageOutgoingBorder,--lightBg)}.chat-message-wrapper .outgoing .chat-message-inner{-ms-flex-align:end;align-items:flex-end}.chat-message-wrapper .outgoing .chat-message-menu{right:.4rem}.chat-message-wrapper .visible{opacity:1}.chat-message-date-separator{text-align:center;margin:1.4em 0;font-size:.9em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#b9b9ba;color:var(--faintedText,#b9b9ba)}',""])},function(t,e,n){var i=n(472);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7563b46e",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".user-profile{-ms-flex:2;flex:2;-ms-flex-preferred-size:500px;flex-basis:500px}.user-profile .user-profile-fields{margin:0 .5em}.user-profile .user-profile-fields img{-o-object-fit:contain;object-fit:contain;vertical-align:middle;max-width:100%;max-height:400px}.user-profile .user-profile-fields img.emoji{width:18px;height:18px}.user-profile .user-profile-fields .user-profile-field{display:-ms-flexbox;display:flex;margin:.25em auto;max-width:32em;border:1px solid var(--border,#222);border-radius:4px;border-radius:var(--inputRadius,4px)}.user-profile .user-profile-fields .user-profile-field .user-profile-field-name{-ms-flex:0 1 30%;flex:0 1 30%;font-weight:500;text-align:right;color:var(--lightText);min-width:120px;border-right:1px solid var(--border,#222)}.user-profile .user-profile-fields .user-profile-field .user-profile-field-value{-ms-flex:1 1 70%;flex:1 1 70%;color:var(--text);margin:0 0 0 .25em}.user-profile .user-profile-fields .user-profile-field .user-profile-field-name,.user-profile .user-profile-fields .user-profile-field .user-profile-field-value{line-height:18px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;padding:.5em 1.5em;box-sizing:border-box}.user-profile .userlist-placeholder{-ms-flex-align:middle;align-items:middle;padding:2em}.user-profile .timeline-heading,.user-profile .userlist-placeholder{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.user-profile .timeline-heading .alert,.user-profile .timeline-heading .loadmore-button{-ms-flex:1;flex:1}.user-profile .timeline-heading .loadmore-button{height:28px;margin:10px .6em}.user-profile .timeline-heading .loadmore-text,.user-profile .timeline-heading .title{display:none}.user-profile-placeholder .panel-body{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:middle;align-items:middle;padding:7em}",""])},function(t,e,n){var i=n(474);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("ae955a70",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".follow-card-content-container{-ms-flex-negative:0;flex-shrink:0;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-wrap:wrap;flex-wrap:wrap;line-height:1.5em}.follow-card-follow-button{margin-top:.5em;margin-left:auto;width:10em}",""])},function(t,e,n){},function(t,e,n){},function(t,e,n){var i=n(478);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("354d66d6",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".search-result-heading{color:hsla(240,1%,73%,.5);color:var(--faint,hsla(240,1%,73%,.5));padding:.75rem;text-align:center}@media (max-width:800px){.search-nav-heading .tab-switcher .tabs .tab-wrapper{display:block;-ms-flex-pack:center;justify-content:center;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}}.search-result{box-sizing:border-box;border-bottom:1px solid;border-color:#222;border-color:var(--border,#222)}.search-result-footer{border-width:1px 0 0;border-style:solid;border-color:var(--border,#222);padding:10px;background-color:#182230;background-color:var(--panel,#182230)}.search-input-container{padding:.8rem;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center}.search-input-container .search-input{width:100%;line-height:1.125rem;font-size:1rem;padding:.5rem;box-sizing:border-box}.search-input-container .search-button{margin-left:.5em}.loading-icon{padding:1em}.trend{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.trend .hashtag{-ms-flex:1 1 auto;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trend .count,.trend .hashtag{color:#b9b9ba;color:var(--text,#b9b9ba)}.trend .count{-ms-flex:0 0 auto;flex:0 0 auto;width:2rem;font-size:1.5rem;line-height:2.25rem;font-weight:500;text-align:center}",""])},function(t,e,n){var i=n(480);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("16815f76",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'.registration-form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin:.6em}.registration-form .container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row}.registration-form .terms-of-service{-ms-flex:0 1 50%;flex:0 1 50%;margin:.8em}.registration-form .text-fields{margin-top:.6em;-ms-flex:1 0;flex:1 0;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.registration-form textarea{min-height:100px;resize:vertical}.registration-form .form-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:.3em 0;line-height:24px;margin-bottom:1em}.registration-form .form-group--error{animation-name:shakeError;animation-duration:.6s;animation-timing-function:ease-in-out}.registration-form .form-group--error .form--label{color:#f04124;color:var(--cRed,#f04124)}.registration-form .form-error{margin-top:-.7em;text-align:left}.registration-form .form-error span{font-size:12px}.registration-form .form-error ul{list-style:none;padding:0 0 0 5px;margin-top:0}.registration-form .form-error ul li:before{content:"\\2022 "}.registration-form form textarea{line-height:16px;resize:vertical}.registration-form .captcha{max-width:350px;margin-bottom:.4em}.registration-form .btn{margin-top:.6em;height:28px}.registration-form .error{text-align:center}@media (max-width:800px){.registration-form .container{-ms-flex-direction:column-reverse;flex-direction:column-reverse}}',""])},,,,,,,,,,,,,,,,,,,,,,,,,function(t,e,n){var i=n(506);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("1ef4fd93",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".password-reset-form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center;margin:.6em}.password-reset-form .container{display:-ms-flexbox;display:flex;-ms-flex:1 0;flex:1 0;-ms-flex-direction:column;flex-direction:column;margin-top:.6em;max-width:18rem}.password-reset-form .form-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;margin-bottom:1em;padding:.3em 0;line-height:24px}.password-reset-form .error{text-align:center;animation-name:shakeError;animation-duration:.4s;animation-timing-function:ease-in-out}.password-reset-form .alert{padding:.5em;margin:.3em 0 1em}.password-reset-form .password-reset-required{background-color:var(--alertError,rgba(211,16,20,.5));padding:10px 0}.password-reset-form .notice-dismissible{padding-right:2rem}.password-reset-form .icon-cancel{cursor:pointer}",""])},function(t,e,n){var i=n(508);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("ad510f10",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".follow-request-card-content-container{display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap}.follow-request-card-content-container button{margin-top:.5em;margin-right:.5em;-ms-flex:1 1;flex:1 1;max-width:12em;min-width:8em}.follow-request-card-content-container button:last-child{margin-right:0}",""])},function(t,e,n){var i=n(510);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("42704024",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".login-form{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:.6em}.login-form .btn{min-height:28px;width:10em}.login-form .register{-ms-flex:1 1;flex:1 1}.login-form .login-bottom{margin-top:1em;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.login-form .form-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding:.3em .5em .6em;line-height:24px}.login-form .form-bottom{display:-ms-flexbox;display:flex;padding:.5em;height:32px}.login-form .form-bottom button{width:10em}.login-form .form-bottom p{margin:.35em;padding:.35em;display:-ms-flexbox;display:flex}.login-form .error{text-align:center;animation-name:shakeError;animation-duration:.4s;animation-timing-function:ease-in-out}",""])},function(t,e,n){var i=n(512);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("2c0040e1",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".floating-chat{position:fixed;right:0;bottom:0;z-index:1000;max-width:25em}.chat-panel .chat-heading{cursor:pointer}.chat-panel .chat-heading .icon-comment-empty{color:#b9b9ba;color:var(--text,#b9b9ba)}.chat-panel .chat-window{overflow-y:auto;overflow-x:hidden;max-height:20em}.chat-panel .chat-window-container{height:100%}.chat-panel .chat-message{display:-ms-flexbox;display:flex;padding:.2em .5em}.chat-panel .chat-avatar img{height:24px;width:24px;border-radius:4px;border-radius:var(--avatarRadius,4px);margin-right:.5em;margin-top:.25em}.chat-panel .chat-input{display:-ms-flexbox;display:flex}.chat-panel .chat-input textarea{-ms-flex:1;flex:1;margin:.6em;min-height:3.5em;resize:none}.chat-panel .chat-panel .title{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}",""])},function(t,e,n){var i=n(514);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("c74f4f44",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,"",""])},function(t,e,n){var i=n(516);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7dfaed97",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,"",""])},function(t,e,n){var i=n(518);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("55ca8508",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".features-panel li{line-height:24px}",""])},function(t,e,n){var i=n(520);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("42aabc98",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".tos-content{margin:1em}",""])},function(t,e,n){var i=n(522);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("5aa588af",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,"",""])},function(t,e,n){var i=n(524);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("72647543",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".mrf-section{margin:1em}",""])},function(t,e,n){var i=n(526);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("67a8aa3d",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,"",""])},function(t,e,n){var i=n(528);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("5c806d03",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,'#app{min-height:100vh;max-width:100%;overflow:hidden}.app-bg-wrapper{position:fixed;z-index:-1;height:100%;left:0;right:-20px;background-size:cover;background-repeat:no-repeat;background-position:0 50%}i[class^=icon-]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}h4{margin:0}#content{box-sizing:border-box;padding-top:60px;margin:auto;min-height:100vh;max-width:980px;-ms-flex-line-pack:start;align-content:flex-start}.underlay{background-color:rgba(0,0,0,.15);background-color:var(--underlay,rgba(0,0,0,.15))}.text-center{text-align:center}html{font-size:14px}body{overscroll-behavior-y:none;font-family:sans-serif;font-family:var(--interfaceFont,sans-serif);margin:0;color:#b9b9ba;color:var(--text,#b9b9ba);max-width:100vw;overflow-x:hidden;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body.hidden{display:none}a{text-decoration:none;color:#d8a070;color:var(--link,#d8a070)}button{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#182230;background-color:var(--btn,#182230);border:none;border-radius:4px;border-radius:var(--btnRadius,4px);cursor:pointer;box-shadow:0 0 2px 0 #000,inset 0 1px 0 0 hsla(0,0%,100%,.2),inset 0 -1px 0 0 rgba(0,0,0,.2);box-shadow:var(--buttonShadow);font-size:14px;font-family:sans-serif;font-family:var(--interfaceFont,sans-serif)}button,button i[class*=icon-]{color:#b9b9ba;color:var(--btnText,#b9b9ba)}button::-moz-focus-inner{border:none}button:hover{box-shadow:0 0 4px hsla(0,0%,100%,.3);box-shadow:var(--buttonHoverShadow)}button:active{box-shadow:0 0 4px 0 hsla(0,0%,100%,.3),inset 0 1px 0 0 rgba(0,0,0,.2),inset 0 -1px 0 0 hsla(0,0%,100%,.2);box-shadow:var(--buttonPressedShadow);background-color:#182230;background-color:var(--btnPressed,#182230)}button:active,button:active i{color:#b9b9ba;color:var(--btnPressedText,#b9b9ba)}button:disabled{cursor:not-allowed;background-color:#182230;background-color:var(--btnDisabled,#182230)}button:disabled,button:disabled i{color:#b9b9ba;color:var(--btnDisabledText,#b9b9ba)}button.toggled{background-color:#182230;background-color:var(--btnToggled,#182230);box-shadow:0 0 4px 0 hsla(0,0%,100%,.3),inset 0 1px 0 0 rgba(0,0,0,.2),inset 0 -1px 0 0 hsla(0,0%,100%,.2);box-shadow:var(--buttonPressedShadow)}button.toggled,button.toggled i{color:#b9b9ba;color:var(--btnToggledText,#b9b9ba)}button.danger{color:#b9b9ba;color:var(--alertErrorPanelText,#b9b9ba);background-color:rgba(211,16,20,.5);background-color:var(--alertError,rgba(211,16,20,.5))}.input,.select,input,textarea{border:none;border-radius:4px;border-radius:var(--inputRadius,4px);box-shadow:inset 0 1px 0 0 rgba(0,0,0,.2),inset 0 -1px 0 0 hsla(0,0%,100%,.2),inset 0 0 2px 0 #000;box-shadow:var(--inputShadow);background-color:#182230;background-color:var(--input,#182230);color:#b9b9ba;color:var(--inputText,#b9b9ba);font-family:sans-serif;font-family:var(--inputFont,sans-serif);font-size:14px;margin:0;box-sizing:border-box;display:inline-block;position:relative;height:28px;line-height:16px;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none;padding:8px .5em}.input.unstyled,.select.unstyled,input.unstyled,textarea.unstyled{border-radius:0;background:none;box-shadow:none;height:unset}.input.select,.select.select,input.select,textarea.select{padding:0}.input:disabled,.input[disabled=disabled],.select:disabled,.select[disabled=disabled],input:disabled,input[disabled=disabled],textarea:disabled,textarea[disabled=disabled]{cursor:not-allowed;opacity:.5}.input .icon-down-open,.select .icon-down-open,input .icon-down-open,textarea .icon-down-open{position:absolute;top:0;bottom:0;right:5px;height:100%;color:#b9b9ba;color:var(--inputText,#b9b9ba);line-height:28px;z-index:0;pointer-events:none}.input select,.select select,input select,textarea select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:none;color:#b9b9ba;color:var(--inputText,--text,#b9b9ba);margin:0;padding:0 2em 0 .2em;font-family:sans-serif;font-family:var(--inputFont,sans-serif);font-size:14px;width:100%;z-index:1;height:28px;line-height:16px}.input[type=range],.select[type=range],input[type=range],textarea[type=range]{background:none;border:none;margin:0;box-shadow:none;-ms-flex:1;flex:1}.input[type=radio],.select[type=radio],input[type=radio],textarea[type=radio]{display:none}.input[type=radio]:checked+label:before,.select[type=radio]:checked+label:before,input[type=radio]:checked+label:before,textarea[type=radio]:checked+label:before{box-shadow:inset 0 0 2px #000,inset 0 0 0 4px #182230;box-shadow:var(--inputShadow),0 0 0 4px var(--fg,#182230) inset;background-color:var(--accent,#d8a070)}.input[type=radio]:disabled,.input[type=radio]:disabled+label,.input[type=radio]:disabled+label:before,.select[type=radio]:disabled,.select[type=radio]:disabled+label,.select[type=radio]:disabled+label:before,input[type=radio]:disabled,input[type=radio]:disabled+label,input[type=radio]:disabled+label:before,textarea[type=radio]:disabled,textarea[type=radio]:disabled+label,textarea[type=radio]:disabled+label:before{opacity:.5}.input[type=radio]+label:before,.select[type=radio]+label:before,input[type=radio]+label:before,textarea[type=radio]+label:before{-ms-flex-negative:0;flex-shrink:0;display:inline-block;content:"";transition:box-shadow .2s;width:1.1em;height:1.1em;border-radius:100%;box-shadow:inset 0 0 2px #000;box-shadow:var(--inputShadow);margin-right:.5em;background-color:#182230;background-color:var(--input,#182230);vertical-align:top;text-align:center;line-height:1.1em;font-size:1.1em;color:transparent;overflow:hidden;box-sizing:border-box}.input[type=checkbox],.select[type=checkbox],input[type=checkbox],textarea[type=checkbox]{display:none}.input[type=checkbox]:checked+label:before,.select[type=checkbox]:checked+label:before,input[type=checkbox]:checked+label:before,textarea[type=checkbox]:checked+label:before{color:#b9b9ba;color:var(--inputText,#b9b9ba)}.input[type=checkbox]:disabled,.input[type=checkbox]:disabled+label,.input[type=checkbox]:disabled+label:before,.select[type=checkbox]:disabled,.select[type=checkbox]:disabled+label,.select[type=checkbox]:disabled+label:before,input[type=checkbox]:disabled,input[type=checkbox]:disabled+label,input[type=checkbox]:disabled+label:before,textarea[type=checkbox]:disabled,textarea[type=checkbox]:disabled+label,textarea[type=checkbox]:disabled+label:before{opacity:.5}.input[type=checkbox]+label:before,.select[type=checkbox]+label:before,input[type=checkbox]+label:before,textarea[type=checkbox]+label:before{-ms-flex-negative:0;flex-shrink:0;display:inline-block;content:"\\2714";transition:color .2s;width:1.1em;height:1.1em;border-radius:2px;border-radius:var(--checkboxRadius,2px);box-shadow:inset 0 0 2px #000;box-shadow:var(--inputShadow);margin-right:.5em;background-color:#182230;background-color:var(--input,#182230);vertical-align:top;text-align:center;line-height:1.1em;font-size:1.1em;color:transparent;overflow:hidden;box-sizing:border-box}option{color:#b9b9ba;color:var(--text,#b9b9ba);background-color:#121a24;background-color:var(--bg,#121a24)}.hide-number-spinner{-moz-appearance:textfield}.hide-number-spinner[type=number]::-webkit-inner-spin-button,.hide-number-spinner[type=number]::-webkit-outer-spin-button{opacity:0;display:none}i[class*=icon-]{color:#666;color:var(--icon,#666)}.btn-block{display:block;width:100%}.btn-group{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group button{position:relative;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group button:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.container{-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0 10px}.container,.item{display:-ms-flexbox;display:flex}.item{-ms-flex:1;flex:1;line-height:50px;height:50px;overflow:hidden;-ms-flex-wrap:wrap;flex-wrap:wrap}.item .nav-icon{margin-left:.4em}.item.right{-ms-flex-pack:end;justify-content:flex-end}.auto-size{-ms-flex:1;flex:1}.nav-bar{padding:0;width:100%;-ms-flex-align:center;align-items:center;position:fixed;height:50px;box-sizing:border-box}.nav-bar button,.nav-bar button i[class*=icon-]{color:#b9b9ba;color:var(--btnTopBarText,#b9b9ba)}.nav-bar button:active{background-color:#182230;background-color:var(--btnPressedTopBar,#182230);color:#b9b9ba;color:var(--btnPressedTopBarText,#b9b9ba)}.nav-bar button:disabled{color:#b9b9ba;color:var(--btnDisabledTopBarText,#b9b9ba)}.nav-bar button.toggled{color:#b9b9ba;color:var(--btnToggledTopBarText,#b9b9ba);background-color:#182230;background-color:var(--btnToggledTopBar,#182230)}.nav-bar .logo{display:-ms-flexbox;display:flex;-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:center;justify-content:center;-ms-flex:0 0 auto;flex:0 0 auto;z-index:-1;transition:opacity;transition-timing-function:ease-out;transition-duration:.1s}.nav-bar .logo,.nav-bar .logo .mask{position:absolute;top:0;bottom:0;left:0;right:0}.nav-bar .logo .mask{-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain;background-color:#182230;background-color:var(--topBarText,#182230)}.nav-bar .logo img{height:100%;-o-object-fit:contain;object-fit:contain;display:block;-ms-flex:0;flex:0}.nav-bar .inner-nav{position:relative;margin:auto;box-sizing:border-box;padding-left:10px;padding-right:10px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-preferred-size:970px;flex-basis:970px;height:50px}.nav-bar .inner-nav a,.nav-bar .inner-nav a i{color:#d8a070;color:var(--topBarLink,#d8a070)}main-router{-ms-flex:1;flex:1}.status.compact{color:rgba(0,0,0,.42);font-weight:300}.status.compact p{margin:0;font-size:.8em}.panel{display:-ms-flexbox;display:flex;position:relative;-ms-flex-direction:column;flex-direction:column;margin:.5em;background-color:#121a24;background-color:var(--bg,#121a24)}.panel,.panel:after{border-radius:10px;border-radius:var(--panelRadius,10px)}.panel:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none;box-shadow:1px 1px 4px rgba(0,0,0,.6);box-shadow:var(--panelShadow)}.panel-body:empty:before{content:"\\AF\\\\_(\\30C4)_/\\AF";display:block;margin:1em;text-align:center}.panel-heading{display:-ms-flexbox;display:flex;-ms-flex:none;flex:none;border-radius:10px 10px 0 0;border-radius:var(--panelRadius,10px) var(--panelRadius,10px) 0 0;background-size:cover;padding:.6em;text-align:left;line-height:28px;color:var(--panelText);background-color:#182230;background-color:var(--panel,#182230);-ms-flex-align:baseline;align-items:baseline;box-shadow:var(--panelHeaderShadow)}.panel-heading .title{-ms-flex:1 0 auto;flex:1 0 auto;font-size:1.3em}.panel-heading .faint{background-color:transparent;color:hsla(240,1%,73%,.5);color:var(--panelFaint,hsla(240,1%,73%,.5))}.panel-heading .faint-link{color:hsla(240,1%,73%,.5);color:var(--faintLink,hsla(240,1%,73%,.5))}.panel-heading .alert{white-space:nowrap;text-overflow:ellipsis;overflow-x:hidden}.panel-heading button{-ms-flex-negative:0;flex-shrink:0}.panel-heading .alert,.panel-heading button{line-height:21px;min-height:0;box-sizing:border-box;margin:0;margin-left:.5em;min-width:1px;-ms-flex-item-align:stretch;-ms-grid-row-align:stretch;align-self:stretch}.panel-heading button,.panel-heading button i[class*=icon-]{color:#b9b9ba;color:var(--btnPanelText,#b9b9ba)}.panel-heading button:active{background-color:#182230;background-color:var(--btnPressedPanel,#182230);color:#b9b9ba;color:var(--btnPressedPanelText,#b9b9ba)}.panel-heading button:disabled{color:#b9b9ba;color:var(--btnDisabledPanelText,#b9b9ba)}.panel-heading button.toggled{color:#b9b9ba;color:var(--btnToggledPanelText,#b9b9ba)}.panel-heading a{color:#d8a070;color:var(--panelLink,#d8a070)}.panel-heading.stub{border-radius:10px;border-radius:var(--panelRadius,10px)}.panel-footer{border-radius:0 0 10px 10px;border-radius:0 0 var(--panelRadius,10px) var(--panelRadius,10px)}.panel-footer .faint{color:hsla(240,1%,73%,.5);color:var(--panelFaint,hsla(240,1%,73%,.5))}.panel-footer a{color:#d8a070;color:var(--panelLink,#d8a070)}.panel-body>p{line-height:18px;padding:1em;margin:0}.container>*{min-width:0}.fa{color:grey}nav{z-index:1000;color:var(--topBarText);background-color:#182230;background-color:var(--topBar,#182230);color:hsla(240,1%,73%,.5);color:var(--faint,hsla(240,1%,73%,.5));box-shadow:0 0 4px rgba(0,0,0,.6);box-shadow:var(--topBarShadow)}.fade-enter-active,.fade-leave-active{transition:opacity .2s}.fade-enter,.fade-leave-active{opacity:0}.main{-ms-flex-preferred-size:50%;flex-basis:50%;-ms-flex-positive:1;flex-grow:1;-ms-flex-negative:1;flex-shrink:1}.sidebar-bounds{-ms-flex:0;flex:0;-ms-flex-preferred-size:35%;flex-basis:35%}.sidebar-flexer{-ms-flex:1;flex:1;-ms-flex-preferred-size:345px;flex-basis:345px;width:365px}.mobile-shown{display:none}@media (min-width:800px){body{overflow-y:scroll}.sidebar-bounds{overflow:hidden;max-height:100vh;width:345px;position:fixed;margin-top:-10px}.sidebar-bounds .sidebar-scroller{height:96vh;width:365px;padding-top:10px;padding-right:50px;overflow-x:hidden;overflow-y:scroll}.sidebar-bounds .sidebar{width:345px}.sidebar-flexer{max-height:96vh;-ms-flex-negative:0;flex-shrink:0;-ms-flex-positive:0;flex-grow:0}}.badge{display:inline-block;border-radius:99px;min-width:22px;max-width:22px;min-height:22px;max-height:22px;font-size:15px;line-height:22px;text-align:center;vertical-align:middle;white-space:nowrap;padding:0}.badge.badge-notification{background-color:red;background-color:var(--badgeNotification,red);color:#fff;color:var(--badgeNotificationText,#fff)}.alert{margin:.35em;padding:.25em;border-radius:5px;border-radius:var(--tooltipRadius,5px);min-height:28px;line-height:28px}.alert.error{background-color:rgba(211,16,20,.5);background-color:var(--alertError,rgba(211,16,20,.5));color:#b9b9ba;color:var(--alertErrorText,#b9b9ba)}.panel-heading .alert.error{color:#b9b9ba;color:var(--alertErrorPanelText,#b9b9ba)}.alert.warning{background-color:rgba(111,111,20,.5);background-color:var(--alertWarning,rgba(111,111,20,.5));color:#b9b9ba;color:var(--alertWarningText,#b9b9ba)}.panel-heading .alert.warning{color:#b9b9ba;color:var(--alertWarningPanelText,#b9b9ba)}.faint,.faint-link{color:hsla(240,1%,73%,.5);color:var(--faint,hsla(240,1%,73%,.5))}.faint-link:hover{text-decoration:underline}@media (min-width:800px){.logo{opacity:1!important}}.item.right{text-align:right}.visibility-notice{padding:.5em;border:1px solid hsla(240,1%,73%,.5);border:1px solid var(--faint,hsla(240,1%,73%,.5));border-radius:4px;border-radius:var(--inputRadius,4px)}.notice-dismissible{padding-right:4rem;position:relative}.notice-dismissible .dismiss{position:absolute;top:0;right:0;padding:.5em;color:inherit}.button-icon{font-size:1.2em}@keyframes shakeError{0%{transform:translateX(0)}15%{transform:translateX(.375rem)}30%{transform:translateX(-.375rem)}45%{transform:translateX(.375rem)}60%{transform:translateX(-.375rem)}75%{transform:translateX(.375rem)}90%{transform:translateX(-.375rem)}to{transform:translateX(0)}}@media (max-width:800px){.mobile-hidden{display:none}.panel-switcher{display:-ms-flexbox;display:flex}.container{padding:0}.panel{margin:.5em 0}.menu-button{display:block;margin-right:.8em}.main{margin-bottom:7em}}.select-multiple{display:-ms-flexbox;display:flex}.select-multiple .option-list{margin:0;padding-left:.5em}.option-list,.setting-list{list-style-type:none;padding-left:2em}.option-list li,.setting-list li{margin-bottom:.5em}.option-list .suboptions,.setting-list .suboptions{margin-top:.3em}.login-hint{text-align:center}@media (min-width:801px){.login-hint{display:none}}.login-hint a{display:inline-block;padding:1em 0;width:100%}.btn.btn-default{min-height:28px}.animate-spin{animation:spin 2s infinite linear;display:inline-block}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(359deg)}}.new-status-notification{position:relative;margin-top:-1px;font-size:1.1em;border-width:1px 0 0;border-style:solid;border-color:var(--border,#222);padding:10px;z-index:1;background-color:#182230;background-color:var(--panel,#182230)}.unread-chat-count{font-size:.9em;font-weight:bolder;font-style:normal;position:absolute;right:.6rem;padding:0 .3em;min-width:1.3rem;min-height:1.3rem;max-height:1.3rem;line-height:1.3rem}.chat-layout{overflow:hidden;height:100%}@media (max-width:800px){.chat-layout body{height:100%}.chat-layout #app{height:100%;overflow:hidden;min-height:auto}.chat-layout #app_bg_wrapper{overflow:hidden}.chat-layout .main{overflow:hidden;height:100%}.chat-layout #content{padding-top:0;height:100%;overflow:visible}}',""])},function(t,e,n){var i=n(530);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("04d46dee",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".user-panel .signed-in{overflow:visible}",""])},function(t,e,n){var i=n(532);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("b030addc",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".nav-panel .panel{overflow:hidden;box-shadow:var(--panelShadow)}.nav-panel ul{list-style:none;margin:0;padding:0}.follow-request-count{margin:-6px 10px;background-color:#121a24;background-color:var(--input,hsla(240,1%,73%,.5))}.nav-panel li{border-bottom:1px solid;border-color:#222;border-color:var(--border,#222);padding:0}.nav-panel li:first-child a{border-top-right-radius:10px;border-top-right-radius:var(--panelRadius,10px);border-top-left-radius:10px;border-top-left-radius:var(--panelRadius,10px)}.nav-panel li:last-child a{border-bottom-right-radius:10px;border-bottom-right-radius:var(--panelRadius,10px);border-bottom-left-radius:10px;border-bottom-left-radius:var(--panelRadius,10px)}.nav-panel li:last-child{border:none}.nav-panel a{display:block;padding:.8em .85em}.nav-panel a:hover{color:#d8a070;color:var(--selectedMenuText,#d8a070)}.nav-panel a.router-link-active,.nav-panel a:hover{background-color:#151e2a;background-color:var(--selectedMenu,#151e2a);--faint:var(--selectedMenuFaintText,$fallback--faint);--faintLink:var(--selectedMenuFaintLink,$fallback--faint);--lightText:var(--selectedMenuLightText,$fallback--lightText);--icon:var(--selectedMenuIcon,$fallback--icon)}.nav-panel a.router-link-active{font-weight:bolder;color:#b9b9ba;color:var(--selectedMenuText,#b9b9ba)}.nav-panel a.router-link-active:hover{text-decoration:underline}.nav-panel .button-icon:before{width:1.1em}",""])},function(t,e,n){var i=n(534);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("0ea9aafc",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".search-bar-container{max-width:100%;display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:baseline;align-items:baseline;vertical-align:baseline;-ms-flex-pack:end;justify-content:flex-end}.search-bar-container .search-bar-input,.search-bar-container .search-button{height:29px}.search-bar-container .search-bar-input{max-width:calc(100% - 30px - 30px - 20px)}.search-bar-container .search-button{margin-left:.5em;margin-right:.5em}.search-bar-container .icon-cancel{cursor:pointer}",""])},function(t,e,n){var i=n(536);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("2f18dd03",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".who-to-follow *{vertical-align:middle}.who-to-follow img{width:32px;height:32px}.who-to-follow{padding:0 1em;margin:0}.who-to-follow-items{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0;margin:1em 0}.who-to-follow-more{padding:0;margin:1em 0;text-align:center}",""])},,,,function(t,e,n){var i=n(541);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7272e6fe",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".settings-modal{overflow:hidden}.settings-modal.peek .settings-modal-panel{transform:translateY(calc(((100vh - 100%) / 2 + 100%) - 50px))}@media (max-width:800px){.settings-modal.peek .settings-modal-panel{transform:translateY(calc(100% - 50px))}}.settings-modal .settings-modal-panel{overflow:hidden;transition:transform;transition-timing-function:ease-in-out;transition-duration:.3s;width:1000px;max-width:90vw;height:90vh}@media (max-width:800px){.settings-modal .settings-modal-panel{max-width:100vw;height:100%}}.settings-modal .settings-modal-panel>.panel-body{height:100%;overflow-y:hidden}.settings-modal .settings-modal-panel>.panel-body .btn{min-height:28px;min-width:10em;padding:0 2em}",""])},function(t,e,n){var i=n(543);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("f7395e92",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".modal-view{z-index:1000;position:fixed;top:0;left:0;right:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;overflow:auto;pointer-events:none;animation-duration:.2s;animation-name:modal-background-fadein;opacity:0}.modal-view>*{pointer-events:auto}.modal-view.modal-background{pointer-events:auto;background-color:rgba(0,0,0,.5)}.modal-view.open{opacity:1}@keyframes modal-background-fadein{0%{background-color:transparent}to{background-color:rgba(0,0,0,.5)}}",""])},function(t,e,n){var i=n(545);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("1c82888b",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".panel-loading{display:-ms-flexbox;display:flex;height:100%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;font-size:2em;color:#b9b9ba;color:var(--text,#b9b9ba)}.panel-loading .loading-text i{font-size:3em;line-height:0;vertical-align:middle;color:#b9b9ba;color:var(--text,#b9b9ba)}",""])},function(t,e,n){var i=n(547);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("2970b266",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".async-component-error{display:-ms-flexbox;display:flex;height:100%;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.async-component-error .btn{margin:.5em;padding:.5em 2em}",""])},function(t,e,n){var i=n(549);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("23b00cfc",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".modal-view.media-modal-view{z-index:1001}.modal-view.media-modal-view .modal-view-button-arrow{opacity:.75}.modal-view.media-modal-view .modal-view-button-arrow:focus,.modal-view.media-modal-view .modal-view-button-arrow:hover{outline:none;box-shadow:none}.modal-view.media-modal-view .modal-view-button-arrow:hover{opacity:1}.modal-image{max-width:90%;max-height:90%;box-shadow:0 5px 15px 0 rgba(0,0,0,.5);image-orientation:from-image}.modal-view-button-arrow{position:absolute;display:block;top:50%;margin-top:-50px;width:70px;height:100px;border:0;padding:0;opacity:0;box-shadow:none;background:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;overflow:visible;cursor:pointer;transition:opacity 333ms cubic-bezier(.4,0,.22,1)}.modal-view-button-arrow .arrow-icon{position:absolute;top:35px;height:30px;width:32px;font-size:14px;line-height:30px;color:#fff;text-align:center;background-color:rgba(0,0,0,.3)}.modal-view-button-arrow--prev{left:0}.modal-view-button-arrow--prev .arrow-icon{left:6px}.modal-view-button-arrow--next{right:0}.modal-view-button-arrow--next .arrow-icon{right:6px}",""])},function(t,e,n){var i=n(551);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("34992fba",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".side-drawer-container{position:fixed;z-index:1000;top:0;left:0;width:100%;height:100%;display:-ms-flexbox;display:flex;-ms-flex-align:stretch;align-items:stretch;transition-duration:0s;transition-property:transform}.side-drawer-container-open{transform:translate(0)}.side-drawer-container-closed{transition-delay:.35s;transform:translate(-100%)}.side-drawer-darken{top:0;left:0;width:100vw;height:100vh;position:fixed;z-index:-1;transition:.35s;transition-property:background-color;background-color:rgba(0,0,0,.5)}.side-drawer-darken-closed{background-color:transparent}.side-drawer-click-outside{-ms-flex:1 1 100%;flex:1 1 100%}.side-drawer{overflow-x:hidden;transition-timing-function:cubic-bezier(0,1,.5,1);transition:.35s;transition-property:transform;margin:0 0 0 -100px;padding:0 0 1em 100px;width:80%;max-width:20em;-ms-flex:0 0 80%;flex:0 0 80%;box-shadow:1px 1px 4px rgba(0,0,0,.6);box-shadow:var(--panelShadow);background-color:#121a24;background-color:var(--popover,#121a24);color:#d8a070;color:var(--popoverText,#d8a070);--faint:var(--popoverFaintText,$fallback--faint);--faintLink:var(--popoverFaintLink,$fallback--faint);--lightText:var(--popoverLightText,$fallback--lightText);--icon:var(--popoverIcon,$fallback--icon)}.side-drawer .button-icon:before{width:1.1em}.side-drawer-logo-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.85em}.side-drawer-logo-wrapper img{-ms-flex:none;flex:none;height:50px;margin-right:.85em}.side-drawer-logo-wrapper span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.side-drawer-click-outside-closed{-ms-flex:0 0 0px;flex:0 0 0}.side-drawer-closed{transform:translate(-100%)}.side-drawer-heading{background:transparent;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:stretch;align-items:stretch;display:-ms-flexbox;display:flex;padding:0;margin:0}.side-drawer ul{list-style:none;margin:0;padding:0;border-bottom:1px solid;border-color:#222;border-color:var(--border,#222);margin:.2em 0}.side-drawer ul:last-child{border:0}.side-drawer li{padding:0}.side-drawer li a{display:block;padding:.5em .85em}.side-drawer li a:hover{background-color:#151e2a;background-color:var(--selectedMenuPopover,#151e2a);color:#b9b9ba;color:var(--selectedMenuPopoverText,#b9b9ba);--faint:var(--selectedMenuPopoverFaintText,$fallback--faint);--faintLink:var(--selectedMenuPopoverFaintLink,$fallback--faint);--lightText:var(--selectedMenuPopoverLightText,$fallback--lightText);--icon:var(--selectedMenuPopoverIcon,$fallback--icon)}",""])},function(t,e,n){var i=n(553);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7f8eca07",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".new-status-button{width:5em;height:5em;border-radius:100%;position:fixed;bottom:1.5em;right:1.5em;background-color:#182230;background-color:var(--btn,#182230);display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;box-shadow:0 2px 2px rgba(0,0,0,.3),0 4px 6px rgba(0,0,0,.3);z-index:10;transition:transform .35s;transition-timing-function:cubic-bezier(0,1,.5,1)}.new-status-button.hidden{transform:translateY(150%)}.new-status-button i{font-size:1.5em;color:#b9b9ba;color:var(--text,#b9b9ba)}@media (min-width:801px){.new-status-button{display:none}}",""])},function(t,e,n){var i=n(555);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("1e0fbcf8",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".mobile-inner-nav{width:100%;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.mobile-nav-button{display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;width:50px;position:relative;cursor:pointer}.alert-dot{border-radius:100%;height:8px;width:8px;position:absolute;left:calc(50% - 4px);top:calc(50% - 4px);margin-left:6px;margin-top:-6px;background-color:red;background-color:var(--badgeNotification,red)}.mobile-notifications-drawer{width:100%;height:100vh;overflow-x:hidden;position:fixed;top:0;left:0;box-shadow:1px 1px 4px rgba(0,0,0,.6);box-shadow:var(--panelShadow);transition-property:transform;transition-duration:.25s;transform:translateX(0);z-index:1001;-webkit-overflow-scrolling:touch}.mobile-notifications-drawer.closed{transform:translateX(100%)}.mobile-notifications-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;z-index:1;width:100%;height:50px;line-height:50px;position:absolute;color:var(--topBarText);background-color:#182230;background-color:var(--topBar,#182230);box-shadow:0 0 4px rgba(0,0,0,.6);box-shadow:var(--topBarShadow)}.mobile-notifications-header .title{font-size:1.3em;margin-left:.6em}.mobile-notifications{margin-top:50px;width:100vw;height:calc(100vh - 50px);overflow-x:hidden;overflow-y:scroll;color:#b9b9ba;color:var(--text,#b9b9ba);background-color:#121a24;background-color:var(--bg,#121a24)}.mobile-notifications .notifications{padding:0;border-radius:0;box-shadow:none}.mobile-notifications .notifications .panel{border-radius:0;margin:0;box-shadow:none}.mobile-notifications .notifications .panel:after{border-radius:0}.mobile-notifications .notifications .panel .panel-heading{border-radius:0;box-shadow:none}",""])},function(t,e,n){var i=n(557);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("10c04f96",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".user-reporting-panel{width:90vw;max-width:700px;min-height:20vh;max-height:80vh}.user-reporting-panel .panel-heading .title{text-align:center;-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.user-reporting-panel .panel-body{display:-ms-flexbox;display:flex;-ms-flex-direction:column-reverse;flex-direction:column-reverse;border-top:1px solid;border-color:#222;border-color:var(--border,#222);overflow:hidden}.user-reporting-panel-left{padding:1.1em .7em .7em;line-height:1.4em;box-sizing:border-box}.user-reporting-panel-left>div{margin-bottom:1em}.user-reporting-panel-left>div:last-child{margin-bottom:0}.user-reporting-panel-left p{margin-top:0}.user-reporting-panel-left textarea.form-control{line-height:16px;resize:none;overflow:hidden;transition:min-height .2s .1s;min-height:44px;width:100%}.user-reporting-panel-left .btn{min-width:10em;padding:0 2em}.user-reporting-panel-left .alert{margin:1em 0 0;line-height:1.3em}.user-reporting-panel-right{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;overflow-y:auto}.user-reporting-panel-sitem{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between}.user-reporting-panel-sitem>.Status{-ms-flex:1;flex:1}.user-reporting-panel-sitem>.checkbox{margin:.75em}@media (min-width:801px){.user-reporting-panel .panel-body{-ms-flex-direction:row;flex-direction:row}.user-reporting-panel-left{width:50%;max-width:320px;border-right:1px solid;border-color:#222;border-color:var(--border,#222);padding:1.1em}.user-reporting-panel-left>div{margin-bottom:2em}.user-reporting-panel-right{width:50%;-ms-flex:1 1 auto;flex:1 1 auto;margin-bottom:12px}}",""])},function(t,e,n){var i=n(559);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("7628c2ae",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".modal-view.post-form-modal-view{-ms-flex-align:start;align-items:flex-start}.post-form-modal-panel{-ms-flex-negative:0;flex-shrink:0;margin-top:25%;margin-bottom:2em;width:100%;max-width:700px}@media (orientation:landscape){.post-form-modal-panel{margin-top:8%}}",""])},function(t,e,n){var i=n(561);"string"==typeof i&&(i=[[t.i,i,""]]),i.locals&&(t.exports=i.locals);(0,n(5).default)("cdffaf96",i,!0,{})},function(t,e,n){(t.exports=n(4)(!1)).push([t.i,".global-notice-list{position:fixed;top:50px;width:100%;pointer-events:none;z-index:1001;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:center;align-items:center}.global-notice-list .global-notice{pointer-events:auto;text-align:center;width:40em;max-width:calc(100% - 3em);display:-ms-flexbox;display:flex;padding-left:1.5em;line-height:2em}.global-notice-list .global-notice .notice-message{-ms-flex:1 1 100%;flex:1 1 100%}.global-notice-list .global-notice i{-ms-flex:0 0;flex:0 0;width:1.5em;cursor:pointer}.global-notice-list .global-error{background-color:var(--alertPopupError,red)}.global-notice-list .global-error,.global-notice-list .global-error i{color:var(--alertPopupErrorText,#b9b9ba)}.global-notice-list .global-warning{background-color:var(--alertPopupWarning,orange)}.global-notice-list .global-warning,.global-notice-list .global-warning i{color:var(--alertPopupWarningText,#b9b9ba)}.global-notice-list .global-info{background-color:var(--alertPopupNeutral,#182230)}.global-notice-list .global-info,.global-notice-list .global-info i{color:var(--alertPopupNeutralText,#b9b9ba)}",""])},function(t,e,n){"use strict";n.r(e);var i=n(3),o=n.n(i),r=n(6),s=n.n(r),a=n(108),c=n(2),l=(n(226),n(197));try{new EventTarget}catch(t){window.EventTarget=l.a}var u={state:{settingsModalState:"hidden",settingsModalLoaded:!1,settingsModalTargetTab:null,settings:{currentSaveStateNotice:null,noticeClearTimeout:null,notificationPermission:null},browserSupport:{cssFilter:window.CSS&&window.CSS.supports&&(window.CSS.supports("filter","drop-shadow(0 0)")||window.CSS.supports("-webkit-filter","drop-shadow(0 0)"))},mobileLayout:!1,globalNotices:[],layoutHeight:0,lastTimeline:null},mutations:{settingsSaved:function(t,e){var n=e.success,i=e.error;n?(t.noticeClearTimeout&&clearTimeout(t.noticeClearTimeout),Object(r.set)(t.settings,"currentSaveStateNotice",{error:!1,data:n}),Object(r.set)(t.settings,"noticeClearTimeout",setTimeout(function(){return Object(r.delete)(t.settings,"currentSaveStateNotice")},2e3))):Object(r.set)(t.settings,"currentSaveStateNotice",{error:!0,errorData:i})},setNotificationPermission:function(t,e){t.notificationPermission=e},setMobileLayout:function(t,e){t.mobileLayout=e},closeSettingsModal:function(t){t.settingsModalState="hidden"},togglePeekSettingsModal:function(t){switch(t.settingsModalState){case"minimized":return void(t.settingsModalState="visible");case"visible":return void(t.settingsModalState="minimized");default:throw new Error("Illegal minimization state of settings modal")}},openSettingsModal:function(t){t.settingsModalState="visible",t.settingsModalLoaded||(t.settingsModalLoaded=!0)},setSettingsModalTargetTab:function(t,e){t.settingsModalTargetTab=e},pushGlobalNotice:function(t,e){t.globalNotices.push(e)},removeGlobalNotice:function(t,e){t.globalNotices=t.globalNotices.filter(function(t){return t!==e})},setLayoutHeight:function(t,e){t.layoutHeight=e},setLastTimeline:function(t,e){t.lastTimeline=e}},actions:{setPageTitle:function(t){var e=t.rootState,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";document.title="".concat(n," ").concat(e.instance.name)},settingsSaved:function(t,e){var n=t.commit;t.dispatch;n("settingsSaved",{success:e.success,error:e.error})},setNotificationPermission:function(t,e){(0,t.commit)("setNotificationPermission",e)},setMobileLayout:function(t,e){(0,t.commit)("setMobileLayout",e)},closeSettingsModal:function(t){(0,t.commit)("closeSettingsModal")},openSettingsModal:function(t){(0,t.commit)("openSettingsModal")},togglePeekSettingsModal:function(t){(0,t.commit)("togglePeekSettingsModal")},clearSettingsModalTargetTab:function(t){(0,t.commit)("setSettingsModalTargetTab",null)},openSettingsModalTab:function(t,e){var n=t.commit;n("setSettingsModalTargetTab",e),n("openSettingsModal")},pushGlobalNotice:function(t,e){var n=t.commit,i=t.dispatch,o=e.messageKey,r=e.messageArgs,s=void 0===r?{}:r,a=e.level,c=void 0===a?"error":a,l=e.timeout,u=void 0===l?0:l,d={messageKey:o,messageArgs:s,level:c};return u&&setTimeout(function(){return i("removeGlobalNotice",d)},u),n("pushGlobalNotice",d),d},removeGlobalNotice:function(t,e){(0,t.commit)("removeGlobalNotice",e)},setLayoutHeight:function(t,e){(0,t.commit)("setLayoutHeight",e)},setLastTimeline:function(t,e){(0,t.commit)("setLastTimeline",e)}}},d=n(10),p=n.n(d),f=n(1),h=n.n(f),m=n(7),g=n.n(m),v=n(32),b=n(39),w=n(11),_=n(95);function x(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var y={state:{name:"Pleroma FE",registrationOpen:!0,server:"http://localhost:4040/",textlimit:5e3,themeData:void 0,vapidPublicKey:void 0,alwaysShowSubjectInput:!0,defaultAvatar:"/images/avi.png",defaultBanner:"/images/banner.png",background:"/static/aurora_borealis.jpg",collapseMessageWithSubject:!1,disableChat:!1,greentext:!1,hideFilteredStatuses:!1,hideMutedPosts:!1,hidePostStats:!1,hideSitename:!1,hideUserStats:!1,loginMethod:"password",logo:"/static/logo.png",logoMargin:".2em",logoMask:!0,minimalScopesMode:!1,nsfwCensorImage:void 0,postContentType:"text/plain",redirectRootLogin:"/main/friends",redirectRootNoLogin:"/main/all",scopeCopy:!0,showFeaturesPanel:!0,showInstanceSpecificPanel:!1,sidebarRight:!1,subjectLineBehavior:"email",theme:"pleroma-dark",customEmoji:[],customEmojiFetched:!1,emoji:[],emojiFetched:!1,pleromaBackend:!0,postFormats:[],restrictedNicknames:[],safeDM:!0,knownDomains:[],chatAvailable:!1,pleromaChatMessagesAvailable:!1,gopherAvailable:!1,mediaProxyAvailable:!1,suggestionsEnabled:!1,suggestionsWeb:"",instanceSpecificPanelContent:"",tos:"",backendVersion:"",frontendVersion:"",pollsAvailable:!1,pollLimits:{max_options:4,max_option_chars:255,min_expiration:60,max_expiration:86400}},mutations:{setInstanceOption:function(t,e){var n=e.name,i=e.value;void 0!==i&&Object(r.set)(t,n,i)},setKnownDomains:function(t,e){t.knownDomains=e}},getters:{instanceDefaultConfig:function(t){return _.c.map(function(e){return[e,t[e]]}).reduce(function(t,e){var n=g()(e,2),i=n[0],o=n[1];return function(t){for(var e=1;ee?1:0}):["utf"],replacement:":".concat(i,": ")}}).sort(function(t,e){return t.displayText.toLowerCase()>e.displayText.toLowerCase()?1:0}),e("setInstanceOption",{name:"customEmoji",value:a}),c.next=15;break;case 14:throw i;case 15:c.next=21;break;case 17:c.prev=17,c.t0=c.catch(1),console.warn("Can't load custom emojis"),console.warn(c.t0);case 21:case"end":return c.stop()}},null,null,[[1,17]])},setTheme:function(t,e){var n=t.commit,i=t.rootState;n("setInstanceOption",{name:"theme",value:e}),Object(v.j)(e).then(function(t){if(n("setInstanceOption",{name:"themeData",value:t}),!i.config.customTheme){var e=t.source;!t.theme||e&&e.themeEngineVersion===b.a?Object(v.b)(e):Object(v.b)(t.theme)}})},fetchEmoji:function(t){var e=t.dispatch,n=t.state;n.customEmojiFetched||(n.customEmojiFetched=!0,e("getCustomEmoji")),n.emojiFetched||(n.emojiFetched=!0,e("getStaticEmoji"))},getKnownDomains:function(t){var e,n,i;return o.a.async(function(r){for(;;)switch(r.prev=r.next){case 0:return e=t.commit,n=t.rootState,r.prev=1,r.next=4,o.a.awrap(w.c.fetchKnownDomains({credentials:n.users.currentUser.credentials}));case 4:i=r.sent,e("setKnownDomains",i),r.next=12;break;case 8:r.prev=8,r.t0=r.catch(1),console.warn("Can't load known domains"),console.warn(r.t0);case 12:case"end":return r.stop()}},null,null,[[1,8]])}}},k=n(101),C=n.n(k),S=n(13),j=n.n(S),O=n(23),P=n.n(O),$=n(203),T=n.n($),I=n(96),E=n.n(I),M=n(102),U=n.n(M),F=n(103),D=n.n(F),L=n(25),N=n.n(L),R=n(45),A=n.n(R),B=n(24),z=n.n(B),H=n(204),q=n.n(H),W=n(47),V=n.n(W),G=n(19);function K(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}function Y(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:0,flushMarker:0}},X=function(){return{desktopNotificationSilence:!0,maxId:0,minId:Number.POSITIVE_INFINITY,data:[],idStore:{},loading:!1,error:!1}},Q=function(){return{allStatuses:[],allStatusesObject:{},conversationsObject:{},maxId:0,notifications:X(),favorites:new Set,error:!1,errorData:null,timelines:{mentions:J(),public:J(),user:J(),favorites:J(),media:J(),publicAndExternal:J(),friends:J(),tag:J(),dms:J(),bookmarks:J()}}},Z=function(t,e,n){var i,o=e[n.id];return o?(E()(o,C()(n,function(t,e){return null===t||"user"===e})),o.attachments.splice(o.attachments.length),{item:o,new:!1}):((i=n).deleted=!1,i.attachments=i.attachments||[],t.push(n),Object(r.set)(e,n.id,n),{item:n,new:!0})},tt=function(t,e){var n=Number(t.id),i=Number(e.id),o=!Number.isNaN(n),r=!Number.isNaN(i);return o&&r?n>i?-1:1:o&&!r?1:!o&&r?-1:t.id>e.id?-1:1},et=function(t){return t.visibleStatuses=t.visibleStatuses.sort(tt),t.statuses=t.statuses.sort(tt),t.minVisibleId=(P()(t.visibleStatuses)||{}).id,t},nt=function(t,e){var n=Z(t.allStatuses,t.allStatusesObject,e);if(n.new){var i=n.item,o=t.conversationsObject,s=i.statusnet_conversation_id;o[s]?o[s].push(i):Object(r.set)(o,s,[i])}return n},it={addNewStatuses:function(t,e){var n=e.statuses,i=e.showImmediately,o=void 0!==i&&i,r=e.timeline,s=e.user,a=void 0===s?{}:s,c=e.noIdUpdate,l=void 0!==c&&c,u=e.userId,d=e.pagination,p=void 0===d?{}:d;if(!j()(n))return!1;var f=t.allStatuses,h=t.timelines[r],m=p.maxId||(n.length>0?U()(n,"id").id:0),g=p.minId||(n.length>0?D()(n,"id").id:0),v=r&&(g>h.maxId||0===h.maxId)&&n.length>0,b=r&&(m0;if(!l&&v&&(h.maxId=g),!l&&b&&(h.minId=m),"user"!==r&&"media"!==r||h.userId===u){var w=function(e,n){var i,o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],s=nt(t,e),c=s.item;if(s.new){if("status"===c.type&&N()(c.attentions,{id:a.id})){var l=t.timelines.mentions;h!==l&&(Z(l.statuses,l.statusesObject,c),l.newStatusCount+=1,et(l))}if("direct"===c.visibility){var u=t.timelines.dms;Z(u.statuses,u.statusesObject,c),u.newStatusCount+=1,et(u)}}return r&&o&&(i=Z(h.statuses,h.statusesObject,c)),r&&n?Z(h.visibleStatuses,h.visibleStatusesObject,c):r&&o&&i.new&&(h.newStatusCount+=1),c},_={status:function(t){w(t,o)},retweet:function(t){var e,n=w(t.retweeted_status,!1,!1);e=r&&N()(h.statuses,function(t){return t.retweeted_status?t.id===n.id||t.retweeted_status.id===n.id:t.id===n.id})?w(t,!1,!1):w(t,o),e.retweeted_status=n},favorite:function(e){t.favorites.has(e.id)||(t.favorites.add(e.id),function(t,e){var n=N()(f,{id:t.in_reply_to_status_id});n&&(t.user.id===a.id?n.favorited=!0:n.fave_num+=1)}(e))},deletion:function(e){var n=e.uri,i=N()(f,{uri:n});i&&(function(t,e){V()(t.allStatuses,{id:e.id}),V()(t.notifications.data,function(t){return t.action.id===e.id});var n=e.statusnet_conversation_id;t.conversationsObject[n]&&V()(t.conversationsObject[n],{id:e.id})}(t,i),r&&(V()(h.statuses,{uri:n}),V()(h.visibleStatuses,{uri:n})))},follow:function(t){},default:function(t){console.log("unknown status type"),console.log(t)}};z()(n,function(t){var e=t.type;(_[e]||_.default)(t)}),r&&"bookmarks"!==r&&et(h)}},addNewNotifications:function(t,e){var n=e.dispatch,i=e.notifications,o=(e.older,e.visibleNotificationTypes,e.rootGetters,e.newNotificationSideEffects);z()(i,function(e){Object(G.b)(e.type)&&(e.action=nt(t,e.action).item,e.status=e.status&&nt(t,e.status).item),"pleroma:emoji_reaction"===e.type&&n("fetchEmojiReactionsBy",e.status.id),t.notifications.idStore.hasOwnProperty(e.id)?e.seen&&(t.notifications.idStore[e.id].seen=!0):(t.notifications.maxId=e.id>t.notifications.maxId?e.id:t.notifications.maxId,t.notifications.minId=e.id0?P()(o.visibleStatuses).id:0,o.maxId=o.statuses.length>0?T()(o.statuses).id:0)},showNewStatuses:function(t,e){var n=e.timeline,i=t.timelines[n];i.newStatusCount=0,i.visibleStatuses=q()(i.statuses,0,50),i.minVisibleId=P()(i.visibleStatuses).id,i.minId=i.minVisibleId,i.visibleStatusesObject={},z()(i.visibleStatuses,function(t){i.visibleStatusesObject[t.id]=t})},resetStatuses:function(t){var e=Q();Object.entries(e).forEach(function(e){var n=g()(e,2),i=n[0],o=n[1];t[i]=o})},clearTimeline:function(t,e){var n=e.timeline,i=e.excludeUserId,o=void 0!==i&&i?t.timelines[n].userId:void 0;t.timelines[n]=J(o)},clearNotifications:function(t){t.notifications=X()},setFavorited:function(t,e){var n=e.status,i=e.value,o=t.allStatusesObject[n.id];o.favorited!==i&&(i?o.fave_num++:o.fave_num--),o.favorited=i},setFavoritedConfirm:function(t,e){var n=e.status,i=e.user,o=t.allStatusesObject[n.id];o.favorited=n.favorited,o.fave_num=n.fave_num;var r=A()(o.favoritedBy,{id:i.id});-1===r||o.favorited?-1===r&&o.favorited&&o.favoritedBy.push(i):o.favoritedBy.splice(r,1)},setMutedStatus:function(t,e){var n=t.allStatusesObject[e.id];n.thread_muted=e.thread_muted,void 0!==n.thread_muted&&t.conversationsObject[n.statusnet_conversation_id].forEach(function(t){t.thread_muted=n.thread_muted})},setRetweeted:function(t,e){var n=e.status,i=e.value,o=t.allStatusesObject[n.id];o.repeated!==i&&(i?o.repeat_num++:o.repeat_num--),o.repeated=i},setRetweetedConfirm:function(t,e){var n=e.status,i=e.user,o=t.allStatusesObject[n.id];o.repeated=n.repeated,o.repeat_num=n.repeat_num;var r=A()(o.rebloggedBy,{id:i.id});-1===r||o.repeated?-1===r&&o.repeated&&o.rebloggedBy.push(i):o.rebloggedBy.splice(r,1)},setBookmarked:function(t,e){var n=e.status,i=e.value;t.allStatusesObject[n.id].bookmarked=i},setBookmarkedConfirm:function(t,e){var n=e.status;t.allStatusesObject[n.id].bookmarked=n.bookmarked},setDeleted:function(t,e){var n=e.status,i=t.allStatusesObject[n.id];i&&(i.deleted=!0)},setManyDeleted:function(t,e){Object.values(t.allStatusesObject).forEach(function(t){e(t)&&(t.deleted=!0)})},setLoading:function(t,e){var n=e.timeline,i=e.value;t.timelines[n].loading=i},setNsfw:function(t,e){var n=e.id,i=e.nsfw;t.allStatusesObject[n].nsfw=i},setError:function(t,e){var n=e.value;t.error=n},setErrorData:function(t,e){var n=e.value;t.errorData=n},setNotificationsLoading:function(t,e){var n=e.value;t.notifications.loading=n},setNotificationsError:function(t,e){var n=e.value;t.notifications.error=n},setNotificationsSilence:function(t,e){var n=e.value;t.notifications.desktopNotificationSilence=n},markNotificationsAsSeen:function(t){z()(t.notifications.data,function(t){t.seen=!0})},markSingleNotificationAsSeen:function(t,e){var n=e.id,i=N()(t.notifications.data,function(t){return t.id===n});i&&(i.seen=!0)},dismissNotification:function(t,e){var n=e.id;t.notifications.data=t.notifications.data.filter(function(t){return t.id!==n})},dismissNotifications:function(t,e){var n=e.finder;t.notifications.data=t.notifications.data.filter(function(t){return n})},updateNotification:function(t,e){var n=e.id,i=e.updater,o=N()(t.notifications.data,function(t){return t.id===n});o&&i(o)},queueFlush:function(t,e){var n=e.timeline,i=e.id;t.timelines[n].flushMarker=i},queueFlushAll:function(t){Object.keys(t.timelines).forEach(function(e){t.timelines[e].flushMarker=t.timelines[e].maxId})},addRepeats:function(t,e){var n=e.id,i=e.rebloggedByUsers,o=e.currentUser,r=t.allStatusesObject[n];r.rebloggedBy=i.filter(function(t){return t}),r.repeat_num=r.rebloggedBy.length,r.repeated=!!r.rebloggedBy.find(function(t){var e=t.id;return o.id===e})},addFavs:function(t,e){var n=e.id,i=e.favoritedByUsers,o=e.currentUser,r=t.allStatusesObject[n];r.favoritedBy=i.filter(function(t){return t}),r.fave_num=r.favoritedBy.length,r.favorited=!!r.favoritedBy.find(function(t){var e=t.id;return o.id===e})},addEmojiReactionsBy:function(t,e){var n=e.id,i=e.emojiReactions,o=(e.currentUser,t.allStatusesObject[n]);Object(r.set)(o,"emoji_reactions",i)},addOwnReaction:function(t,e){var n=e.id,i=e.emoji,o=e.currentUser,s=t.allStatusesObject[n],a=A()(s.emoji_reactions,{name:i}),c=s.emoji_reactions[a]||{name:i,count:0,accounts:[]},l=Y({},c,{count:c.count+1,me:!0,accounts:[].concat(p()(c.accounts),[o])});a>=0?Object(r.set)(s.emoji_reactions,a,l):Object(r.set)(s,"emoji_reactions",[].concat(p()(s.emoji_reactions),[l]))},removeOwnReaction:function(t,e){var n=e.id,i=e.emoji,o=e.currentUser,s=t.allStatusesObject[n],a=A()(s.emoji_reactions,{name:i});if(!(a<0)){var c=s.emoji_reactions[a],l=c.accounts||[],u=Y({},c,{count:c.count-1,me:!1,accounts:l.filter(function(t){return t.id!==o.id})});u.count>0?Object(r.set)(s.emoji_reactions,a,u):Object(r.set)(s,"emoji_reactions",s.emoji_reactions.filter(function(t){return t.name!==i}))}},updateStatusWithPoll:function(t,e){var n=e.id,i=e.poll;t.allStatusesObject[n].poll=i}},ot={state:Q(),actions:{addNewStatuses:function(t,e){var n=t.rootState,i=t.commit,o=e.statuses,r=e.showImmediately,s=void 0!==r&&r,a=e.timeline,c=void 0!==a&&a,l=e.noIdUpdate,u=void 0!==l&&l,d=e.userId,p=e.pagination;i("addNewStatuses",{statuses:o,showImmediately:s,timeline:c,noIdUpdate:u,user:n.users.currentUser,userId:d,pagination:p})},addNewNotifications:function(t,e){var n=e.notifications,i=e.older;(0,t.commit)("addNewNotifications",{dispatch:t.dispatch,notifications:n,older:i,rootGetters:t.rootGetters,newNotificationSideEffects:function(e){Object(G.c)(t,e)}})},setError:function(t,e){t.rootState;(0,t.commit)("setError",{value:e.value})},setErrorData:function(t,e){t.rootState;(0,t.commit)("setErrorData",{value:e.value})},setNotificationsLoading:function(t,e){t.rootState;(0,t.commit)("setNotificationsLoading",{value:e.value})},setNotificationsError:function(t,e){t.rootState;(0,t.commit)("setNotificationsError",{value:e.value})},setNotificationsSilence:function(t,e){t.rootState;(0,t.commit)("setNotificationsSilence",{value:e.value})},fetchStatus:function(t,e){var n=t.rootState,i=t.dispatch;return n.api.backendInteractor.fetchStatus({id:e}).then(function(t){return i("addNewStatuses",{statuses:[t]})})},deleteStatus:function(t,e){var n=t.rootState;(0,t.commit)("setDeleted",{status:e}),w.c.deleteStatus({id:e.id,credentials:n.users.currentUser.credentials})},markStatusesAsDeleted:function(t,e){(0,t.commit)("setManyDeleted",e)},favorite:function(t,e){var n=t.rootState,i=t.commit;i("setFavorited",{status:e,value:!0}),n.api.backendInteractor.favorite({id:e.id}).then(function(t){return i("setFavoritedConfirm",{status:t,user:n.users.currentUser})})},unfavorite:function(t,e){var n=t.rootState,i=t.commit;i("setFavorited",{status:e,value:!1}),n.api.backendInteractor.unfavorite({id:e.id}).then(function(t){return i("setFavoritedConfirm",{status:t,user:n.users.currentUser})})},fetchPinnedStatuses:function(t,e){var n=t.rootState,i=t.dispatch;n.api.backendInteractor.fetchPinnedStatuses({id:e}).then(function(t){return i("addNewStatuses",{statuses:t,timeline:"user",userId:e,showImmediately:!0,noIdUpdate:!0})})},pinStatus:function(t,e){var n=t.rootState,i=t.dispatch;return n.api.backendInteractor.pinOwnStatus({id:e}).then(function(t){return i("addNewStatuses",{statuses:[t]})})},unpinStatus:function(t,e){var n=t.rootState,i=t.dispatch;n.api.backendInteractor.unpinOwnStatus({id:e}).then(function(t){return i("addNewStatuses",{statuses:[t]})})},muteConversation:function(t,e){var n=t.rootState,i=t.commit;return n.api.backendInteractor.muteConversation({id:e}).then(function(t){return i("setMutedStatus",t)})},unmuteConversation:function(t,e){var n=t.rootState,i=t.commit;return n.api.backendInteractor.unmuteConversation({id:e}).then(function(t){return i("setMutedStatus",t)})},retweet:function(t,e){var n=t.rootState,i=t.commit;i("setRetweeted",{status:e,value:!0}),n.api.backendInteractor.retweet({id:e.id}).then(function(t){return i("setRetweetedConfirm",{status:t.retweeted_status,user:n.users.currentUser})})},unretweet:function(t,e){var n=t.rootState,i=t.commit;i("setRetweeted",{status:e,value:!1}),n.api.backendInteractor.unretweet({id:e.id}).then(function(t){return i("setRetweetedConfirm",{status:t,user:n.users.currentUser})})},bookmark:function(t,e){var n=t.rootState,i=t.commit;i("setBookmarked",{status:e,value:!0}),n.api.backendInteractor.bookmarkStatus({id:e.id}).then(function(t){i("setBookmarkedConfirm",{status:t})})},unbookmark:function(t,e){var n=t.rootState,i=t.commit;i("setBookmarked",{status:e,value:!1}),n.api.backendInteractor.unbookmarkStatus({id:e.id}).then(function(t){i("setBookmarkedConfirm",{status:t})})},queueFlush:function(t,e){t.rootState;(0,t.commit)("queueFlush",{timeline:e.timeline,id:e.id})},queueFlushAll:function(t){t.rootState;(0,t.commit)("queueFlushAll")},markNotificationsAsSeen:function(t){var e=t.rootState;(0,t.commit)("markNotificationsAsSeen"),w.c.markNotificationsAsSeen({id:e.statuses.notifications.maxId,credentials:e.users.currentUser.credentials})},markSingleNotificationAsSeen:function(t,e){var n=t.rootState,i=t.commit,o=e.id;i("markSingleNotificationAsSeen",{id:o}),w.c.markNotificationsAsSeen({single:!0,id:o,credentials:n.users.currentUser.credentials})},dismissNotificationLocal:function(t,e){t.rootState;(0,t.commit)("dismissNotification",{id:e.id})},dismissNotification:function(t,e){var n=t.rootState,i=t.commit,o=e.id;i("dismissNotification",{id:o}),n.api.backendInteractor.dismissNotification({id:o})},updateNotification:function(t,e){t.rootState;(0,t.commit)("updateNotification",{id:e.id,updater:e.updater})},fetchFavsAndRepeats:function(t,e){var n=t.rootState,i=t.commit;Promise.all([n.api.backendInteractor.fetchFavoritedByUsers({id:e}),n.api.backendInteractor.fetchRebloggedByUsers({id:e})]).then(function(t){var o=g()(t,2),r=o[0],s=o[1];i("addFavs",{id:e,favoritedByUsers:r,currentUser:n.users.currentUser}),i("addRepeats",{id:e,rebloggedByUsers:s,currentUser:n.users.currentUser})})},reactWithEmoji:function(t,e){var n=t.rootState,i=t.dispatch,o=t.commit,r=e.id,s=e.emoji,a=n.users.currentUser;a&&(o("addOwnReaction",{id:r,emoji:s,currentUser:a}),n.api.backendInteractor.reactWithEmoji({id:r,emoji:s}).then(function(t){i("fetchEmojiReactionsBy",r)}))},unreactWithEmoji:function(t,e){var n=t.rootState,i=t.dispatch,o=t.commit,r=e.id,s=e.emoji,a=n.users.currentUser;a&&(o("removeOwnReaction",{id:r,emoji:s,currentUser:a}),n.api.backendInteractor.unreactWithEmoji({id:r,emoji:s}).then(function(t){i("fetchEmojiReactionsBy",r)}))},fetchEmojiReactionsBy:function(t,e){var n=t.rootState,i=t.commit;n.api.backendInteractor.fetchEmojiReactions({id:e}).then(function(t){i("addEmojiReactionsBy",{id:e,emojiReactions:t,currentUser:n.users.currentUser})})},fetchFavs:function(t,e){var n=t.rootState,i=t.commit;n.api.backendInteractor.fetchFavoritedByUsers({id:e}).then(function(t){return i("addFavs",{id:e,favoritedByUsers:t,currentUser:n.users.currentUser})})},fetchRepeats:function(t,e){var n=t.rootState,i=t.commit;n.api.backendInteractor.fetchRebloggedByUsers({id:e}).then(function(t){return i("addRepeats",{id:e,rebloggedByUsers:t,currentUser:n.users.currentUser})})},search:function(t,e){var n=e.q,i=e.resolve,o=e.limit,r=e.offset,s=e.following;return t.rootState.api.backendInteractor.search2({q:n,resolve:i,limit:o,offset:r,following:s}).then(function(e){return t.commit("addNewUsers",e.accounts),t.commit("addNewStatuses",{statuses:e.statuses}),e})}},mutations:it},rt=n(77),st=n.n(rt),at=n(76),ct=n.n(at),lt=n(115),ut=n.n(lt),dt=n(15),pt=n.n(dt),ft=n(137),ht=n.n(ft),mt=n(116),gt=n.n(mt),vt=function(t){var e=t.store,n=t.credentials,i=t.timeline,o=void 0===i?"friends":i,r=t.older,s=void 0!==r&&r,a=t.showImmediately,c=void 0!==a&&a,l=t.userId,u=void 0!==l&&l,d=t.tag,p=void 0!==d&&d,f=t.until,h={timeline:o,credentials:n},m=e.rootState||e.state,g=e.getters,v=m.statuses.timelines[gt()(o)],b=g.mergedConfig,_=b.hideMutedPosts,x=b.replyVisibility,y=!!m.users.currentUser;s?h.until=f||v.minId:h.since=v.maxId,h.userId=u,h.tag=p,h.withMuted=!_,y&&["friends","public","publicAndExternal"].includes(o)&&(h.replyVisibility=x);var k=v.statuses.length;return w.c.fetchTimeline(h).then(function(t){if(!t.error){var n=t.data,i=t.pagination;return!s&&n.length>=20&&!v.loading&&k>0&&e.dispatch("queueFlush",{timeline:o,id:v.maxId}),function(t){var e=t.store,n=t.statuses,i=t.timeline,o=t.showImmediately,r=t.userId,s=t.pagination,a=gt()(i);e.dispatch("setError",{value:!1}),e.dispatch("setErrorData",{value:null}),e.dispatch("addNewStatuses",{timeline:a,userId:r,statuses:n,showImmediately:o,pagination:s})}({store:e,statuses:n,timeline:o,showImmediately:c,userId:u,pagination:i}),{statuses:n,pagination:i}}e.dispatch("setErrorData",{value:t})},function(){return e.dispatch("setError",{value:!0})})},bt={fetchAndUpdate:vt,startFetching:function(t){var e=t.timeline,n=void 0===e?"friends":e,i=t.credentials,o=t.store,r=t.userId,s=void 0!==r&&r,a=t.tag,c=void 0!==a&&a,l=(o.rootState||o.state).statuses.timelines[gt()(n)],u=0===l.visibleStatuses.length;l.userId=s,vt({timeline:n,credentials:i,store:o,showImmediately:u,userId:s,tag:c});return setInterval(function(){return vt({timeline:n,credentials:i,store:o,userId:s,tag:c})},1e4)}},wt=function(t){var e=t.store,n=t.credentials,i=t.older,o=void 0!==i&&i,r={credentials:n},s=e.getters,a=e.rootState||e.state,c=a.statuses.notifications,l=s.mergedConfig.hideMutedPosts,u=a.users.currentUser.allow_following_move;if(r.withMuted=!l,r.withMove=!u,r.timeline="notifications",o)return c.minId!==Number.POSITIVE_INFINITY&&(r.until=c.minId),_t({store:e,args:r,older:o});c.maxId!==Number.POSITIVE_INFINITY&&(r.since=c.maxId);var d=_t({store:e,args:r,older:o}),f=c.data,h=f.filter(function(t){return t.seen}).map(function(t){return t.id});return f.length-h.length>0&&h.length>0&&(r.since=Math.max.apply(Math,p()(h)),_t({store:e,args:r,older:o})),d},_t=function(t){var e=t.store,n=t.args,i=t.older;return w.c.fetchTimeline(n).then(function(t){var n=t.data;return function(t){var e=t.store,n=t.notifications,i=t.older;e.dispatch("setNotificationsError",{value:!1}),e.dispatch("addNewNotifications",{notifications:n,older:i})}({store:e,notifications:n,older:i}),n},function(){return e.dispatch("setNotificationsError",{value:!0})}).catch(function(){return e.dispatch("setNotificationsError",{value:!0})})},xt={fetchAndUpdate:wt,startFetching:function(t){var e=t.credentials,n=t.store;wt({credentials:e,store:n});return setTimeout(function(){return n.dispatch("setNotificationsSilence",!1)},1e4),setInterval(function(){return wt({credentials:e,store:n})},1e4)}},yt=function(t){var e=t.store,n=t.credentials;return w.c.fetchFollowRequests({credentials:n}).then(function(t){e.commit("setFollowRequests",t),e.commit("addNewUsers",t)},function(){}).catch(function(){})},kt={startFetching:function(t){var e=t.credentials,n=t.store;yt({credentials:e,store:n});return setInterval(function(){return yt({credentials:e,store:n})},1e4)}};function Ct(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}function St(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:[];return Promise.all(e.map(function(e){return zt(t,e)}))},unblockUsers:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Promise.all(e.map(function(e){return Ht(t,e)}))},fetchMutes:function(t){return t.rootState.api.backendInteractor.fetchMutes().then(function(e){return t.commit("saveMuteIds",pt()(e,"id")),t.commit("addNewUsers",e),e})},muteUser:function(t,e){return qt(t,e)},unmuteUser:function(t,e){return Wt(t,e)},hideReblogs:function(t,e){return function(t,e){return t.rootState.api.backendInteractor.followUser({id:e,reblogs:!1}).then(function(e){t.commit("updateUserRelationship",[e])})}(t,e)},showReblogs:function(t,e){return function(t,e){return t.rootState.api.backendInteractor.followUser({id:e,reblogs:!0}).then(function(e){return t.commit("updateUserRelationship",[e])})}(t,e)},muteUsers:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Promise.all(e.map(function(e){return qt(t,e)}))},unmuteUsers:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Promise.all(e.map(function(e){return Wt(t,e)}))},fetchDomainMutes:function(t){return t.rootState.api.backendInteractor.fetchDomainMutes().then(function(e){return t.commit("saveDomainMutes",e),e})},muteDomain:function(t,e){return Vt(t,e)},unmuteDomain:function(t,e){return Gt(t,e)},muteDomains:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Promise.all(e.map(function(e){return Vt(t,e)}))},unmuteDomains:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Promise.all(e.map(function(e){return Gt(t,e)}))},fetchFriends:function(t,e){var n=t.rootState,i=t.commit,o=n.users.usersObject[e],r=P()(o.friendIds);return n.api.backendInteractor.fetchFriends({id:e,maxId:r}).then(function(t){return i("addNewUsers",t),i("saveFriendIds",{id:e,friendIds:pt()(t,"id")}),t})},fetchFollowers:function(t,e){var n=t.rootState,i=t.commit,o=n.users.usersObject[e],r=P()(o.followerIds);return n.api.backendInteractor.fetchFollowers({id:e,maxId:r}).then(function(t){return i("addNewUsers",t),i("saveFollowerIds",{id:e,followerIds:pt()(t,"id")}),t})},clearFriends:function(t,e){(0,t.commit)("clearFriends",e)},clearFollowers:function(t,e){(0,t.commit)("clearFollowers",e)},subscribeUser:function(t,e){var n=t.rootState,i=t.commit;return n.api.backendInteractor.subscribeUser({id:e}).then(function(t){return i("updateUserRelationship",[t])})},unsubscribeUser:function(t,e){var n=t.rootState,i=t.commit;return n.api.backendInteractor.unsubscribeUser({id:e}).then(function(t){return i("updateUserRelationship",[t])})},toggleActivationStatus:function(t,e){var n=t.rootState,i=t.commit,o=e.user;(o.deactivated?n.api.backendInteractor.activateUser:n.api.backendInteractor.deactivateUser)({user:o}).then(function(t){var e=t.deactivated;return i("updateActivationStatus",{user:o,deactivated:e})})},registerPushNotifications:function(t){var e=t.state.currentUser.credentials,n=t.rootState.instance.vapidPublicKey;Nt(t.rootState.config.webPushNotifications,n,e,t.rootState.config.notificationVisibility)},unregisterPushNotifications:function(t){!function(t){Ft()&&Promise.all([Lt(t),Dt().then(function(t){return function(t){return t.pushManager.getSubscription().then(function(t){if(null!==t)return t.unsubscribe()})}(t).then(function(e){return[t,e]})}).then(function(t){var e=g()(t,2),n=e[0];return e[1]||console.warn("Push subscription cancellation wasn't successful, killing SW anyway..."),n.unregister().then(function(t){t||console.warn("Failed to kill SW")})})]).catch(function(t){return console.warn("Failed to disable Web Push Notifications: ".concat(t.message))})}(t.state.currentUser.credentials)},addNewUsers:function(t,e){(0,t.commit)("addNewUsers",e)},addNewStatuses:function(t,e){var n=e.statuses,i=pt()(n,"user"),o=ht()(pt()(n,"retweeted_status.user"));t.commit("addNewUsers",i),t.commit("addNewUsers",o),z()(n,function(e){t.commit("setUserForStatus",e),t.commit("setPinnedToUser",e)}),z()(ht()(pt()(n,"retweeted_status")),function(e){t.commit("setUserForStatus",e),t.commit("setPinnedToUser",e)})},addNewNotifications:function(t,e){var n=e.notifications,i=pt()(n,"from_profile"),o=pt()(n,"target").filter(function(t){return t}),r=n.map(function(t){return t.id});t.commit("addNewUsers",i),t.commit("addNewUsers",o);var s=t.rootState.statuses.notifications.idStore,a=Object.entries(s).filter(function(t){var e=g()(t,2),n=e[0];e[1];return r.includes(n)}).map(function(t){var e=g()(t,2);e[0];return e[1]});z()(a,function(e){t.commit("setUserForNotification",e)})},searchUsers:function(t,e){var n=t.rootState,i=t.commit,o=e.query;return n.api.backendInteractor.searchUsers({query:o}).then(function(t){return i("addNewUsers",t),t})},signUp:function(t,e){var n,i,r;return o.a.async(function(s){for(;;)switch(s.prev=s.next){case 0:return t.commit("signUpPending"),n=t.rootState,s.prev=2,s.next=5,o.a.awrap(n.api.backendInteractor.register({params:At({},e)}));case 5:i=s.sent,t.commit("signUpSuccess"),t.commit("setToken",i.access_token),t.dispatch("loginUser",i.access_token),s.next=16;break;case 11:throw s.prev=11,s.t0=s.catch(2),r=s.t0.message,t.commit("signUpFailure",r),s.t0;case 16:case"end":return s.stop()}},null,null,[[2,11]])},getCaptcha:function(t){return o.a.async(function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",t.rootState.api.backendInteractor.getCaptcha());case 1:case"end":return e.stop()}})},logout:function(t){var e=t.rootState,n=e.oauth,i=e.instance,o=At({},n,{commit:t.commit,instance:i.server});return Et.getOrCreateApp(o).then(function(t){var e={app:t,instance:o.instance,token:n.userToken};return Et.revokeToken(e)}).then(function(){t.commit("clearCurrentUser"),t.dispatch("disconnectFromSocket"),t.commit("clearToken"),t.dispatch("stopFetchingTimeline","friends"),t.commit("setBackendInteractor",jt(t.getters.getToken())),t.dispatch("stopFetchingNotifications"),t.dispatch("stopFetchingFollowRequests"),t.commit("clearNotifications"),t.commit("resetStatuses"),t.dispatch("resetChats"),t.dispatch("setLastTimeline","public-timeline")})},loginUser:function(t,e){return new Promise(function(n,i){var o=t.commit;o("beginLogin"),t.rootState.api.backendInteractor.verifyCredentials(e).then(function(r){if(r.error){var s=r.error;o("endLogin"),401===s.status?i(new Error("Wrong username or password")):i(new Error("An error occurred, please try again"))}else{var a=r;a.credentials=e,a.blockIds=[],a.muteIds=[],a.domainMutes=[],o("setCurrentUser",a),o("addNewUsers",[a]),t.dispatch("fetchEmoji"),(l=window.Notification,l?"default"===l.permission?l.requestPermission():Promise.resolve(l.permission):Promise.resolve(null)).then(function(t){return o("setNotificationPermission",t)}),o("setBackendInteractor",jt(e)),a.token&&(t.dispatch("setWsToken",a.token),t.dispatch("initializeSocket"));var c=function(){t.dispatch("startFetchingTimeline",{timeline:"friends"}),t.dispatch("startFetchingNotifications"),t.dispatch("startFetchingChats")};t.getters.mergedConfig.useStreamingApi?t.dispatch("enableMastoSockets").catch(function(t){console.error("Failed initializing MastoAPI Streaming socket",t),c()}).then(function(){t.dispatch("fetchChats",{latest:!0}),setTimeout(function(){return t.dispatch("setNotificationsSilence",!1)},1e4)}):c(),t.dispatch("fetchMutes"),t.rootState.api.backendInteractor.fetchFriends({id:a.id}).then(function(t){return o("addNewUsers",t)})}var l;o("endLogin"),n()}).catch(function(t){console.log(t),o("endLogin"),i(new Error("Failed to connect to server, try again"))})})}}},Yt=n(100),Jt=function(t,e){if(e.lastMessage&&(t.rootState.chats.currentChatId!==e.id||document.hidden)&&t.rootState.users.currentUser.id!==e.lastMessage.account.id){var n={tag:e.lastMessage.id,title:e.account.name,icon:e.account.profile_image_url,body:e.lastMessage.content};e.lastMessage.attachment&&"image"===e.lastMessage.attachment.type&&(n.image=e.lastMessage.attachment.preview_url),Object(Yt.a)(t.rootState,n)}},Xt=n(206),Qt={state:{backendInteractor:jt(),fetchers:{},socket:null,mastoUserSocket:null,mastoUserSocketStatus:null,followRequests:[]},mutations:{setBackendInteractor:function(t,e){t.backendInteractor=e},addFetcher:function(t,e){var n=e.fetcherName,i=e.fetcher;t.fetchers[n]=i},removeFetcher:function(t,e){var n=e.fetcherName,i=e.fetcher;window.clearInterval(i),delete t.fetchers[n]},setWsToken:function(t,e){t.wsToken=e},setSocket:function(t,e){t.socket=e},setFollowRequests:function(t,e){t.followRequests=e},setMastoUserSocketStatus:function(t,e){t.mastoUserSocketStatus=e}},actions:{enableMastoSockets:function(t){var e=t.state,n=t.dispatch;if(!e.mastoUserSocket)return n("startMastoUserSocket")},disableMastoSockets:function(t){var e=t.state,n=t.dispatch;if(e.mastoUserSocket)return n("stopMastoUserSocket")},startMastoUserSocket:function(t){return new Promise(function(e,n){try{var i=t.state,o=t.commit,r=t.dispatch,s=t.rootState.statuses.timelines.friends;i.mastoUserSocket=i.backendInteractor.startUserSocket({store:t}),i.mastoUserSocket.addEventListener("message",function(e){var n=e.detail;n&&("notification"===n.event?r("addNewNotifications",{notifications:[n.notification],older:!1}):"update"===n.event?r("addNewStatuses",{statuses:[n.status],userId:!1,showImmediately:0===s.visibleStatuses.length,timeline:"friends"}):"pleroma:chat_update"===n.event&&(r("addChatMessages",{chatId:n.chatUpdate.id,messages:[n.chatUpdate.lastMessage]}),r("updateChat",{chat:n.chatUpdate}),Jt(t,n.chatUpdate)))}),i.mastoUserSocket.addEventListener("open",function(){o("setMastoUserSocketStatus",w.b.JOINED)}),i.mastoUserSocket.addEventListener("error",function(t){var e=t.detail;console.error("Error in MastoAPI websocket:",e),o("setMastoUserSocketStatus",w.b.ERROR),r("clearOpenedChats")}),i.mastoUserSocket.addEventListener("close",function(t){var e=t.detail,n=new Set([1e3,1001]),i=e.code;n.has(i)?console.debug("Not restarting socket becasue of closure code ".concat(i," is in ignore list")):(console.warn("MastoAPI websocket disconnected, restarting. CloseEvent code: ".concat(i)),r("startFetchingTimeline",{timeline:"friends"}),r("startFetchingNotifications"),r("startFetchingChats"),r("restartMastoUserSocket")),o("setMastoUserSocketStatus",w.b.CLOSED),r("clearOpenedChats")}),e()}catch(t){n(t)}})},restartMastoUserSocket:function(t){var e=t.dispatch;return e("startMastoUserSocket").then(function(){e("stopFetchingTimeline",{timeline:"friends"}),e("stopFetchingNotifications"),e("stopFetchingChats")})},stopMastoUserSocket:function(t){var e=t.state,n=t.dispatch;n("startFetchingTimeline",{timeline:"friends"}),n("startFetchingNotifications"),n("startFetchingChats"),e.mastoUserSocket.close()},startFetchingTimeline:function(t,e){var n=e.timeline,i=void 0===n?"friends":n,o=e.tag,r=void 0!==o&&o,s=e.userId,a=void 0!==s&&s;if(!t.state.fetchers[i]){var c=t.state.backendInteractor.startFetchingTimeline({timeline:i,store:t,userId:a,tag:r});t.commit("addFetcher",{fetcherName:i,fetcher:c})}},stopFetchingTimeline:function(t,e){var n=t.state.fetchers[e];n&&t.commit("removeFetcher",{fetcherName:e,fetcher:n})},startFetchingNotifications:function(t){if(!t.state.fetchers.notifications){var e=t.state.backendInteractor.startFetchingNotifications({store:t});t.commit("addFetcher",{fetcherName:"notifications",fetcher:e})}},stopFetchingNotifications:function(t){var e=t.state.fetchers.notifications;e&&t.commit("removeFetcher",{fetcherName:"notifications",fetcher:e})},startFetchingFollowRequests:function(t){if(!t.state.fetchers.followRequests){var e=t.state.backendInteractor.startFetchingFollowRequests({store:t});t.commit("addFetcher",{fetcherName:"followRequests",fetcher:e})}},stopFetchingFollowRequests:function(t){var e=t.state.fetchers.followRequests;e&&t.commit("removeFetcher",{fetcherName:"followRequests",fetcher:e})},removeFollowRequest:function(t,e){var n=t.state.followRequests.filter(function(t){return t!==e});t.commit("setFollowRequests",n)},setWsToken:function(t,e){t.commit("setWsToken",e)},initializeSocket:function(t){var e=t.dispatch,n=t.commit,i=t.state,o=t.rootState,r=i.wsToken;if(o.instance.chatAvailable&&void 0!==r&&null===i.socket){var s=new Xt.Socket("/socket",{params:{token:r}});s.connect(),n("setSocket",s),e("initializeChat",s)}},disconnectFromSocket:function(t){var e=t.commit,n=t.state;n.socket&&n.socket.disconnect(),e("setSocket",null)}}},Zt={state:{messages:[],channel:{state:""}},mutations:{setChannel:function(t,e){t.channel=e},addMessage:function(t,e){t.messages.push(e),t.messages=t.messages.slice(-19,20)},setMessages:function(t,e){t.messages=e.slice(-19,20)}},actions:{initializeChat:function(t,e){var n=e.channel("chat:public");n.on("new_msg",function(e){t.commit("addMessage",e)}),n.on("messages",function(e){var n=e.messages;t.commit("setMessages",n)}),n.join(),t.commit("setChannel",n)}}},te={state:{clientId:!1,clientSecret:!1,appToken:!1,userToken:!1},mutations:{setClientData:function(t,e){var n=e.clientId,i=e.clientSecret;t.clientId=n,t.clientSecret=i},setAppToken:function(t,e){t.appToken=e},setToken:function(t,e){t.userToken=e},clearToken:function(t){t.userToken=!1,Object(r.delete)(t,"token")}},getters:{getToken:function(t){return function(){return t.userToken||t.token||t.appToken}},getUserToken:function(t){return function(){return t.userToken||t.token}}}},ee=function(t){t.strategy=t.initStrategy,t.settings={}},ne={namespaced:!0,state:{settings:{},strategy:"password",initStrategy:"password"},getters:{settings:function(t,e){return t.settings},requiredPassword:function(t,e,n){return"password"===t.strategy},requiredToken:function(t,e,n){return"token"===t.strategy},requiredTOTP:function(t,e,n){return"totp"===t.strategy},requiredRecovery:function(t,e,n){return"recovery"===t.strategy}},mutations:{setInitialStrategy:function(t,e){e&&(t.initStrategy=e,t.strategy=e)},requirePassword:function(t){t.strategy="password"},requireToken:function(t){t.strategy="token"},requireMFA:function(t,e){var n=e.settings;t.settings=n,t.strategy="totp"},requireRecovery:function(t){t.strategy="recovery"},requireTOTP:function(t){t.strategy="totp"},abortMFA:function(t){ee(t)}},actions:{login:function(t,e){var n,i,r,s;return o.a.async(function(a){for(;;)switch(a.prev=a.next){case 0:return n=t.state,i=t.dispatch,r=t.commit,s=e.access_token,r("setToken",s,{root:!0}),a.next=5,o.a.awrap(i("loginUser",s,{root:!0}));case 5:ee(n);case 6:case"end":return a.stop()}})}}},ie=n(21),oe={state:{media:[],currentIndex:0,activated:!1},mutations:{setMedia:function(t,e){t.media=e},setCurrent:function(t,e){t.activated=!0,t.currentIndex=e},close:function(t){t.activated=!1}},actions:{setMedia:function(t,e){(0,t.commit)("setMedia",e.filter(function(t){var e=ie.a.fileType(t.mimetype);return"image"===e||"video"===e||"audio"===e}))},setCurrent:function(t,e){(0,t.commit)("setCurrent",t.state.media.indexOf(e)||0)},closeMediaViewer:function(t){(0,t.commit)("close")}}},re={state:{tokens:[]},actions:{fetchTokens:function(t){var e=t.rootState,n=t.commit;e.api.backendInteractor.fetchOAuthTokens().then(function(t){n("swapTokens",t)})},revokeToken:function(t,e){var n=t.rootState,i=t.commit,o=t.state;n.api.backendInteractor.revokeOAuthToken({id:e}).then(function(t){201===t.status&&i("swapTokens",o.tokens.filter(function(t){return t.id!==e}))})}},mutations:{swapTokens:function(t,e){t.tokens=e}}},se=n(37),ae=n.n(se),ce={state:{userId:null,statuses:[],modalActivated:!1},mutations:{openUserReportingModal:function(t,e){var n=e.userId,i=e.statuses;t.userId=n,t.statuses=i,t.modalActivated=!0},closeUserReportingModal:function(t){t.modalActivated=!1}},actions:{openUserReportingModal:function(t,e){var n=t.rootState,i=t.commit,o=ae()(n.statuses.allStatuses,function(t){return t.user.id===e});i("openUserReportingModal",{userId:e,statuses:o})},closeUserReportingModal:function(t){(0,t.commit)("closeUserReportingModal")}}},le={state:{trackedPolls:{},pollsObject:{}},mutations:{mergeOrAddPoll:function(t,e){var n=t.pollsObject[e.id];e.expired=Date.now()>Date.parse(e.expires_at),n?Object(r.set)(t.pollsObject,e.id,E()(n,e)):Object(r.set)(t.pollsObject,e.id,e)},trackPoll:function(t,e){var n=t.trackedPolls[e];n?Object(r.set)(t.trackedPolls,e,n+1):Object(r.set)(t.trackedPolls,e,1)},untrackPoll:function(t,e){var n=t.trackedPolls[e];n?Object(r.set)(t.trackedPolls,e,n-1):Object(r.set)(t.trackedPolls,e,0)}},actions:{mergeOrAddPoll:function(t,e){(0,t.commit)("mergeOrAddPoll",e)},updateTrackedPoll:function(t,e){var n=t.rootState,i=t.dispatch,o=t.commit;n.api.backendInteractor.fetchPoll({pollId:e}).then(function(t){setTimeout(function(){n.polls.trackedPolls[e]&&i("updateTrackedPoll",e)},3e4),o("mergeOrAddPoll",t)})},trackPoll:function(t,e){var n=t.rootState,i=t.commit,o=t.dispatch;n.polls.trackedPolls[e]||setTimeout(function(){return o("updateTrackedPoll",e)},3e4),i("trackPoll",e)},untrackPoll:function(t,e){(0,t.commit)("untrackPoll",e)},votePoll:function(t,e){var n=t.rootState,i=t.commit,o=(e.id,e.pollId),r=e.choices;return n.api.backendInteractor.vote({pollId:o,choices:r}).then(function(t){return i("mergeOrAddPoll",t),t})}}},ue={state:{params:null,modalActivated:!1},mutations:{openPostStatusModal:function(t,e){t.params=e,t.modalActivated=!0},closePostStatusModal:function(t){t.modalActivated=!1}},actions:{openPostStatusModal:function(t,e){(0,t.commit)("openPostStatusModal",e)},closePostStatusModal:function(t){(0,t.commit)("closePostStatusModal")}}},de=n(104),pe=n.n(de),fe=n(207),he=n.n(fe),me=n(208),ge=n.n(me),ve=n(98),be=n.n(ve),we={add:function(t,e){var n=e.messages;if(t)for(var i=0;it.lastMessage.id)&&(t.lastMessage=o),t.idIndex[o.id]||(t.lastSeenTimestamp1&&void 0!==arguments[1]&&arguments[1];return n.api.backendInteractor.chats().then(function(t){var n=t.chats;return e("addNewChats",{chats:n}),n})},addNewChats:function(t,e){var n=e.chats;(0,t.commit)("addNewChats",{dispatch:t.dispatch,chats:n,rootGetters:t.rootGetters,newChatMessageSideEffects:function(e){Jt(t,e)}})},updateChat:function(t,e){(0,t.commit)("updateChat",{chat:e.chat})},startFetchingCurrentChat:function(t,e){t.commit;(0,t.dispatch)("setCurrentChatFetcher",{fetcher:e.fetcher})},setCurrentChatFetcher:function(t,e){t.rootState;(0,t.commit)("setCurrentChatFetcher",{fetcher:e.fetcher})},addOpenedChat:function(t,e){t.rootState;var n=t.commit,i=t.dispatch,o=e.chat;n("addOpenedChat",{dispatch:i,chat:Object(_e.b)(o)}),i("addNewUsers",[o.account])},addChatMessages:function(t,e){var n=t.commit;n("addChatMessages",ye({commit:n},e))},resetChatNewMessageCount:function(t,e){(0,t.commit)("resetChatNewMessageCount",e)},clearCurrentChat:function(t,e){t.rootState;var n=t.commit;t.dispatch;n("setCurrentChatId",{chatId:void 0}),n("setCurrentChatFetcher",{fetcher:void 0})},readChat:function(t,e){var n=t.rootState,i=t.commit,o=t.dispatch,r=e.id,s=e.lastReadId;o("resetChatNewMessageCount"),i("readChat",{id:r}),n.api.backendInteractor.readChat({id:r,lastReadId:s})},deleteChatMessage:function(t,e){var n=t.rootState,i=t.commit;n.api.backendInteractor.deleteChatMessage(e),i("deleteChatMessage",ye({commit:i},e))},resetChats:function(t){var e=t.commit;(0,t.dispatch)("clearCurrentChat"),e("resetChats",{commit:e})},clearOpenedChats:function(t){t.rootState;var e=t.commit;t.dispatch,t.rootGetters;e("clearOpenedChats",{commit:e})}},mutations:{setChatListFetcher:function(t,e){e.commit;var n=e.fetcher,i=t.chatListFetcher;i&&clearInterval(i),t.chatListFetcher=n&&n()},setCurrentChatFetcher:function(t,e){var n=e.fetcher,i=t.fetcher;i&&clearInterval(i),t.fetcher=n&&n()},addOpenedChat:function(t,e){e._dispatch;var n=e.chat;t.currentChatId=n.id,s.a.set(t.openedChats,n.id,n),t.openedChatMessageServices[n.id]||s.a.set(t.openedChatMessageServices,n.id,we.empty(n.id))},setCurrentChatId:function(t,e){var n=e.chatId;t.currentChatId=n},addNewChats:function(t,e){var n=e.chats,i=e.newChatMessageSideEffects;n.forEach(function(e){var n=ke(t,e.id);if(n){var o=(n.lastMessage&&n.lastMessage.id)!==(e.lastMessage&&e.lastMessage.id);n.lastMessage=e.lastMessage,n.unread=e.unread,o&&n.unread&&i(e)}else t.chatList.data.push(e),s.a.set(t.chatList.idStore,e.id,e)})},updateChat:function(t,e){e._dispatch;var n=e.chat,i=(e._rootGetters,ke(t,n.id));i&&(i.lastMessage=n.lastMessage,i.unread=n.unread,i.updated_at=n.updated_at),i||t.chatList.data.unshift(n),s.a.set(t.chatList.idStore,n.id,n)},deleteChat:function(t,e){e._dispatch;var n=e.id;e._rootGetters;t.chats.data=t.chats.data.filter(function(t){return t.last_status.id!==n}),t.chats.idStore=C()(t.chats.idStore,function(t){return t.last_status.id===n})},resetChats:function(t,e){var n=e.commit;for(var i in t.chatList={data:[],idStore:{}},t.currentChatId=null,n("setChatListFetcher",{fetcher:void 0}),t.openedChats)we.clear(t.openedChatMessageServices[i]),s.a.delete(t.openedChats,i),s.a.delete(t.openedChatMessageServices,i)},setChatsLoading:function(t,e){var n=e.value;t.chats.loading=n},addChatMessages:function(t,e){var n=e.commit,i=e.chatId,o=e.messages,r=t.openedChatMessageServices[i];r&&(we.add(r,{messages:o.map(_e.c)}),n("refreshLastMessage",{chatId:i}))},refreshLastMessage:function(t,e){var n=e.chatId,i=t.openedChatMessageServices[n];if(i){var o=ke(t,n);o&&(o.lastMessage=i.lastMessage,i.lastMessage&&(o.updated_at=i.lastMessage.created_at))}},deleteChatMessage:function(t,e){var n=e.commit,i=e.chatId,o=e.messageId,r=t.openedChatMessageServices[i];r&&(we.deleteMessage(r,o),n("refreshLastMessage",{chatId:i}))},resetChatNewMessageCount:function(t,e){var n=t.openedChatMessageServices[t.currentChatId];we.resetNewMessageCount(n)},clearOpenedChats:function(t){var e=t.currentChatId;for(var n in t.openedChats)e!==n&&(we.clear(t.openedChatMessageServices[n]),s.a.delete(t.openedChats,n),s.a.delete(t.openedChatMessageServices,n))},readChat:function(t,e){var n=e.id,i=ke(t,n);i&&(i.unread=0)}}},Se=n(138),je=n(27),Oe=n.n(je),Pe=n(209),$e=n.n(Pe),Te=n(12),Ie=n.n(Te),Ee=n(210),Me=n.n(Ee),Ue=n(211),Fe=!1,De=function(t,e){return 0===e.length?t:e.reduce(function(e,n){return $e()(e,n,Ie()(t,n)),e},{})},Le=["markNotificationsAsSeen","clearCurrentUser","setCurrentUser","setHighlight","setOption","setClientData","setToken","clearToken"],Ne=n.n(Ue).a;function Re(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.key,n=void 0===e?"vuex-lz":e,i=t.paths,o=void 0===i?[]:i,r=t.getState,s=void 0===r?function(t,e){return e.getItem(t)}:r,a=t.setState,c=void 0===a?function(t,e,n){return Fe?n.setItem(t,e):(console.log("waiting for old state to be loaded..."),Promise.resolve())}:a,l=t.reducer,u=void 0===l?De:l,d=t.storage,p=void 0===d?Ne:d,f=t.subscriber,h=void 0===f?function(t){return function(e){return t.subscribe(e)}}:f;return s(n,p).then(function(t){return function(e){try{if(null!==t&&"object"===Oe()(t)){var i=t.users||{};i.usersObject={};var r=i.users||[];z()(r,function(t){i.usersObject[t.id]=t}),t.users=i,e.replaceState(Me()({},e.state,t))}Fe=!0}catch(t){console.log("Couldn't load state"),console.error(t),Fe=!0}h(e)(function(t,i){try{Le.includes(t.type)&&c(n,u(i,o),p).then(function(n){void 0!==n&&("setOption"!==t.type&&"setCurrentUser"!==t.type||e.dispatch("settingsSaved",{success:n}))},function(n){"setOption"!==t.type&&"setCurrentUser"!==t.type||e.dispatch("settingsSaved",{error:n})})}catch(t){console.log("Couldn't persist state:"),console.log(t)}})}})}var Ae,Be,ze=function(t){t.subscribe(function(e,n){var i=n.instance.vapidPublicKey,o=n.config.webPushNotifications,r="granted"===n.interface.notificationPermission,s=n.users.currentUser,a="setCurrentUser"===e.type,c="setInstanceOption"===e.type&&"vapidPublicKey"===e.payload.name,l="setNotificationPermission"===e.type&&"granted"===e.payload,u="setOption"===e.type&&"webPushNotifications"===e.payload.name,d="setOption"===e.type&&"notificationVisibility"===e.payload.name;if(a||c||l||u||d){if(s&&i&&r&&o)return t.dispatch("registerPushNotifications");if(u&&!o)return t.dispatch("unregisterPushNotifications")}})},He=n(74),qe=n(212),We=n.n(qe),Ve=n(213),Ge=n.n(Ve),Ke=n(214),Ye=n.n(Ke),Je=n(139),Xe=new Set([]),Qe=function(t){var e=window.innerWidth-document.documentElement.clientWidth;Je.disableBodyScroll(t,{reserveScrollBarGap:!0}),Xe.add(t),setTimeout(function(){if(Xe.size<=1){if(void 0===Ae){var t=document.getElementById("nav");Ae=window.getComputedStyle(t).getPropertyValue("padding-right"),t.style.paddingRight=Ae?"calc(".concat(Ae," + ").concat(e,"px)"):"".concat(e,"px")}if(void 0===Be){var n=document.getElementById("app_bg_wrapper");Be=window.getComputedStyle(n).getPropertyValue("right"),n.style.right=Be?"calc(".concat(Be," + ").concat(e,"px)"):"".concat(e,"px")}document.body.classList.add("scroll-locked")}})},Ze=function(t){Xe.delete(t),setTimeout(function(){0===Xe.size&&(void 0!==Ae&&(document.getElementById("nav").style.paddingRight=Ae,Ae=void 0),void 0!==Be&&(document.getElementById("app_bg_wrapper").style.right=Be,Be=void 0),document.body.classList.remove("scroll-locked"))}),Je.enableBodyScroll(t)},tn={inserted:function(t,e){e.value&&Qe(t)},componentUpdated:function(t,e){e.oldValue!==e.value&&(e.value?Qe(t):Ze(t))},unbind:function(t){Ze(t)}},en=n(140),nn=n.n(en),on=n(105),rn=n.n(on),sn=n(33),an=n(219),cn=n.n(an),ln=function(t,e){var n="retweet"===t.type?t.retweeted_status.id:t.id,i="retweet"===e.type?e.retweeted_status.id:e.id,o=Number(n),r=Number(i),s=!Number.isNaN(o),a=!Number.isNaN(r);return s&&a?o0||0!==this.timeline.flushMarker)},loadButtonString:function(){return 0!==this.timeline.flushMarker?this.$t("timeline.reload"):"".concat(this.$t("timeline.show_new")," (").concat(this.newStatusCount,")")},classes:function(){return{root:["timeline"].concat(this.embedded?[]:["panel","panel-default"]),header:["timeline-heading"].concat(this.embedded?[]:["panel-heading"]),body:["timeline-body"].concat(this.embedded?[]:["panel-body"]),footer:["timeline-footer"].concat(this.embedded?[]:["panel-footer"])}},excludedStatusIdsObject:function(){var t=function(t,e){var n=[];if(e&&e.length>0){var i=!0,o=!1,r=void 0;try{for(var s,a=t[Symbol.iterator]();!(i=(s=a.next()).done);i=!0){var c=s.value;if(!e.includes(c.id))break;n.push(c.id)}}catch(t){o=!0,r=t}finally{try{i||null==a.return||a.return()}finally{if(o)throw r}}}return n}(this.timeline.visibleStatuses,this.pinnedStatusIds);return nn()(t)},pinnedStatusIdsObject:function(){return nn()(this.pinnedStatusIds)}},created:function(){var t=this.$store,e=t.state.users.currentUser.credentials,n=0===this.timeline.visibleStatuses.length;if(window.addEventListener("scroll",this.scrollLoad),t.state.api.fetchers[this.timelineName])return!1;bt.fetchAndUpdate({store:t,credentials:e,timeline:this.timelineName,showImmediately:n,userId:this.userId,tag:this.tag})},mounted:function(){void 0!==document.hidden&&(document.addEventListener("visibilitychange",this.handleVisibilityChange,!1),this.unfocused=document.hidden),window.addEventListener("keydown",this.handleShortKey)},destroyed:function(){window.removeEventListener("scroll",this.scrollLoad),window.removeEventListener("keydown",this.handleShortKey),void 0!==document.hidden&&document.removeEventListener("visibilitychange",this.handleVisibilityChange,!1),this.$store.commit("setLoading",{timeline:this.timelineName,value:!1})},methods:{handleShortKey:function(t){["textarea","input"].includes(t.target.tagName.toLowerCase())||"."===t.key&&this.showNewStatuses()},showNewStatuses:function(){0!==this.timeline.flushMarker?(this.$store.commit("clearTimeline",{timeline:this.timelineName,excludeUserId:!0}),this.$store.commit("queueFlush",{timeline:this.timelineName,id:0}),this.fetchOlderStatuses()):(this.$store.commit("showNewStatuses",{timeline:this.timelineName}),this.paused=!1)},fetchOlderStatuses:rn()(function(){var t=this,e=this.$store,n=e.state.users.currentUser.credentials;e.commit("setLoading",{timeline:this.timelineName,value:!0}),bt.fetchAndUpdate({store:e,credentials:n,timeline:this.timelineName,older:!0,showImmediately:!0,userId:this.userId,tag:this.tag}).then(function(n){var i=n.statuses;e.commit("setLoading",{timeline:t.timelineName,value:!1}),i&&0===i.length&&(t.bottomedOut=!0)})},1e3,void 0),scrollLoad:function(t){var e=document.body.getBoundingClientRect(),n=Math.max(e.height,-e.y);!1===this.timeline.loading&&this.$el.offsetHeight>0&&window.innerHeight+window.pageYOffset>=n-750&&this.fetchOlderStatuses()},handleVisibilityChange:function(){this.unfocused=document.hidden}},watch:{newStatusCount:function(t){if(this.$store.getters.mergedConfig.streaming&&t>0){var e=document.documentElement;!((window.pageYOffset||e.scrollTop)-(e.clientTop||0)<15)||this.paused||this.unfocused&&this.$store.getters.mergedConfig.pauseOnUnfocused?this.paused=!0:this.showNewStatuses()}}}};var _n=function(t){n(368)},xn=Object(dn.a)(wn,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{class:[t.classes.root,"timeline"]},[n("div",{class:t.classes.header},[t.embedded?t._e():n("TimelineMenu"),t._v(" "),t.timelineError?n("div",{staticClass:"loadmore-error alert error",on:{click:function(t){t.preventDefault()}}},[t._v("\n "+t._s(t.$t("timeline.error_fetching"))+"\n ")]):t.errorData?n("div",{staticClass:"loadmore-error alert error",on:{click:function(t){t.preventDefault()}}},[t._v("\n "+t._s(t.errorData.statusText)+"\n ")]):t.showLoadButton?n("button",{staticClass:"loadmore-button",on:{click:function(e){return e.preventDefault(),t.showNewStatuses(e)}}},[t._v("\n "+t._s(t.loadButtonString)+"\n ")]):n("div",{staticClass:"loadmore-text faint",on:{click:function(t){t.preventDefault()}}},[t._v("\n "+t._s(t.$t("timeline.up_to_date"))+"\n ")])],1),t._v(" "),n("div",{class:t.classes.body},[n("div",{staticClass:"timeline"},[t._l(t.pinnedStatusIds,function(e){return[t.timeline.statusesObject[e]?n("conversation",{key:e+"-pinned",staticClass:"status-fadein",attrs:{"status-id":e,collapsable:!0,"pinned-status-ids-object":t.pinnedStatusIdsObject,"in-profile":t.inProfile,"profile-user-id":t.userId}}):t._e()]}),t._v(" "),t._l(t.timeline.visibleStatuses,function(e){return[t.excludedStatusIdsObject[e.id]?t._e():n("conversation",{key:e.id,staticClass:"status-fadein",attrs:{"status-id":e.id,collapsable:!0,"in-profile":t.inProfile,"profile-user-id":t.userId}})]})],2)]),t._v(" "),n("div",{class:t.classes.footer},[0===t.count?n("div",{staticClass:"new-status-notification text-center panel-footer faint"},[t._v("\n "+t._s(t.$t("timeline.no_statuses"))+"\n ")]):t.bottomedOut?n("div",{staticClass:"new-status-notification text-center panel-footer faint"},[t._v("\n "+t._s(t.$t("timeline.no_more_statuses"))+"\n ")]):t.timeline.loading||t.errorData?t.errorData?n("a",{attrs:{href:"#"}},[n("div",{staticClass:"new-status-notification text-center panel-footer"},[t._v(t._s(t.errorData.error))])]):n("div",{staticClass:"new-status-notification text-center panel-footer"},[n("i",{staticClass:"icon-spin3 animate-spin"})]):n("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.fetchOlderStatuses()}}},[n("div",{staticClass:"new-status-notification text-center panel-footer"},[t._v(t._s(t.$t("timeline.load_older")))])])])])},[],!1,_n,null,null).exports,yn={components:{Timeline:xn},computed:{timeline:function(){return this.$store.state.statuses.timelines.public}},created:function(){this.$store.dispatch("startFetchingTimeline",{timeline:"public"})},destroyed:function(){this.$store.dispatch("stopFetchingTimeline","public")}},kn=Object(dn.a)(yn,function(){var t=this.$createElement;return(this._self._c||t)("Timeline",{attrs:{title:this.$t("nav.public_tl"),timeline:this.timeline,"timeline-name":"public"}})},[],!1,null,null,null).exports,Cn={components:{Timeline:xn},computed:{timeline:function(){return this.$store.state.statuses.timelines.publicAndExternal}},created:function(){this.$store.dispatch("startFetchingTimeline",{timeline:"publicAndExternal"})},destroyed:function(){this.$store.dispatch("stopFetchingTimeline","publicAndExternal")}},Sn=Object(dn.a)(Cn,function(){var t=this.$createElement;return(this._self._c||t)("Timeline",{attrs:{title:this.$t("nav.twkn"),timeline:this.timeline,"timeline-name":"publicAndExternal"}})},[],!1,null,null,null).exports,jn={components:{Timeline:xn},computed:{timeline:function(){return this.$store.state.statuses.timelines.friends}}},On=Object(dn.a)(jn,function(){var t=this.$createElement;return(this._self._c||t)("Timeline",{attrs:{title:this.$t("nav.timeline"),timeline:this.timeline,"timeline-name":"friends"}})},[],!1,null,null,null).exports,Pn={created:function(){this.$store.commit("clearTimeline",{timeline:"tag"}),this.$store.dispatch("startFetchingTimeline",{timeline:"tag",tag:this.tag})},components:{Timeline:xn},computed:{tag:function(){return this.$route.params.tag},timeline:function(){return this.$store.state.statuses.timelines.tag}},watch:{tag:function(){this.$store.commit("clearTimeline",{timeline:"tag"}),this.$store.dispatch("startFetchingTimeline",{timeline:"tag",tag:this.tag})}},destroyed:function(){this.$store.dispatch("stopFetchingTimeline","tag")}},$n=Object(dn.a)(Pn,function(){var t=this.$createElement;return(this._self._c||t)("Timeline",{attrs:{title:this.tag,timeline:this.timeline,"timeline-name":"tag",tag:this.tag}})},[],!1,null,null,null).exports,Tn={computed:{timeline:function(){return this.$store.state.statuses.timelines.bookmarks}},components:{Timeline:xn},destroyed:function(){this.$store.commit("clearTimeline",{timeline:"bookmarks"})}},In=Object(dn.a)(Tn,function(){var t=this.$createElement;return(this._self._c||t)("Timeline",{attrs:{title:this.$t("nav.bookmarks"),timeline:this.timeline,"timeline-name":"bookmarks"}})},[],!1,null,null,null).exports,En={components:{Conversation:fn},computed:{statusId:function(){return this.$route.params.id}}},Mn=Object(dn.a)(En,function(){var t=this.$createElement;return(this._self._c||t)("conversation",{attrs:{collapsable:!1,"is-page":"true","status-id":this.statusId}})},[],!1,null,null,null).exports,Un=n(34),Fn=n(18),Dn=n(28),Ln=n(44),Nn=n(46),Rn=n(17);function An(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var Bn={data:function(){return{userExpanded:!1,betterShadow:this.$store.state.interface.browserSupport.cssFilter,unmuted:!1}},props:["notification"],components:{StatusContent:Un.a,UserAvatar:Fn.default,UserCard:Dn.a,Timeago:Ln.a,Status:sn.default},methods:{toggleUserExpanded:function(){this.userExpanded=!this.userExpanded},generateUserProfileLink:function(t){return Object(Rn.a)(t.id,t.screen_name,this.$store.state.instance.restrictedNicknames)},getUser:function(t){return this.$store.state.users.usersObject[t.from_profile.id]},toggleMute:function(){this.unmuted=!this.unmuted},approveUser:function(){this.$store.state.api.backendInteractor.approveUser({id:this.user.id}),this.$store.dispatch("removeFollowRequest",this.user),this.$store.dispatch("markSingleNotificationAsSeen",{id:this.notification.id}),this.$store.dispatch("updateNotification",{id:this.notification.id,updater:function(t){t.type="follow"}})},denyUser:function(){var t=this;this.$store.state.api.backendInteractor.denyUser({id:this.user.id}).then(function(){t.$store.dispatch("dismissNotificationLocal",{id:t.notification.id}),t.$store.dispatch("removeFollowRequest",t.user)})}},computed:function(t){for(var e=1;e0?this.$store.dispatch("setPageTitle","(".concat(t,")")):this.$store.dispatch("setPageTitle","")}},methods:{markAsSeen:function(){this.$store.dispatch("markNotificationsAsSeen"),this.seenToDisplayCount=30},fetchOlderNotifications:function(){var t=this;if(!this.loading){var e=this.filteredNotifications.length-this.unseenCount;if(this.seenToDisplayCounte&&(this.seenToDisplayCount=e);var n=this.$store,i=n.state.users.currentUser.credentials;n.commit("setNotificationsLoading",{value:!0}),xt.fetchAndUpdate({store:n,credentials:i,older:!0}).then(function(e){n.commit("setNotificationsLoading",{value:!1}),0===e.length&&(t.bottomedOut=!0),t.seenToDisplayCount+=e.length})}}}}};var Vn=function(t){n(451)},Gn=Object(dn.a)(Wn,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"notifications",class:{minimal:t.minimalMode}},[n("div",{class:t.mainClass},[t.noHeading?t._e():n("div",{staticClass:"panel-heading"},[n("div",{staticClass:"title"},[t._v("\n "+t._s(t.$t("notifications.notifications"))+"\n "),t.unseenCount?n("span",{staticClass:"badge badge-notification unseen-count"},[t._v(t._s(t.unseenCount))]):t._e()]),t._v(" "),t.error?n("div",{staticClass:"loadmore-error alert error",on:{click:function(t){t.preventDefault()}}},[t._v("\n "+t._s(t.$t("timeline.error_fetching"))+"\n ")]):t._e(),t._v(" "),t.unseenCount?n("button",{staticClass:"read-button",on:{click:function(e){return e.preventDefault(),t.markAsSeen(e)}}},[t._v("\n "+t._s(t.$t("notifications.read"))+"\n ")]):t._e()]),t._v(" "),n("div",{staticClass:"panel-body"},t._l(t.notificationsToDisplay,function(e){return n("div",{key:e.id,staticClass:"notification",class:{unseen:!t.minimalMode&&!e.seen}},[n("div",{staticClass:"notification-overlay"}),t._v(" "),n("notification",{attrs:{notification:e}})],1)}),0),t._v(" "),n("div",{staticClass:"panel-footer"},[t.bottomedOut?n("div",{staticClass:"new-status-notification text-center panel-footer faint"},[t._v("\n "+t._s(t.$t("notifications.no_more_notifications"))+"\n ")]):t.loading?n("div",{staticClass:"new-status-notification text-center panel-footer"},[n("i",{staticClass:"icon-spin3 animate-spin"})]):n("a",{attrs:{href:"#"},on:{click:function(e){return e.preventDefault(),t.fetchOlderNotifications()}}},[n("div",{staticClass:"new-status-notification text-center panel-footer"},[t._v("\n "+t._s(t.minimalMode?t.$t("interactions.load_older"):t.$t("notifications.load_older"))+"\n ")])])])])])},[],!1,Vn,null,null).exports,Kn={mentions:["mention"],"likes+repeats":["repeat","like"],follows:["follow"],moves:["move"]},Yn={data:function(){return{allowFollowingMove:this.$store.state.users.currentUser.allow_following_move,filterMode:Kn.mentions}},methods:{onModeSwitch:function(t){this.filterMode=Kn[t]}},components:{Notifications:Gn}},Jn=Object(dn.a)(Yn,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"panel panel-default"},[n("div",{staticClass:"panel-heading"},[n("div",{staticClass:"title"},[t._v("\n "+t._s(t.$t("nav.interactions"))+"\n ")])]),t._v(" "),n("tab-switcher",{ref:"tabSwitcher",attrs:{"on-switch":t.onModeSwitch}},[n("span",{key:"mentions",attrs:{label:t.$t("nav.mentions")}}),t._v(" "),n("span",{key:"likes+repeats",attrs:{label:t.$t("interactions.favs_repeats")}}),t._v(" "),n("span",{key:"follows",attrs:{label:t.$t("interactions.follows")}}),t._v(" "),t.allowFollowingMove?t._e():n("span",{key:"moves",attrs:{label:t.$t("interactions.moves")}})]),t._v(" "),n("Notifications",{ref:"notifications",attrs:{"no-heading":!0,"minimal-mode":!0,"filter-mode":t.filterMode}})],1)},[],!1,null,null,null).exports,Xn={computed:{timeline:function(){return this.$store.state.statuses.timelines.dms}},components:{Timeline:xn}},Qn=Object(dn.a)(Xn,function(){var t=this.$createElement;return(this._self._c||t)("Timeline",{attrs:{title:this.$t("nav.dms"),timeline:this.timeline,"timeline-name":"dms"}})},[],!1,null,null,null).exports,Zn=n(114),ti=s.a.component("chat-title",{name:"ChatTitle",components:{UserAvatar:Fn.default},props:["user","withAvatar"],computed:{title:function(){return this.user?this.user.screen_name:""},htmlTitle:function(){return this.user?this.user.name_html:""}},methods:{getUserProfileLink:function(t){return Object(Rn.a)(t.id,t.screen_name)}}});var ei=function(t){n(459)},ni=Object(dn.a)(ti,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"chat-title",attrs:{title:t.title}},[t.withAvatar&&t.user?n("router-link",{attrs:{to:t.getUserProfileLink(t.user)}},[n("UserAvatar",{attrs:{user:t.user,width:"23px",height:"23px"}})],1):t._e(),t._v(" "),n("span",{staticClass:"username",domProps:{innerHTML:t._s(t.htmlTitle)}})],1)},[],!1,ei,null,null).exports;function ii(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var oi={name:"ChatListItem",props:["chat"],components:{UserAvatar:Fn.default,AvatarList:Zn.a,Timeago:Ln.a,ChatTitle:ni,StatusContent:Un.a},computed:function(t){for(var e=1;e".concat(this.$t("chats.you")," ").concat(n):n;return{summary:"",statusnet_html:i,text:i,attachments:[]}}}),methods:{openChat:function(t){this.chat.id&&this.$router.push({name:"chat",params:{username:this.currentUser.screen_name,recipient_id:this.chat.account.id}})}}};var ri=function(t){n(457)},si=Object(dn.a)(oi,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"chat-list-item",on:{"!click":function(e){return e.preventDefault(),t.openChat(e)}}},[n("div",{staticClass:"chat-list-item-left"},[n("UserAvatar",{attrs:{user:t.chat.account,height:"48px",width:"48px"}})],1),t._v(" "),n("div",{staticClass:"chat-list-item-center"},[n("div",{staticClass:"heading"},[t.chat.account?n("span",{staticClass:"name-and-account-name"},[n("ChatTitle",{attrs:{user:t.chat.account}})],1):t._e(),t._v(" "),n("span",{staticClass:"heading-right"})]),t._v(" "),n("div",{staticClass:"chat-preview"},[n("StatusContent",{attrs:{status:t.messageForStatusContent,"single-line":!0}}),t._v(" "),t.chat.unread>0?n("div",{staticClass:"badge badge-notification unread-chat-count"},[t._v("\n "+t._s(t.chat.unread)+"\n ")]):t._e()],1)]),t._v(" "),n("div",{staticClass:"time-wrapper"},[n("Timeago",{attrs:{time:t.chat.updated_at,"auto-update":60}})],1)])},[],!1,ri,null,null).exports,ai=n(38);function ci(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var li={components:{BasicUserCard:ai.a,UserAvatar:Fn.default},data:function(){return{suggestions:[],userIds:[],loading:!1,query:""}},created:function(){var t,e=this;return o.a.async(function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,o.a.awrap(this.backendInteractor.chats());case 2:t=n.sent,t.chats.forEach(function(t){return e.suggestions.push(t.account)});case 5:case"end":return n.stop()}},null,this)},computed:function(t){for(var e=1;e0?n("div",{staticClass:"timeline"},[n("List",{attrs:{items:t.sortedChatList},scopedSlots:t._u([{key:"item",fn:function(t){var e=t.item;return[n("ChatListItem",{key:e.id,attrs:{compact:!1,chat:e}})]}}],null,!1,1412157271)})],1):n("div",{staticClass:"emtpy-chat-list-alert"},[n("span",[t._v(t._s(t.$t("chats.empty_chat_list_placeholder")))])])])])},[],!1,mi,null,null).exports,vi=n(43),bi=n(111),wi=n(112),_i={name:"Timeago",props:["date"],computed:{displayDate:function(){var t=new Date;return t.setHours(0,0,0,0),this.date.getTime()===t.getTime()?this.$t("display_date.today"):this.date.toLocaleDateString("en",{day:"numeric",month:"long"})}}},xi=Object(dn.a)(_i,function(){var t=this.$createElement;return(this._self._c||t)("time",[this._v("\n "+this._s(this.displayDate)+"\n")])},[],!1,null,null,null).exports;function yi(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var ki={name:"ChatMessage",props:["author","edited","noHeading","chatViewItem","hoveredMessageChain"],components:{Popover:hn.default,Attachment:vi.a,StatusContent:Un.a,UserAvatar:Fn.default,Gallery:bi.a,LinkPreview:wi.a,ChatMessageDate:xi},computed:function(t){for(var e=1;e0}},Object(c.e)({betterShadow:function(t){return t.interface.browserSupport.cssFilter},currentUser:function(t){return t.users.currentUser},restrictedNicknames:function(t){return t.instance.restrictedNicknames}}),{popoverMarginStyle:function(){return this.isCurrentUser?{}:{left:50}}},Object(c.c)(["mergedConfig","findUser"])),data:function(){return{hovered:!1,menuOpened:!1}},methods:{onHover:function(t){this.$emit("hover",{isHovered:t,messageChainId:this.chatViewItem.messageChainId})},deleteMessage:function(){return o.a.async(function(t){for(;;)switch(t.prev=t.next){case 0:if(!window.confirm(this.$t("chats.delete_confirm"))){t.next=4;break}return t.next=4,o.a.awrap(this.$store.dispatch("deleteChatMessage",{messageId:this.chatViewItem.data.id,chatId:this.chatViewItem.data.chat_id}));case 4:this.hovered=!1,this.menuOpened=!1;case 6:case"end":return t.stop()}},null,this)}}};var Ci=function(t){n(469)},Si=Object(dn.a)(ki,function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.isMessage?n("div",{staticClass:"chat-message-wrapper",class:{"hovered-message-chain":t.hoveredMessageChain},on:{mouseover:function(e){return t.onHover(!0)},mouseleave:function(e){return t.onHover(!1)}}},[n("div",{staticClass:"chat-message",class:[{outgoing:t.isCurrentUser,incoming:!t.isCurrentUser}]},[t.isCurrentUser?t._e():n("div",{staticClass:"avatar-wrapper"},[t.chatViewItem.isHead?n("router-link",{attrs:{to:t.userProfileLink}},[n("UserAvatar",{attrs:{compact:!0,"better-shadow":t.betterShadow,user:t.author}})],1):t._e()],1),t._v(" "),n("div",{staticClass:"chat-message-inner"},[n("div",{staticClass:"status-body",style:{"min-width":t.message.attachment?"80%":""}},[n("div",{staticClass:"media status",class:{"without-attachment":!t.hasAttachment},staticStyle:{position:"relative"},on:{mouseenter:function(e){t.hovered=!0},mouseleave:function(e){t.hovered=!1}}},[n("div",{staticClass:"chat-message-menu",class:{visible:t.hovered||t.menuOpened}},[n("Popover",{attrs:{trigger:"click",placement:"top","bound-to-selector":t.isCurrentUser?"":".scrollable-message-list","bound-to":{x:"container"},margin:t.popoverMarginStyle},on:{show:function(e){t.menuOpened=!0},close:function(e){t.menuOpened=!1}}},[n("div",{attrs:{slot:"content"},slot:"content"},[n("div",{staticClass:"dropdown-menu"},[n("button",{staticClass:"dropdown-item dropdown-item-icon",on:{click:t.deleteMessage}},[n("i",{staticClass:"icon-cancel"}),t._v(" "+t._s(t.$t("chats.delete"))+"\n ")])])]),t._v(" "),n("button",{attrs:{slot:"trigger",title:t.$t("chats.more")},slot:"trigger"},[n("i",{staticClass:"icon-ellipsis"})])])],1),t._v(" "),n("StatusContent",{attrs:{status:t.messageForStatusContent,"full-content":!0}},[n("span",{staticClass:"created-at",attrs:{slot:"footer"},slot:"footer"},[t._v("\n "+t._s(t.createdAt)+"\n ")])])],1)])])])]):n("div",{staticClass:"chat-message-date-separator"},[n("ChatMessageDate",{attrs:{date:t.chatViewItem.date}})],1)},[],!1,Ci,null,null).exports,ji=n(42),Oi=function(t){return{scrollTop:t.scrollTop,scrollHeight:t.scrollHeight,offsetHeight:t.offsetHeight}};function Pi(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}function $i(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:{},n=e.expand,i=void 0!==n&&n,o=e.delayed;void 0!==o&&o?setTimeout(function(){t.handleResize($i({},e,{delayed:!1}))},100):this.$nextTick(function(){t.updateScrollableContainerHeight();var e=t.lastScrollPosition.offsetHeight,n=void 0===e?void 0:e;t.lastScrollPosition=Oi(t.$refs.scrollable);var o=t.lastScrollPosition.offsetHeight-n;(o<0||!t.bottomedOut()&&i)&&t.$nextTick(function(){t.updateScrollableContainerHeight(),t.$refs.scrollable.scrollTo({top:t.$refs.scrollable.scrollTop-o,left:0})})})},scrollDown:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.behavior,n=void 0===e?"auto":e,i=t.forceRead,o=void 0!==i&&i,r=this.$refs.scrollable;r&&(this.$nextTick(function(){r.scrollTo({top:r.scrollHeight,left:0,behavior:n})}),(o||this.newMessageCount>0)&&this.readChat())},readChat:function(){if(this.currentChatMessageService&&this.currentChatMessageService.lastMessage&&!document.hidden){var t=this.currentChatMessageService.lastMessage.id;this.$store.dispatch("readChat",{id:this.currentChat.id,lastReadId:t})}},bottomedOut:function(t){return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(t){var n=t.scrollTop+e;return t.scrollHeight-t.offsetHeight<=n}}(this.$refs.scrollable,t)},reachedTop:function(){var t=this.$refs.scrollable;return t&&t.scrollTop<=0},handleScroll:rn()(function(){this.currentChat&&(this.reachedTop()?this.fetchChat({maxId:this.currentChatMessageService.minId}):this.bottomedOut(150)?(this.jumpToBottomButtonVisible=!1,this.newMessageCount>0&&this.readChat()):this.jumpToBottomButtonVisible=!0)},100),handleScrollUp:function(t){var e,n,i=Oi(this.$refs.scrollable);this.$refs.scrollable.scrollTo({top:(e=t,n=i,e.scrollTop+(n.scrollHeight-e.scrollHeight)),left:0})},fetchChat:function(t){var e=this,n=t.isFirstFetch,i=void 0!==n&&n,o=t.fetchLatest,r=void 0!==o&&o,s=t.maxId,a=this.currentChatMessageService;if(a&&(!r||!this.streamingEnabled)){var c=a.chatId,l=!!s,u=r&&a.lastMessage&&a.lastMessage.id;this.backendInteractor.chatMessages({id:c,maxId:s,sinceId:u}).then(function(t){i&&we.clear(a);var n=Oi(e.$refs.scrollable);e.$store.dispatch("addChatMessages",{chatId:c,messages:t}).then(function(){e.$nextTick(function(){l&&e.handleScrollUp(n),i&&e.updateScrollableContainerHeight()})})})}},startFetching:function(){var t,e=this;return o.a.async(function(n){for(;;)switch(n.prev=n.next){case 0:if(t=this.findOpenedChatByRecipientId(this.recipientId)){n.next=12;break}return n.prev=2,n.next=5,o.a.awrap(this.backendInteractor.getOrCreateChat({accountId:this.recipientId}));case 5:t=n.sent,n.next=12;break;case 8:n.prev=8,n.t0=n.catch(2),console.error("Error creating or getting a chat",n.t0),this.errorLoadingChat=!0;case 12:t&&(this.$nextTick(function(){e.scrollDown({forceRead:!0})}),this.$store.dispatch("addOpenedChat",{chat:t}),this.doStartFetching());case 13:case"end":return n.stop()}},null,this,[[2,8]])},doStartFetching:function(){var t=this;this.$store.dispatch("startFetchingCurrentChat",{fetcher:function(){return setInterval(function(){return t.fetchChat({fetchLatest:!0})},5e3)}}),this.fetchChat({isFirstFetch:!0})},sendMessage:function(t){var e=this,n=t.status,i=t.media,o={id:this.currentChat.id,content:n};return i[0]&&(o.mediaId=i[0].id),this.backendInteractor.sendChatMessage(o).then(function(t){return e.$store.dispatch("addChatMessages",{chatId:e.currentChat.id,messages:[t]}).then(function(){e.$nextTick(function(){e.handleResize(),setTimeout(function(){e.updateScrollableContainerHeight()},100),e.scrollDown({forceRead:!0})})}),t}).catch(function(t){return console.error("Error sending message",t),{error:e.$t("chats.error_sending_message")}})},goBack:function(){this.$router.push({name:"chats",params:{username:this.currentUser.screen_name}})}}};var Ii=function(t){n(467)},Ei=Object(dn.a)(Ti,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"chat-view"},[n("div",{staticClass:"chat-view-inner"},[n("div",{ref:"inner",staticClass:"panel-default panel chat-view-body",attrs:{id:"nav"}},[n("div",{ref:"header",staticClass:"panel-heading chat-view-heading mobile-hidden"},[n("a",{staticClass:"go-back-button",on:{click:t.goBack}},[n("i",{staticClass:"button-icon icon-left-open"})]),t._v(" "),n("div",{staticClass:"title text-center"},[n("ChatTitle",{attrs:{user:t.recipient,"with-avatar":!0}})],1)]),t._v(" "),[n("div",{ref:"scrollable",staticClass:"scrollable-message-list",style:{height:t.scrollableContainerHeight},on:{scroll:t.handleScroll}},[t.errorLoadingChat?n("div",{staticClass:"chat-loading-error"},[n("div",{staticClass:"alert error"},[t._v("\n "+t._s(t.$t("chats.error_loading_chat"))+"\n ")])]):t._l(t.chatViewItems,function(e){return n("ChatMessage",{key:e.id,attrs:{author:t.recipient,"chat-view-item":e,"hovered-message-chain":e.messageChainId===t.hoveredMessageChainId},on:{hover:t.onMessageHover}})})],2),t._v(" "),n("div",{ref:"footer",staticClass:"panel-body footer"},[n("div",{staticClass:"jump-to-bottom-button",class:{visible:t.jumpToBottomButtonVisible},on:{click:function(e){return t.scrollDown({behavior:"smooth"})}}},[n("i",{staticClass:"icon-down-open"},[t.newMessageCount?n("div",{staticClass:"badge badge-notification unread-chat-count unread-message-count"},[t._v("\n "+t._s(t.newMessageCount)+"\n ")]):t._e()])]),t._v(" "),n("PostStatusForm",{attrs:{"disable-subject":!0,"disable-scope-selector":!0,"disable-notice":!0,"disable-lock-warning":!0,"disable-polls":!0,"disable-sensitivity-checkbox":!0,"disable-submit":t.errorLoadingChat||!t.currentChat,"disable-preview":!0,"post-handler":t.sendMessage,"submit-on-enter":!t.mobileLayout,"preserve-focus":!t.mobileLayout,"auto-focus":!t.mobileLayout,placeholder:t.formPlaceholder,"file-limit":1,"max-height":"160","emoji-picker-placement":"top"},on:{resize:t.handleResize}})],1)]],2)])])},[],!1,Ii,null,null).exports,Mi=n(113),Ui=n(109),Fi={props:["user","noFollowsYou"],components:{BasicUserCard:ai.a,RemoteFollow:Mi.a,FollowButton:Ui.a},computed:{isMe:function(){return this.$store.state.users.currentUser.id===this.user.id},loggedIn:function(){return this.$store.state.users.currentUser},relationship:function(){return this.$store.getters.relationship(this.user.id)}}};var Di=function(t){n(473)},Li=Object(dn.a)(Fi,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("basic-user-card",{attrs:{user:t.user}},[n("div",{staticClass:"follow-card-content-container"},[t.isMe||!t.noFollowsYou&&t.relationship.followed_by?n("span",{staticClass:"faint"},[t._v("\n "+t._s(t.isMe?t.$t("user_card.its_you"):t.$t("user_card.follows_you"))+"\n ")]):t._e(),t._v(" "),t.loggedIn?t.isMe?t._e():[n("FollowButton",{staticClass:"follow-card-follow-button",attrs:{relationship:t.relationship,"label-following":t.$t("user_card.follow_unfollow")}})]:[t.relationship.following?t._e():n("div",{staticClass:"follow-card-follow-button"},[n("RemoteFollow",{attrs:{user:t.user}})],1)]],2)])},[],!1,Di,null,null).exports,Ni=n(141),Ri=n(190),Ai=n.n(Ri),Bi=n(191),zi=n.n(Bi),Hi=n(192);n(476);function qi(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}function Wi(t){for(var e=1;e0&&window.innerHeight+window.pageYOffset>=n-750&&this.fetchEntries()}},render:function(e){var n={props:Wi({},this.$props,h()({},r,this.entries)),on:this.$listeners,scopedSlots:this.$scopedSlots},i=Object.entries(this.$slots).map(function(t){var n=g()(t,2),i=n[0],o=n[1];return e("template",{slot:i},o)});return e("div",{class:"with-load-more"},[e(t,Ai()([{},n]),[i]),e("div",{class:"with-load-more-footer"},[this.error&&e("a",{on:{click:this.fetchEntries},class:"alert error"},[this.$t("general.generic_error")]),!this.error&&this.loading&&e("i",{class:"icon-spin3 animate-spin"}),!this.error&&!this.loading&&!this.bottomedOut&&e("a",{on:{click:this.fetchEntries}},[this.$t("general.more")])])])}})}},Gi=Vi({fetch:function(t,e){return e.dispatch("fetchFollowers",t.userId)},select:function(t,e){return Ie()(e.getters.findUser(t.userId),"followerIds",[]).map(function(t){return e.getters.findUser(t)})},destroy:function(t,e){return e.dispatch("clearFollowers",t.userId)},childPropName:"items",additionalPropNames:["userId"]})(pi.a),Ki=Vi({fetch:function(t,e){return e.dispatch("fetchFriends",t.userId)},select:function(t,e){return Ie()(e.getters.findUser(t.userId),"friendIds",[]).map(function(t){return e.getters.findUser(t)})},destroy:function(t,e){return e.dispatch("clearFriends",t.userId)},childPropName:"items",additionalPropNames:["userId"]})(pi.a),Yi={data:function(){return{error:!1,userId:null,tab:"statuses"}},created:function(){var t=this.$route.params;this.load(t.name||t.id),this.tab=Ie()(this.$route,"query.tab","statuses")},destroyed:function(){this.stopFetching()},computed:{timeline:function(){return this.$store.state.statuses.timelines.user},favorites:function(){return this.$store.state.statuses.timelines.favorites},media:function(){return this.$store.state.statuses.timelines.media},isUs:function(){return this.userId&&this.$store.state.users.currentUser.id&&this.userId===this.$store.state.users.currentUser.id},user:function(){return this.$store.getters.findUser(this.userId)},isExternal:function(){return"external-user-profile"===this.$route.name},followsTabVisible:function(){return this.isUs||!this.user.hide_follows},followersTabVisible:function(){return this.isUs||!this.user.hide_followers}},methods:{load:function(t){var e=this,n=function(t,n){n!==e.$store.state.statuses.timelines[t].userId&&e.$store.commit("clearTimeline",{timeline:t}),e.$store.dispatch("startFetchingTimeline",{timeline:t,userId:n})},i=function(t){e.userId=t,n("user",t),n("media",t),e.isUs&&n("favorites",t),e.$store.dispatch("fetchPinnedStatuses",t)};this.userId=null,this.error=!1;var o=this.$store.getters.findUser(t);o?i(o.id):this.$store.dispatch("fetchUser",t).then(function(t){var e=t.id;return i(e)}).catch(function(t){var n=Ie()(t,"error.error");e.error="No user with such user_id"===n?e.$t("user_profile.profile_does_not_exist"):n||e.$t("user_profile.profile_loading_error")})},stopFetching:function(){this.$store.dispatch("stopFetchingTimeline","user"),this.$store.dispatch("stopFetchingTimeline","favorites"),this.$store.dispatch("stopFetchingTimeline","media")},switchUser:function(t){this.stopFetching(),this.load(t)},onTabSwitch:function(t){this.tab=t,this.$router.replace({query:{tab:t}})},linkClicked:function(t){var e=t.target;"SPAN"===e.tagName&&(e=e.parentNode),"A"===e.tagName&&window.open(e.href,"_blank")}},watch:{"$route.params.id":function(t){t&&this.switchUser(t)},"$route.params.name":function(t){t&&this.switchUser(t)},"$route.query":function(t){this.tab=t.tab||"statuses"}},components:{UserCard:Dn.a,Timeline:xn,FollowerList:Gi,FriendList:Ki,FollowCard:Li,TabSwitcher:Ni.a,Conversation:fn}};var Ji=function(t){n(471)},Xi=Object(dn.a)(Yi,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[t.user?n("div",{staticClass:"user-profile panel panel-default"},[n("UserCard",{attrs:{"user-id":t.userId,switcher:!0,selected:t.timeline.viewing,"allow-zooming-avatar":!0,rounded:"top"}}),t._v(" "),t.user.fields_html&&t.user.fields_html.length>0?n("div",{staticClass:"user-profile-fields"},t._l(t.user.fields_html,function(e,i){return n("dl",{key:i,staticClass:"user-profile-field"},[n("dt",{staticClass:"user-profile-field-name",attrs:{title:t.user.fields_text[i].name},on:{click:function(e){return e.preventDefault(),t.linkClicked(e)}}},[t._v("\n "+t._s(e.name)+"\n ")]),t._v(" "),n("dd",{staticClass:"user-profile-field-value",attrs:{title:t.user.fields_text[i].value},domProps:{innerHTML:t._s(e.value)},on:{click:function(e){return e.preventDefault(),t.linkClicked(e)}}})])}),0):t._e(),t._v(" "),n("tab-switcher",{attrs:{"active-tab":t.tab,"render-only-focused":!0,"on-switch":t.onTabSwitch}},[n("Timeline",{key:"statuses",attrs:{label:t.$t("user_card.statuses"),count:t.user.statuses_count,embedded:!0,title:t.$t("user_profile.timeline_title"),timeline:t.timeline,"timeline-name":"user","user-id":t.userId,"pinned-status-ids":t.user.pinnedStatusIds,"in-profile":!0}}),t._v(" "),t.followsTabVisible?n("div",{key:"followees",attrs:{label:t.$t("user_card.followees"),disabled:!t.user.friends_count}},[n("FriendList",{attrs:{"user-id":t.userId},scopedSlots:t._u([{key:"item",fn:function(t){var e=t.item;return[n("FollowCard",{attrs:{user:e}})]}}],null,!1,676117295)})],1):t._e(),t._v(" "),t.followersTabVisible?n("div",{key:"followers",attrs:{label:t.$t("user_card.followers"),disabled:!t.user.followers_count}},[n("FollowerList",{attrs:{"user-id":t.userId},scopedSlots:t._u([{key:"item",fn:function(e){var i=e.item;return[n("FollowCard",{attrs:{user:i,"no-follows-you":t.isUs}})]}}],null,!1,3839341157)})],1):t._e(),t._v(" "),n("Timeline",{key:"media",attrs:{label:t.$t("user_card.media"),disabled:!t.media.visibleStatuses.length,embedded:!0,title:t.$t("user_card.media"),"timeline-name":"media",timeline:t.media,"user-id":t.userId,"in-profile":!0}}),t._v(" "),t.isUs?n("Timeline",{key:"favorites",attrs:{label:t.$t("user_card.favorites"),disabled:!t.favorites.visibleStatuses.length,embedded:!0,title:t.$t("user_card.favorites"),"timeline-name":"favorites",timeline:t.favorites,"in-profile":!0}}):t._e()],1)],1):n("div",{staticClass:"panel user-profile-placeholder"},[n("div",{staticClass:"panel-heading"},[n("div",{staticClass:"title"},[t._v("\n "+t._s(t.$t("settings.profile_tab"))+"\n ")])]),t._v(" "),n("div",{staticClass:"panel-body"},[t.error?n("span",[t._v(t._s(t.error))]):n("i",{staticClass:"icon-spin3 animate-spin"})])])])},[],!1,Ji,null,null).exports,Qi={components:{FollowCard:Li,Conversation:fn,Status:sn.default},props:["query"],data:function(){return{loaded:!1,loading:!1,searchTerm:this.query||"",userIds:[],statuses:[],hashtags:[],currenResultTab:"statuses"}},computed:{users:function(){var t=this;return this.userIds.map(function(e){return t.$store.getters.findUser(e)})},visibleStatuses:function(){var t=this.$store.state.statuses.allStatusesObject;return this.statuses.filter(function(e){return t[e.id]&&!t[e.id].deleted})}},mounted:function(){this.search(this.query)},watch:{query:function(t){this.searchTerm=t,this.search(t)}},methods:{newQuery:function(t){this.$router.push({name:"search",query:{query:t}}),this.$refs.searchInput.focus()},search:function(t){var e=this;t?(this.loading=!0,this.userIds=[],this.statuses=[],this.hashtags=[],this.$refs.searchInput.blur(),this.$store.dispatch("search",{q:t,resolve:!0}).then(function(t){e.loading=!1,e.userIds=pt()(t.accounts,"id"),e.statuses=t.statuses,e.hashtags=t.hashtags,e.currenResultTab=e.getActiveTab(),e.loaded=!0})):this.loading=!1},resultCount:function(t){var e=this[t].length;return 0===e?"":" (".concat(e,")")},onResultTabSwitch:function(t){this.currenResultTab=t},getActiveTab:function(){return this.visibleStatuses.length>0?"statuses":this.users.length>0?"people":this.hashtags.length>0?"hashtags":"statuses"},lastHistoryRecord:function(t){return t.history&&t.history[0]}}};var Zi=function(t){n(477)},to=Object(dn.a)(Qi,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"panel panel-default"},[n("div",{staticClass:"panel-heading"},[n("div",{staticClass:"title"},[t._v("\n "+t._s(t.$t("nav.search"))+"\n ")])]),t._v(" "),n("div",{staticClass:"search-input-container"},[n("input",{directives:[{name:"model",rawName:"v-model",value:t.searchTerm,expression:"searchTerm"}],ref:"searchInput",staticClass:"search-input",attrs:{placeholder:t.$t("nav.search")},domProps:{value:t.searchTerm},on:{keyup:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.newQuery(t.searchTerm)},input:function(e){e.target.composing||(t.searchTerm=e.target.value)}}}),t._v(" "),n("button",{staticClass:"btn search-button",on:{click:function(e){return t.newQuery(t.searchTerm)}}},[n("i",{staticClass:"icon-search"})])]),t._v(" "),t.loading?n("div",{staticClass:"text-center loading-icon"},[n("i",{staticClass:"icon-spin3 animate-spin"})]):t.loaded?n("div",[n("div",{staticClass:"search-nav-heading"},[n("tab-switcher",{ref:"tabSwitcher",attrs:{"on-switch":t.onResultTabSwitch,"active-tab":t.currenResultTab}},[n("span",{key:"statuses",attrs:{label:t.$t("user_card.statuses")+t.resultCount("visibleStatuses")}}),t._v(" "),n("span",{key:"people",attrs:{label:t.$t("search.people")+t.resultCount("users")}}),t._v(" "),n("span",{key:"hashtags",attrs:{label:t.$t("search.hashtags")+t.resultCount("hashtags")}})])],1)]):t._e(),t._v(" "),n("div",{staticClass:"panel-body"},["statuses"===t.currenResultTab?n("div",[0===t.visibleStatuses.length&&!t.loading&&t.loaded?n("div",{staticClass:"search-result-heading"},[n("h4",[t._v(t._s(t.$t("search.no_results")))])]):t._e(),t._v(" "),t._l(t.visibleStatuses,function(t){return n("Status",{key:t.id,staticClass:"search-result",attrs:{collapsable:!1,expandable:!1,compact:!1,statusoid:t,"no-heading":!1}})})],2):"people"===t.currenResultTab?n("div",[0===t.users.length&&!t.loading&&t.loaded?n("div",{staticClass:"search-result-heading"},[n("h4",[t._v(t._s(t.$t("search.no_results")))])]):t._e(),t._v(" "),t._l(t.users,function(t){return n("FollowCard",{key:t.id,staticClass:"list-item search-result",attrs:{user:t}})})],2):"hashtags"===t.currenResultTab?n("div",[0===t.hashtags.length&&!t.loading&&t.loaded?n("div",{staticClass:"search-result-heading"},[n("h4",[t._v(t._s(t.$t("search.no_results")))])]):t._e(),t._v(" "),t._l(t.hashtags,function(e){return n("div",{key:e.url,staticClass:"status trend search-result"},[n("div",{staticClass:"hashtag"},[n("router-link",{attrs:{to:{name:"tag-timeline",params:{tag:e.name}}}},[t._v("\n #"+t._s(e.name)+"\n ")]),t._v(" "),t.lastHistoryRecord(e)?n("div",[1==t.lastHistoryRecord(e).accounts?n("span",[t._v("\n "+t._s(t.$t("search.person_talking",{count:t.lastHistoryRecord(e).accounts}))+"\n ")]):n("span",[t._v("\n "+t._s(t.$t("search.people_talking",{count:t.lastHistoryRecord(e).accounts}))+"\n ")])]):t._e()],1),t._v(" "),t.lastHistoryRecord(e)?n("div",{staticClass:"count"},[t._v("\n "+t._s(t.lastHistoryRecord(e).uses)+"\n ")]):t._e()])})],2):t._e()]),t._v(" "),n("div",{staticClass:"search-result-footer text-center panel-footer faint"})])},[],!1,Zi,null,null).exports,eo=n(220),no=n(53);function io(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}function oo(t){for(var e=1;e0?n("span",{staticClass:"badge follow-request-count"},[t._v("\n "+t._s(t.followRequestCount)+"\n ")]):t._e()])],1):t._e(),t._v(" "),n("li",[n("router-link",{attrs:{to:{name:"about"}}},[n("i",{staticClass:"button-icon icon-info-circled"}),t._v(" "+t._s(t.$t("nav.about"))+"\n ")])],1)])])])},[],!1,gr,null,null).exports,br={data:function(){return{searchTerm:void 0,hidden:!0,error:!1,loading:!1}},watch:{$route:function(t){"search"===t.name&&(this.searchTerm=t.query.query)}},methods:{find:function(t){this.$router.push({name:"search",query:{query:t}}),this.$refs.searchInput.focus()},toggleHidden:function(){var t=this;this.hidden=!this.hidden,this.$emit("toggled",this.hidden),this.$nextTick(function(){t.hidden||t.$refs.searchInput.focus()})}}};var wr=function(t){n(533)},_r=Object(dn.a)(br,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("div",{staticClass:"search-bar-container"},[t.loading?n("i",{staticClass:"icon-spin4 finder-icon animate-spin-slow"}):t._e(),t._v(" "),t.hidden?n("a",{attrs:{href:"#",title:t.$t("nav.search")}},[n("i",{staticClass:"button-icon icon-search",on:{click:function(e){return e.preventDefault(),e.stopPropagation(),t.toggleHidden(e)}}})]):[n("input",{directives:[{name:"model",rawName:"v-model",value:t.searchTerm,expression:"searchTerm"}],ref:"searchInput",staticClass:"search-bar-input",attrs:{id:"search-bar-input",placeholder:t.$t("nav.search"),type:"text"},domProps:{value:t.searchTerm},on:{keyup:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.find(t.searchTerm)},input:function(e){e.target.composing||(t.searchTerm=e.target.value)}}}),t._v(" "),n("button",{staticClass:"btn search-button",on:{click:function(e){return t.find(t.searchTerm)}}},[n("i",{staticClass:"icon-search"})]),t._v(" "),n("i",{staticClass:"button-icon icon-cancel",on:{click:function(e){return e.preventDefault(),e.stopPropagation(),t.toggleHidden(e)}}})]],2)])},[],!1,wr,null,null).exports,xr=n(221),yr=n.n(xr);function kr(t){var e=t.$store.state.users.currentUser.credentials;e&&(t.usersToFollow.forEach(function(t){t.name="Loading..."}),w.c.suggestions({credentials:e}).then(function(e){!function(t,e){var n=this,i=yr()(e);t.usersToFollow.forEach(function(e,o){var r=i[o],s=r.avatar||n.$store.state.instance.defaultAvatar,a=r.acct;e.img=s,e.name=a,t.$store.state.api.backendInteractor.fetchUser({id:a}).then(function(n){n.error||(t.$store.commit("addNewUsers",[n]),e.id=n.id)})})}(t,e)}))}var Cr={data:function(){return{usersToFollow:[]}},computed:{user:function(){return this.$store.state.users.currentUser.screen_name},suggestionsEnabled:function(){return this.$store.state.instance.suggestionsEnabled}},methods:{userProfileLink:function(t,e){return Object(Rn.a)(t,e,this.$store.state.instance.restrictedNicknames)}},watch:{user:function(t,e){this.suggestionsEnabled&&kr(this)}},mounted:function(){var t=this;this.usersToFollow=new Array(3).fill().map(function(e){return{img:t.$store.state.instance.defaultAvatar,name:"",id:0}}),this.suggestionsEnabled&&kr(this)}};var Sr=function(t){n(535)},jr=Object(dn.a)(Cr,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"who-to-follow-panel"},[n("div",{staticClass:"panel panel-default base01-background"},[n("div",{staticClass:"panel-heading timeline-heading base02-background base04"},[n("div",{staticClass:"title"},[t._v("\n "+t._s(t.$t("who_to_follow.who_to_follow"))+"\n ")])]),t._v(" "),n("div",{staticClass:"who-to-follow"},[t._l(t.usersToFollow,function(e){return n("p",{key:e.id,staticClass:"who-to-follow-items"},[n("img",{attrs:{src:e.img}}),t._v(" "),n("router-link",{attrs:{to:t.userProfileLink(e.id,e.name)}},[t._v("\n "+t._s(e.name)+"\n ")]),n("br")],1)}),t._v(" "),n("p",{staticClass:"who-to-follow-more"},[n("router-link",{attrs:{to:{name:"who-to-follow"}}},[t._v("\n "+t._s(t.$t("who_to_follow.more"))+"\n ")])],1)],2)])])},[],!1,Sr,null,null).exports,Or={props:{isOpen:{type:Boolean,default:!0},noBackground:{type:Boolean,default:!1}},computed:{classes:function(){return{"modal-background":!this.noBackground,open:this.isOpen}}}};var Pr=function(t){n(542)},$r=Object(dn.a)(Or,function(){var t=this,e=t.$createElement;return(t._self._c||e)("div",{directives:[{name:"show",rawName:"v-show",value:t.isOpen,expression:"isOpen"},{name:"body-scroll-lock",rawName:"v-body-scroll-lock",value:t.isOpen&&!t.noBackground,expression:"isOpen && !noBackground"}],staticClass:"modal-view",class:t.classes,on:{click:function(e){return e.target!==e.currentTarget?null:t.$emit("backdropClicked")}}},[t._t("default")],2)},[],!1,Pr,null,null).exports;var Tr=function(t){n(544)};var Ir=function(t){n(546)};function Er(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var Mr={components:{Modal:$r,SettingsModalContent:function(t,e){var n=function(){return function(){return function(t){for(var e=1;e2&&void 0!==arguments[2]?arguments[2]:30,perpendicularTolerance:arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,_startPos:[0,0],_swiping:!1}},beginSwipe:function(t,e){e._startPos=Nr(t),e._swiping=!0},updateSwipe:function(t,e){if(e._swiping){var n,i,o=(n=e._startPos,[(i=Nr(t))[0]-n[0],i[1]-n[1]]);if(!(Rr(o)1},type:function(){return this.currentMedia?ie.a.fileType(this.currentMedia.mimetype):null}},created:function(){this.mediaSwipeGestureRight=zr.swipeGesture(zr.DIRECTION_RIGHT,this.goPrev,50),this.mediaSwipeGestureLeft=zr.swipeGesture(zr.DIRECTION_LEFT,this.goNext,50)},methods:{mediaTouchStart:function(t){zr.beginSwipe(t,this.mediaSwipeGestureRight),zr.beginSwipe(t,this.mediaSwipeGestureLeft)},mediaTouchMove:function(t){zr.updateSwipe(t,this.mediaSwipeGestureRight),zr.updateSwipe(t,this.mediaSwipeGestureLeft)},hide:function(){this.$store.dispatch("closeMediaViewer")},goPrev:function(){if(this.canNavigate){var t=0===this.currentIndex?this.media.length-1:this.currentIndex-1;this.$store.dispatch("setCurrent",this.media[t])}},goNext:function(){if(this.canNavigate){var t=this.currentIndex===this.media.length-1?0:this.currentIndex+1;this.$store.dispatch("setCurrent",this.media[t])}},handleKeyupEvent:function(t){this.showing&&27===t.keyCode&&this.hide()},handleKeydownEvent:function(t){this.showing&&(39===t.keyCode?this.goNext():37===t.keyCode&&this.goPrev())}},mounted:function(){window.addEventListener("popstate",this.hide),document.addEventListener("keyup",this.handleKeyupEvent),document.addEventListener("keydown",this.handleKeydownEvent)},destroyed:function(){window.removeEventListener("popstate",this.hide),document.removeEventListener("keyup",this.handleKeyupEvent),document.removeEventListener("keydown",this.handleKeydownEvent)}};var qr=function(t){n(548)},Wr=Object(dn.a)(Hr,function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.showing?n("Modal",{staticClass:"media-modal-view",on:{backdropClicked:t.hide}},["image"===t.type?n("img",{staticClass:"modal-image",attrs:{src:t.currentMedia.url,alt:t.currentMedia.description,title:t.currentMedia.description},on:{touchstart:function(e){return e.stopPropagation(),t.mediaTouchStart(e)},touchmove:function(e){return e.stopPropagation(),t.mediaTouchMove(e)},click:t.hide}}):t._e(),t._v(" "),"video"===t.type?n("VideoAttachment",{staticClass:"modal-image",attrs:{attachment:t.currentMedia,controls:!0}}):t._e(),t._v(" "),"audio"===t.type?n("audio",{staticClass:"modal-image",attrs:{src:t.currentMedia.url,alt:t.currentMedia.description,title:t.currentMedia.description,controls:""}}):t._e(),t._v(" "),t.canNavigate?n("button",{staticClass:"modal-view-button-arrow modal-view-button-arrow--prev",attrs:{title:t.$t("media_modal.previous")},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.goPrev(e)}}},[n("i",{staticClass:"icon-left-open arrow-icon"})]):t._e(),t._v(" "),t.canNavigate?n("button",{staticClass:"modal-view-button-arrow modal-view-button-arrow--next",attrs:{title:t.$t("media_modal.next")},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.goNext(e)}}},[n("i",{staticClass:"icon-right-open arrow-icon"})]):t._e()],1):t._e()},[],!1,qr,null,null).exports;function Vr(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var Gr={props:["logout"],data:function(){return{closed:!0,closeGesture:void 0}},created:function(){this.closeGesture=zr.swipeGesture(zr.DIRECTION_LEFT,this.toggleDrawer),this.currentUser&&this.currentUser.locked&&this.$store.dispatch("startFetchingFollowRequests")},components:{UserCard:Dn.a},computed:function(t){for(var e=1;e0?n("span",{staticClass:"badge follow-request-count"},[t._v("\n "+t._s(t.followRequestCount)+"\n ")]):t._e()])],1):t._e(),t._v(" "),t.chat?n("li",{on:{click:t.toggleDrawer}},[n("router-link",{attrs:{to:{name:"chat"}}},[n("i",{staticClass:"button-icon icon-chat"}),t._v(" "+t._s(t.$t("nav.chat"))+"\n ")])],1):t._e()]):t._e(),t._v(" "),n("ul",[t.currentUser||!t.privateMode?n("li",{on:{click:t.toggleDrawer}},[n("router-link",{attrs:{to:{name:"search"}}},[n("i",{staticClass:"button-icon icon-search"}),t._v(" "+t._s(t.$t("nav.search"))+"\n ")])],1):t._e(),t._v(" "),t.currentUser&&t.suggestionsEnabled?n("li",{on:{click:t.toggleDrawer}},[n("router-link",{attrs:{to:{name:"who-to-follow"}}},[n("i",{staticClass:"button-icon icon-user-plus"}),t._v(" "+t._s(t.$t("nav.who_to_follow"))+"\n ")])],1):t._e(),t._v(" "),n("li",{on:{click:t.toggleDrawer}},[n("a",{attrs:{href:"#"},on:{click:t.openSettingsModal}},[n("i",{staticClass:"button-icon icon-cog"}),t._v(" "+t._s(t.$t("settings.settings"))+"\n ")])]),t._v(" "),n("li",{on:{click:t.toggleDrawer}},[n("router-link",{attrs:{to:{name:"about"}}},[n("i",{staticClass:"button-icon icon-info-circled"}),t._v(" "+t._s(t.$t("nav.about"))+"\n ")])],1),t._v(" "),t.currentUser&&"admin"===t.currentUser.role?n("li",{on:{click:t.toggleDrawer}},[n("a",{attrs:{href:"/pleroma/admin/#/login-pleroma",target:"_blank"}},[n("i",{staticClass:"button-icon icon-gauge"}),t._v(" "+t._s(t.$t("nav.administration"))+"\n ")])]):t._e(),t._v(" "),t.currentUser?n("li",{on:{click:t.toggleDrawer}},[n("a",{attrs:{href:"#"},on:{click:t.doLogout}},[n("i",{staticClass:"button-icon icon-logout"}),t._v(" "+t._s(t.$t("login.logout"))+"\n ")])]):t._e()])]),t._v(" "),n("div",{staticClass:"side-drawer-click-outside",class:{"side-drawer-click-outside-closed":t.closed},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.toggleDrawer(e)}}})])},[],!1,Kr,null,null).exports,Jr=n(41),Xr=n.n(Jr),Qr=new Set(["chats","chat"]),Zr={data:function(){return{hidden:!1,scrollingDown:!1,inputActive:!1,oldScrollPos:0,amountScrolled:0}},created:function(){this.autohideFloatingPostButton&&this.activateFloatingPostButtonAutohide(),window.addEventListener("resize",this.handleOSK)},destroyed:function(){this.autohideFloatingPostButton&&this.deactivateFloatingPostButtonAutohide(),window.removeEventListener("resize",this.handleOSK)},computed:{isLoggedIn:function(){return!!this.$store.state.users.currentUser},isHidden:function(){return!!Qr.has(this.$route.name)||this.autohideFloatingPostButton&&(this.hidden||this.inputActive)},autohideFloatingPostButton:function(){return!!this.$store.getters.mergedConfig.autohideFloatingPostButton}},watch:{autohideFloatingPostButton:function(t){t?this.activateFloatingPostButtonAutohide():this.deactivateFloatingPostButtonAutohide()}},methods:{activateFloatingPostButtonAutohide:function(){window.addEventListener("scroll",this.handleScrollStart),window.addEventListener("scroll",this.handleScrollEnd)},deactivateFloatingPostButtonAutohide:function(){window.removeEventListener("scroll",this.handleScrollStart),window.removeEventListener("scroll",this.handleScrollEnd)},openPostForm:function(){this.$store.dispatch("openPostStatusModal")},handleOSK:function(){var t=window.innerWidth<350,e=t&&window.innerHeight<345,n=!t&&window.innerWidth<450&&window.innerHeight<560;this.inputActive=!(!e&&!n)},handleScrollStart:Xr()(function(){window.scrollY>this.oldScrollPos?this.hidden=!0:this.hidden=!1,this.oldScrollPos=window.scrollY},100,{leading:!0,trailing:!1}),handleScrollEnd:Xr()(function(){this.hidden=!1,this.oldScrollPos=window.scrollY},100,{leading:!1,trailing:!0})}};var ts=function(t){n(552)},es=Object(dn.a)(Zr,function(){var t=this.$createElement,e=this._self._c||t;return this.isLoggedIn?e("div",[e("button",{staticClass:"new-status-button",class:{hidden:this.isHidden},on:{click:this.openPostForm}},[e("i",{staticClass:"icon-edit"})])]):this._e()},[],!1,ts,null,null).exports;function ns(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var is={components:{SideDrawer:Yr,Notifications:Gn},data:function(){return{notificationsCloseGesture:void 0,notificationsOpen:!1}},created:function(){this.notificationsCloseGesture=zr.swipeGesture(zr.DIRECTION_RIGHT,this.closeMobileNotifications,50)},computed:function(t){for(var e=1;e=e.scrollHeight&&this.$refs.notifications.fetchOlderNotifications()}},watch:{$route:function(){this.closeMobileNotifications()}}};var os=function(t){n(554)},rs=Object(dn.a)(is,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",[n("nav",{staticClass:"nav-bar container",class:{"mobile-hidden":t.isChat},attrs:{id:"nav"}},[n("div",{staticClass:"mobile-inner-nav",on:{click:function(e){return t.scrollToTop()}}},[n("div",{staticClass:"item"},[n("a",{staticClass:"mobile-nav-button",attrs:{href:"#"},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.toggleMobileSidebar()}}},[n("i",{staticClass:"button-icon icon-menu"}),t._v(" "),t.unreadChatCount?n("div",{staticClass:"alert-dot"}):t._e()]),t._v(" "),t.hideSitename?t._e():n("router-link",{staticClass:"site-name",attrs:{to:{name:"root"},"active-class":"home"}},[t._v("\n "+t._s(t.sitename)+"\n ")])],1),t._v(" "),n("div",{staticClass:"item right"},[t.currentUser?n("a",{staticClass:"mobile-nav-button",attrs:{href:"#"},on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.openMobileNotifications()}}},[n("i",{staticClass:"button-icon icon-bell-alt"}),t._v(" "),t.unseenNotificationsCount?n("div",{staticClass:"alert-dot"}):t._e()]):t._e()])])]),t._v(" "),t.currentUser?n("div",{staticClass:"mobile-notifications-drawer",class:{closed:!t.notificationsOpen},on:{touchstart:function(e){return e.stopPropagation(),t.notificationsTouchStart(e)},touchmove:function(e){return e.stopPropagation(),t.notificationsTouchMove(e)}}},[n("div",{staticClass:"mobile-notifications-header"},[n("span",{staticClass:"title"},[t._v(t._s(t.$t("notifications.notifications")))]),t._v(" "),n("a",{staticClass:"mobile-nav-button",on:{click:function(e){return e.stopPropagation(),e.preventDefault(),t.closeMobileNotifications()}}},[n("i",{staticClass:"button-icon icon-cancel"})])]),t._v(" "),n("div",{staticClass:"mobile-notifications",on:{scroll:t.onScroll}},[n("Notifications",{ref:"notifications",attrs:{"no-heading":!0}})],1)]):t._e(),t._v(" "),n("SideDrawer",{ref:"sideDrawer",attrs:{logout:t.logout}})],1)},[],!1,os,null,null).exports,ss=n(54);function as(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,i)}return n}var cs={components:{Status:sn.default,List:pi.a,Checkbox:ss.a,Modal:$r},data:function(){return{comment:"",forward:!1,statusIdsToReport:[],processing:!1,error:!1}},computed:{isLoggedIn:function(){return!!this.$store.state.users.currentUser},isOpen:function(){return this.isLoggedIn&&this.$store.state.reports.modalActivated},userId:function(){return this.$store.state.reports.userId},user:function(){return this.$store.getters.findUser(this.userId)},remoteInstance:function(){return!this.user.is_local&&this.user.screen_name.substr(this.user.screen_name.indexOf("@")+1)},statuses:function(){return this.$store.state.reports.statuses}},watch:{userId:"resetState"},methods:{resetState:function(){this.comment="",this.forward=!1,this.statusIdsToReport=[],this.processing=!1,this.error=!1},closeModal:function(){this.$store.dispatch("closeUserReportingModal")},reportUser:function(){var t=this;this.processing=!0,this.error=!1;var e={userId:this.userId,comment:this.comment,forward:this.forward,statusIds:this.statusIdsToReport};this.$store.state.api.backendInteractor.reportUser(function(t){for(var e=1;e